Определение количества витков резьбового соединения с трапецеидальной резьбой, воспринимающего осевую сжимающую нагрузку

Анализ математической модели резьбового соединения с трапецеидальной резьбой. Разработка программы, выполняющей вычисление необходимого количества витков для восприятия осевой сжимающей нагрузки. Алгоритм проведения верификации. Инструкция пользователя.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 19.01.2016
Размер файла 1,2 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Файл не выбран
РћР±Р·РѕСЂ

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

{

d.K[i, j] = d.K[i, j] * (dx * dy / 2);

}

}

listKLOC.Add(d);

#endregion

#region Заполнение глобальной матрицы жесткости

double[,] KGlob = new double[2 * (alluzk), 2 * (alluzk)];

int key = 0;

key = 0;

while (key < listKLOC.Count)

{

for (int ii = 0; ii < 3; ii++)

for (int jj = 0; jj < 3; jj++)

{

for (int iii = 0; iii < 2; iii++)

for (int jjj = 0; jjj < 2; jjj++)

KGlob[2 * listGI[key].ind[ii] + iii, 2 * listGI[key].ind[jj] + jjj] += listKLOC[key].K[2 * ii + iii, 2 * jj + jjj];

}

key++;

}

List<globindexes> gli = new List<globindexes>();

s = "";

for (int i = 0; i < list_coord_rez.Count; i++)

{

if (list_coord_rez[i].x1 == 0)

{ gli.Add(listGI[i]); }

}

#region Если вдруг понадобится закрепить только головку болта

/*int z=gli.Count;

while(gli.Count!=z-8)

gli.RemoveAt(0);

z = gli.Count;

while (gli.Count != z - 8)

gli.RemoveAt(gli.Count-1);*/

#endregion

#region Учет закрепленных узлов

for (int j = 0; j < gli.Count; j += 2)

for (int i = 0; i < 2 * (alluzk); i++)

{

KGlob[gli[j].ind[0]*2, i] = 0;

KGlob[gli[j].ind[0]*2 + 1, i] = 0;

KGlob[i, gli[j].ind[0]*2] = 0;

KGlob[i, gli[j].ind[0]*2 + 1] = 0;

}

for (int i = 0; i < 2 * (alluzk); i++)

{

KGlob[0, i] = 0;

KGlob[1, i] = 0;

KGlob[i, 0] = 0;

KGlob[i, 1] = 0;

KGlob[(alluzk-c_in3)*2, i] = 0;

KGlob[(alluzk - c_in3)*2+1, i] = 0;

KGlob[i, (alluzk - c_in3)*2] = 0;

KGlob[i, (alluzk - c_in3)*2+1] = 0;

}

KGlob[0, 0] = 1;

KGlob[1, 1] = 1;

KGlob[(alluzk - c_in3) * 2, (alluzk - c_in3) * 2] = 1;

KGlob[(alluzk - c_in3) * 2 + 1, (alluzk - c_in3) * 2 + 1] = 1;

for (int j = 0; j < gli.Count; j += 2)

{

KGlob[gli[j].ind[0]*2, gli[j].ind[0]*2] = 1;

KGlob[gli[j].ind[0]*2+ 1, gli[j].ind[0]*2 + 1] = 1;

}

#endregion

#endregion

double[] force = new double[2 * alluzk];

int[] mass = new int[coord_do.Count];

if (this.radioButton1.Checked)

{

#region Задание вектора нагрузки

int ind1 = 11;

int ind2 = alluzk - ind1 - 1;

#region Разбиение распределенной нагрузки на узлы гайки

double full_f = double.Parse(textBox9.Text);

double uz_f = full_f / ((c_in3 - 11) * 2);

for (int i = ind1; i < c_in3; i++)

{

force[2 * i] = -uz_f;

}

for (int i = ind2; i < alluzk; i++)

{

force[2 * i] = -uz_f;

}

#endregion

#endregion

}

else

