Определение количества витков резьбового соединения с трапецеидальной резьбой, воспринимающего осевую сжимающую нагрузку
Анализ математической модели резьбового соединения с трапецеидальной резьбой. Разработка программы, выполняющей вычисление необходимого количества витков для восприятия осевой сжимающей нагрузки. Алгоритм проведения верификации. Инструкция пользователя.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 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
Подобные документы
Структура математической модели линейной задачи, алгоритм симплекс-метода. Разработка программы: выбор языка программирования, входные и выходные данные, пользовательский интерфейс. Описание программы по листингу, тестирование, инструкция по применению.
курсовая работа [1,2 M], добавлен 31.05.2013Описание математической модели, таблицы истинности. Разработка программы, реализация защитного программирования. Отладка и тестирование программы, инструкция пользователя. Расчет затрат на разработку и коммерческой эффективности проекта от реализации.
дипломная работа [3,2 M], добавлен 18.06.2012Разработка алгоритма и программы "Расчет стыкового паяного соединения" в среде Microsoft Visual Studio для облегчения расчётов сварных швов. Создание главной формы приложения и его кодирование для расчёта углового шва. Тестирование программы на ошибки.
курсовая работа [1,5 M], добавлен 06.02.2013Разработка программы проверки знаний для тестирования студентов по программированию с кодом на языке Delphi. Проектирование визуального интерфейса и словесный алгоритм работы программы. Алгоритмы разработанных процедур и функций, инструкция пользователя.
курсовая работа [506,5 K], добавлен 21.02.2011Определение количества закупаемого сырья на выпуск продукции по месяцам, в течении года и за год в целом. Алгоритм необходимых действий, представление результатов в графическом виде. Решение задачи в табличном процессоре Excel и с помощью средств VBA.
курсовая работа [2,1 M], добавлен 13.02.2010Разработка математической модели системы. Моделирование работы конвейера сборочного цеха в течении 8 часов. Определение вероятности пропуска секции. Расчет количества скомплектованных изделий за 8 часов. Исследование системы на имитационной модели.
контрольная работа [98,3 K], добавлен 24.09.2014Создание имитационной модели работы госпиталя при поступлении потерпевших от катастрофы. Определение среднего времени пребывания пациентов в госпитале и необходимого количества мест в палатах. Разработка программы на языке GPSS, ее листинг и тестирование.
контрольная работа [1,1 M], добавлен 26.11.2013Обзор области генерации сетевого трафика. Описание выбранных методов, моделей, алгоритмов решения задач. Создание модели поведения пользователя, распределение количества посещённых страниц сайта. Выбор средств реализации программного продукта (проекта).
курсовая работа [1,3 M], добавлен 30.06.2017Основные подходы к математическому моделированию физических систем: понятие и основные этапы данного процесса, требования к нему. Численные методы расчета. Программная постановка задачи, реализованная на языке C#. Верификация, вычислительный эксперимент.
курсовая работа [750,1 K], добавлен 29.11.2013Изучение особенностей проектирования прикладных программ с помощь средств Visual Studio 2010 на языке C#. Расчет конического соединения, конусного градиента, усилия для разрыва соединения и требуемой силы сжатия. Реализация и тестирование программы.
курсовая работа [1,7 M], добавлен 19.02.2013