{

#region Задание вектора нагрузки

double maxx = 0;

for (int i = 0; i < coord_do.Count; i++)

{

if (coord_do[i].c == Color.Red)

{

if (maxx < coord_do[i].x1)

{ maxx = coord_do[i].x1; }

if (maxx < coord_do[i].x2)

{ maxx = coord_do[i].x2; }

if (maxx < coord_do[i].x3)

{ maxx = coord_do[i].x3; }

}

}

int iii = 0;

double full_f = double.Parse(textBox9.Text);

double uz_f = full_f / 16;

for (int i = 0; i < coord_do.Count; i++)

{

if (coord_do[i].c == Color.Red)

{

if (Math.Abs(coord_do[i].x1 - maxx) < 0.001)

{

if (mass[listGI[i].ind[0]] == 0)

{

force[listGI[i].ind[0] * 2] = -uz_f;

mass[listGI[i].ind[0]] = 1;

iii++;

}

}

if (Math.Abs(coord_do[i].x2 - maxx) < 0.001)

{

if (mass[listGI[i].ind[1]] == 0)

{

force[listGI[i].ind[1] * 2] = -uz_f;

mass[listGI[i].ind[1]] = 1;

iii++;

}

}

if (Math.Abs(coord_do[i].x3 - maxx) < 0.001)

{

if (mass[listGI[i].ind[2]] == 0)

{

force[listGI[i].ind[2] * 2] = -uz_f;

mass[listGI[i].ind[2]] = 1;

iii++;

}

}

}

}

#endregion

}

#region Решение СЛАУ (нахождение перемещений узлов)

Solution = new GausMethod(2 * alluzk);

//заполняем правую часть

for (int i = 0; i < 2 * alluzk; i++)

Solution.RightPart[i] = force[i];

//заполняем матрицу

for (int i = 0; i < 2 * alluzk; i++)

for (int j = 0; j < 2 * alluzk; j++)

Solution.Matrix[i, j] = KGlob[i, j];

//решаем матрицу

Solution.SolveMatrix();

#endregion

#region Изменение координат узлов

for (int i = 0; i < list_coord_rez.Count; i++)

{

list_coord_rez[i].x1+=Solution.Answer[listGI[i].ind[0]*2];

list_coord_rez[i].y1 += Solution.Answer[listGI[i].ind[0] * 2+1];

list_coord_rez[i].x2 += Solution.Answer[listGI[i].ind[1] * 2];

list_coord_rez[i].y2 += Solution.Answer[listGI[i].ind[1] * 2 + 1];

list_coord_rez[i].x3 += Solution.Answer[listGI[i].ind[2] * 2];

list_coord_rez[i].y3 += Solution.Answer[listGI[i].ind[2] * 2 + 1];

}

#endregion

sm = max(Solution.Answer);

max_in_all(Solution.Answer);

max2(Solution.Answer);

Rezba.count_v++;

}

if (sm > Rezba.eps)

{

MessageBox.Show("Длина болта слишком мала. Что бы болт мог выдержать нагрузку измените параметры.");

}

else

{

MessageBox.Show("Расчет закончен. Для воспринятия нагрузки болт должен иметь:" + (Rezba.count_v-1) + " витков.");

StreamWriter strw = new StreamWriter("smesch_x.txt",false);

for (int i = 0; i < coord_do.Count; i++)

if (coord_do[i].c != Color.Black)

{

strw.WriteLine("" + Solution.Answer[listGI[i].ind[0] * 2]);

strw.WriteLine("" + Solution.Answer[listGI[i].ind[1] * 2]);

strw.WriteLine("" + Solution.Answer[listGI[i].ind[2] * 2]);

}

strw.Close();

strw = new StreamWriter("smesch_y.txt", false);

for (int i = 0; i < coord_do.Count; i++)

if (coord_do[i].c != Color.Black)

{

strw.WriteLine("" + Solution.Answer[listGI[i].ind[0] * 2+1]);

strw.WriteLine("" + Solution.Answer[listGI[i].ind[1] * 2+1]);

strw.WriteLine("" + Solution.Answer[listGI[i].ind[2] * 2+1]);

}

strw.Close();

button3.Visible = true;

button2.Visible = true;

}

MessageBox.Show("Максимальное абсолютное откланение " + sm);

}

private void button2_Click(object sender, EventArgs e)

{

Form2 f = new Form2(coord_do, listGI);

f.ShowDialog();

}

private void button3_Click(object sender, EventArgs e)

{

Form2 form = new Form2(list_coord_rez, listGI);

form.ShowDialog();

}

private void Form1_Load(object sender, EventArgs e)

{

}

}

}

Form2.cs

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Threading;

using System.Text;

using System.Windows.Forms;

namespace WindowsFormsApplication1

{

public partial class Form2 : Form

{

List<Uzl_Coord> l = new List<Uzl_Coord>();

List<globindexes> u = new List<globindexes>();

double maxx = 0;

double maxy = 0;

double minx = double.MaxValue, miny = double.MaxValue;

int indminx = 0, indmaxx = 0, indminy = 0, indmaxy = 0;

public Form2(List<Uzl_Coord> lc,List<globindexes>uz)

{

InitializeComponent();

l = lc;

u = uz;

for (int i = 0; i < lc.Count; i++)

{

if (lc[i].c != Color.Black)

{

if (maxx < lc[i].x1)

{ maxx = lc[i].x1; indmaxx = i; }

if (maxx < lc[i].x2)

{ maxx = lc[i].x2; indmaxx = i; }

if (maxx < lc[i].x3)

{ maxx = lc[i].x3; indmaxx = i; }

if (maxy < lc[i].y1)

{ maxy = lc[i].y1; indmaxy = i; }

if (maxy < lc[i].y2)

{ maxy = lc[i].y2; indmaxy = i; }

if (maxy < lc[i].y3)

{ maxy = lc[i].y3; indmaxy = i; }

if (minx > lc[i].x1)

{ minx = lc[i].x1; indminx = i; }

if (minx > lc[i].x2)

{ minx = lc[i].x2; indminx = i; }

if (minx > lc[i].x3)

{ minx = lc[i].x3; indminx = i; }

if (miny > lc[i].y1)

{ miny = lc[i].y1; indminy = i; }

if (miny > lc[i].y2)

{ miny = lc[i].y2; indminy = i; }

if (miny > lc[i].y3)

{ miny = lc[i].y3; indminy = i; }

}

}

this.Click += new EventHandler(Form2_Click);

this.Width = (int)(maxx-minx+2)*20+40;

this.Height = (int)(maxy-miny+2)*20+40 ;

MessageBox.Show(maxx+" "+maxy);

}

void Form2_Click(object sender, EventArgs e)

{

Graphics g = this.CreateGraphics();

Pen p = new Pen(Color.Black, 1);

SolidBrush br;

for (int i = 0; i < u.Count; i++)

if(l[i].c!=Color.Black){

br = new SolidBrush(l[i].c);

Point pnt1 = new Point((int)(l[i].x1 * 20 +20+ Math.Abs(minx)*20), this.Height - 55 - (int)((l[i].y1 * 20) - miny*20));

Point pnt2 = new Point((int)(l[i].x2 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (int)((l[i].y2 * 20) - miny * 20));

Point pnt3 = new Point((int)(l[i].x3 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (int)((l[i].y3 * 20) - miny * 20));

Point[] arrp = { pnt1, pnt2, pnt3 };

g.FillPolygon(br, arrp);

g.DrawLine(p, (float)(l[i].x1 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y1 * 20 - miny * 20), (float)(l[i].x2 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y2 * 20 - miny * 20));

g.DrawLine(p, (float)(l[i].x1 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y1 * 20 - miny * 20), (float)(l[i].x3 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y3 * 20 - miny * 20));

g.DrawLine(p, (float)(l[i].x3 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y3 * 20 - miny * 20), (float)(l[i].x2 * 20 + 20 + Math.Abs(minx) * 20), this.Height - 55 - (float)(l[i].y2 * 20 - miny * 20));

Class1.cs

using System;

using System.Collections.Generic;

using System.Text;

using System.Drawing;

namespace WindowsFormsApplication1

{

class Rezba

{

static public double D;//диаметр шляпки

static public double b;//ширина шляпки

static public double l;//длина конца болта

static public double d1;//внутренний диаметр

static public double d2;//средний диаметр

static public double d3;//внешний диаметр

static public double bg;//ширина гайки

static public double lg;//длина гайки

static public double p;//шаг резьбы

static public double H;//рабочая высота

static public int count_v;//кол-во витков

static public double eps;//точность

}

public class Uzl_Coord

{

public double x1;

public double x2;

public double x3;

public double y1;

public double y2;

public double y3;

public Color c;

}

class matrAclass

{

public double[,] A;

}

class matrKLOCclass

{

public double[,] K;

}

public class globindexes

{

public int[] ind;

}

//// Метод Гаусса ////

class GausMethod

{

public int RowCount;

public int ColumCount;

public double[,] Matrix;

public double[] RightPart;

public double[] Answer;

public GausMethod(int count)

{

RightPart = new double[count];

Answer = new double[count];

Matrix = new double[count, count];

RowCount = count;

ColumCount = count;

//обнулим массив

for (int i = 0; i < count; i++)

{

Answer[i] = 0;

RightPart[i] = 0;

for (int j = 0; j < count; j++)

Matrix[i, j] = 0;

}

}

private void SortRows(int SortIndex)

{

double MaxElement = Matrix[SortIndex, SortIndex];

int MaxElementIndex = SortIndex;

for (int i = SortIndex + 1; i < RowCount; i++)

{

if (Matrix[i, SortIndex] > MaxElement)

{

MaxElement = Matrix[i, SortIndex];

MaxElementIndex = i;

}

}

//теперь найден максимальный элемент ставим его на верхнее место

if (MaxElementIndex > SortIndex)//если это не первый элемент

{

double Temp;

Temp = RightPart[MaxElementIndex];

RightPart[MaxElementIndex] = RightPart[SortIndex];

RightPart[SortIndex] = Temp;

for (int i = 0; i < ColumCount; i++)

{

Temp = Matrix[MaxElementIndex, i];

Matrix[MaxElementIndex, i] = Matrix[SortIndex, i];

Matrix[SortIndex, i] = Temp;

}

}

}

public int SolveMatrix()

{

if (RowCount != ColumCount)

return 1; //нет решения

for (int i = 0; i < RowCount - 1; i++)

{

SortRows(i);

for (int j = i + 1; j < RowCount; j++)

{

if (Matrix[i, i] != 0) //если главный элемент не 0, то производим вычисления

{

double MultElement = Matrix[j, i] / Matrix[i, i];

for (int k = i; k < ColumCount; k++)

Matrix[j, k] -= Matrix[i, k] * MultElement;

RightPart[j] -= RightPart[i] * MultElement;

}

//для нулевого главного элемента просто пропускаем данный шаг

}

}

//ищем решение

for (int i = (int)(RowCount - 1); i >= 0; i--)

{

Answer[i] = RightPart[i];

for (int j = (int)(RowCount - 1); j > i; j--)

Answer[i] -= Matrix[i, j] * Answer[j];

if (Matrix[i, i] == 0)

if (RightPart[i] == 0)

return 2; //множество решений

else

return 1; //нет решения

Answer[i] /= Matrix[i, i];

}

return 0;

}

public override String ToString()

{

String S = "";

for (int i = 0; i < RowCount; i++)

{

S += "\r\n";

for (int j = 0; j < ColumCount; j++)

{

S += Matrix[i, j].ToString("F04") + "\t";

}

S += "\t" + Answer[i].ToString("F08");

S += "\t" + RightPart[i].ToString("F04");

}

return S;

}

}

}

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.