Значение
действующей силы, Н
|
Максимальное
перемещение, м
|
|
Решение
в Ansys
|
Решение
в С#
|
расхождение
с решением, Ansys%
|
|
X
|
Y
|
X
|
Y
|
|
1*108
|
0.15770E-02
|
0.12269E-01
|
0.14823E-02
|
0.1153E-01
|
6
|
3*108
|
0.66400E-05
|
0.98894E-06
|
0.62391E-05
|
0.92994E-06
|
6
|
1*108
|
0.18487E-02
|
0.16232E-03
|
0.17993E-02
|
0.15429E-03
|
6
|
По приведённым в таблице 3.2.1 результатам
заметно, что решение при малом количестве элементов имеет большую погрешность,
но при увеличении количества конечных элементов погрешность заметно
сокращается.
Из приведенных выше результатов видно, что
погрешность действительно составляет до 10%. Из графического анализа
результатов (приложения В,Г) видно, что погрешности соизмеримы во всех узлах.
Заключение
В данном курсовом проекте было создано приложение
позволяющего оценить поведение резьбового соединения (с резьбой Эдисона) при
воздействии изгибающей нагрузки. Вычислительная часть реализована с помощью метода
конечных элементов, с конечными элементами, представляющими собой линейный
треугольный элемент. Данный
выбор обусловлен относительной простотой вычислений и необходимостью
производить максимально-точную аппроксимацию границ изделия. А конечный элемент
позволяет более точно построить разбиение на сетку в круглых областях резьбы. В
качестве исходных данных программа принимает характеристики материалов и
приложенную силу и определяет допустимость нагрузки по средствам анализа
максимального отклонения точек по отношению к первоначальному положению.
В целях обеспечения адекватности стабильности работы была
протестирована и все результаты предоставлены и сопоставлены с работой в системе ANSYS, принятой в качестве
стандарта используемого при решении подобных задач. Все данные приведены в главе «Верификация
и проведение вычислительного эксперимента».
Таким образом, данную программу можно применять при расчётах допустимых
изгибающих нагрузок в деталях использующих резьбу Эдисона.
Список использованных источников
1. Зенкевич О. Метод конечных элементов в
технике. -М.: Мир, 1975. - 318 с.
2. Зенкевич О., Чанг И. Метод
конечных элементов теории сооружений и в механике сплошных сред. - М.: Недра,
1974. - 240 с.
. Сегерлинд Л. Применение метода
конечных элементов. - М.:Мир, 1979. -392 с.
. Википедия, свободная
энциклопедия. Автор: Д. Уэйлс и Л. Сэнгер. http://ru.wikipedia.org
. Самарский А.А.: Введение в
численные методы. - М.:Мир, 1982. -269 с
Приложение
Исходный код программы на языке C#
using System;System.Collections.Generic;System.ComponentModel;System.Data;System.Drawing;System.Linq;System.Text;System.Windows.Forms;System.Drawing.Drawing2D;
KursachKSKER
{partial class Form1: Form
{G, //модуль Юнга; //коэффициент ПуассонаmaxX = 0;maxY
= 0;KolUsel;[,] E;[,] AA;[,] BB;[,] Q;usel=43;key = false;[,] K = {
{1,1,1,1,1,1},
{1,1,1,1,1,1},
{1,1,1,1,1,1},
{1,1,1,1,1,1},
{1,1,1,1,1,1},
{1,1,1,1,1,1}
};[,] gK;void formMatrixQ()
{= new double[3, 6];[0, 1] = 1;[1, 5] = 1;[2, 2]
= 1;[2, 4] = 1;
}void formMatrixA(double x0, double y0, double
x1, double y1, double x2, double y2)
{= new double[6, 6];[0, 0] = 1; AA[0, 1] = x0;
AA[0, 2] = y0;[1, 3] = 1; AA[1, 4] = x0; AA[1, 5] = y0;[2, 0] = 1; AA[2, 1] =
x1; AA[2, 2] = y1;[3, 3] = 1; AA[3, 4] = x1; AA[3, 5] = y1;[4, 0] = 1; AA[4, 1]
= x2; AA[4, 2] = y2;[5, 3] = 1; AA[5, 4] = x2; AA[5, 5] = y2;
}
void formMatrixE()
{kaf = G / (1 - my * my);= new double[3, 3];[0,
0] = kaf * 1;[0, 1] = kaf * my;[0, 2] = 0;[1, 0] = kaf * my;[1, 1] = kaf *
1;[1, 2] = 0;[2, 0] = 0;[2, 1] = 0;[2, 2] = kaf * (1 - my) / 2;
}
double GetLenAB(double x0, double y0, double x1,
double y1)
{Math.Sqrt(Math.Pow(x1 - x0, 2) + Math.Pow(y1 -
y0, 2));
}
t = 0;pole;[] KG;ugol;A = 0, B = 0, R = 0;
double d, d1;//диаметрыN;//кол-во витков
int pix;[] niz_numers1;[] niz_numers2;nom = 0;[]
bok_numers1;[] bok_numers2;[] bok_numers3;[] bok_numers4;[] bok_numers5;
[] bok_numers1L;[] bok_numers3L;[] bok_numers4L;
nomer_treug = 0;koord=1;koordX = 350;Form1()
{();.MouseWheel += new MouseEventHandler(wheel);=
panel1.CreateGraphics();
}void wheel(object sender, MouseEventArgs e)
{
{(key)
{.Value += e.Delta / 20;_Click(sender, new
EventArgs());
}
{.Stop();= koord + e.Delta / 20;.Start();
}
}(Exception) { }
}void button1_Click(object sender, EventArgs e)
{=
double.Parse(textBox9.Text.ToString());=
double.Parse(textBox10.Text.ToString());= (double)numericUpDown3.Value*2;=
(int)numericUpDown4.Value;= Convert.ToDouble(textBox1.Text);= d+d1*2;= (d -
d1)/4;= N * R;_Web();= 1;.Refresh();
}
void
Global_Web()
{kol =
(int)(360 / ugol);
_numers1
= new int[kol / 4 + 1];_numers2 = new int[kol / 4 + 1];
_numers1
= new int[kol / 4 + 1];_numers2 = new int[kol / 4 + 1];_numers3 = new int[kol /
4 + 1];_numers4 = new int[kol / 4 + 1];_numers5 = new int[kol / 4 + 1];
_numers4L
= new int[kol / 4 + 1];_numers3L = new int[kol / 4 + 1];_numers1L = new int[kol
/ 4 + 1];
//c_rig_numers
= new int[5];
dl =
kol / 4 + 1;
nomerUzla
= 0;_treug = 0;= new KElement[50000];Rx=R, Ry=R;dr = d1 + d - R;
(Rx,
d1 + Ry, 1, ref nomerUzla, ref nomer_treug,
1);.Reverse(bok_numers1);.Reverse(niz_numers1);
.Copy(bok_numers4,
bok_numers4L, dl);.Copy(bok_numers3, bok_numers3L, dl);.Copy(bok_numers1,
bok_numers1L, dl);(Rx, dr, 3, ref nomerUzla, ref nomer_treug,
2);.Reverse(bok_numers2);= Rx + R * 2;m = 2;n=1;(int i = 1; i < N; i++)
{(Rx,
d1 + Ry, 2, ref nomerUzla, ref nomer_treug, m);
.Reverse(niz_numers1);.Copy(bok_numers2,
bok_numers1L, dl);.Copy(bok_numers5, bok_numers4L, dl);
.Reverse(bok_numers1);//верх.Copy(bok_numers4, bok_numers4L,
dl);.Copy(bok_numers3, bok_numers3L, dl);.Copy(bok_numers1, bok_numers1L, dl);
(i% 2
== 0)
{ m =
2; n = 1; }
{ m =
1; n = 2; }
= Rx +
R * 2;
}=
nomerUzla;
}
void
setka(double x0, double y0, int zona, ref int n, ref int nomer_treug,int
material)
{n_spec
= 0;nx_xspec = 0;doopX = 0, doopY = 0;Num_nach = n+1;n0 = n;++;r = R;cr = x0;r1
= R/2;kol = (int)(360 / ugol);
foorMid
= 0;ii1 = 0; int ii2 = 0;jj1 = 0; int jj2 = 0;li = 0;ni = 0;
bok1 =
0;bok2 = 0;bok3 = 0;bok4 = 0;bok5 = 0;niz1 = 0;bok4L = 0;bok1L = 0;bok3L =
0;nomer1 = Num_nach + kol * 3;nomer2 = nomer1 + 20;
(double
fi = 315; fi < 675; fi = fi + ugol)
{x1,
y1, x2, y2, x3, y3, x4, y4;
tfi =
fi + ugol;tr = r1 + R/2;
= r1 *
Cos(fi) +x0;= r1 * Sin(fi) + y0;
= r1 *
Cos(tfi) + x0;= r1 * Sin(tfi) + y0;
= tr *
Cos(fi) + x0;= tr * Sin(fi) + y0;
= tr *
Cos(tfi) + x0;= tr * Sin(tfi) + y0;
[]
Numer0 = new int[3];[] Numer = new int[3];[] Numer1 = new int[3];
x5=0,
x6=0, y5=0, y6=0;
(fi
< 495 && fi >= 405)
{++;=
y5 = r;Ntrad = Math.Abs(y5 / Sin(fi));= Math.Abs(Ntrad * Cos(fi) + x0);=
Math.Abs(y6 / Sin(tfi));= Ntrad * Cos(tfi) + x0;= y6 = y5 + y0;
nn =
n;
(x3!=
x5 && y3!= y5)
{= n +
2;
}= n +
1;
n1 = n
+ 5;
nn1 =
n1;
(x4!=
x6 && y4!= y6)
{= n1
+ 2;
}++;
(x6 ==
x0 - R && (zona == 2 || zona == 4))
{= n1
- 1;
}
[0] =
n0; Numer0[1] = nn1; Numer0[2] = nn;
[0] =
nn; Numer[1] = nn1; Numer[2] = nn1 + 1;
[0] =
nn; Numer1[1] = nn1 + 1; Numer1[2] = nn + 1;
[nomer_treug]
= new KElement(cr, y0, x2, y2, x1, y1, Numer0,material);_treug++;
[nomer_treug]
= new KElement(x1, y1, x2, y2, x4, y4, Numer,material);_treug++;[nomer_treug] =
new KElement(x1, y1, x4, y4, x3, y3, Numer1,material);_treug++;
m =
0;(zona == 1 || zona == 2)= 1;= 2;
(x4!=
x6 && y4!= y6)
{[0] =
nn + 1; Numer[1] = nn1 + 1; Numer[2] = nn1 + 2;(x6 == x0 - R && (zona
== 2 || zona == 4))
{[2] =
bok_numers4L[0];
}[nomer_treug]
= new KElement(x3, y3, x4, y4, x6, y6, Numer,m);_treug++;
}
(x3!=
x5 && y3!= y5)
{[0] =
nn + 1; Numer1[1] = n1; Numer1[2] = nn + 2;(x6 == x0 - R && (zona == 2
|| zona == 4))
{[1] =
bok_numers4L[0];
}[nomer_treug]
= new KElement(x3, y3, x6, y6, x5, y5, Numer1,m);_treug++;
}
xx,
yy;= x6;
h = d1
/ 4;kol_poY = 4;= kol_poY;t = 0;
(double
tyy = 1; tyy < 5; tyy = tyy + 1)
{= y5
+ h;
[0] =
n; Numer[1] = n1; Numer[2] = n1 + 1;[0] = n; Numer1[1] = n1 + 1; Numer1[2] = n
+ 1;(x6 == x0 - R && (zona == 2 || zona == 4))
{[0] =
n; Numer[1] = bok_numers4L[bok4L]; Numer[2] = bok_numers4L[bok4L + 1];[0] = n;
Numer1[1] = Numer[2]; Numer1[2] = n + 1;L++;
}
((zona
== 1 || zona == 2) && foorMid == 1)
{(bok4
== 0)
{_numers4[bok4]
= Numer[0];++;
}_numers4[bok4]
= Numer1[2];++;
}
//низ((zona == 3 || zona == 4) &&
foorMid == 1)
{(bok5
== 0)
{_numers5[bok5]
= Numer[0];++;
}_numers5[bok5]
= Numer1[2];++;
}
if (t
== 3 && (zona == 1 || zona == 2))
{(niz1
== 0)
{_numers1[niz1]
= Numer1[2];++;
}_numers1[niz1]
= Numer1[1];++;
}
mat =
0;(zona == 1 || zona == 2)= 1;= 2;
[] gu
= new int[3];[nomer_treug] = new KElement(x5, y5, x6, y6, xx, yy, Numer,mat);
(t ==
3&&(zona==3||zona==4))
{[0] =
0; gu[1] = 0; gu[2] = 1;[nomer_treug].setGU(gu);
}_treug++;
[nomer_treug]
= new KElement(x5, y5, xx, yy, x5, yy, Numer1,mat);(t == 3 && (zona ==
3 || zona == 4))
{[0] =
0; gu[1] = 1; gu[2] = 1;[nomer_treug].setGU(gu);
}_treug++;
= y6 =
yy;
++;++;++;
}
}
(fi
< 405 && fi >= 315)
{= x6
= r;Ntrad = Math.Abs(x5 / Cos(fi));= Math.Abs(Ntrad * Sin(fi) + y0);=
Math.Abs(x6 / Cos(tfi));= Math.Abs(Ntrad * Sin(tfi) + y0);= x6 = x5 + x0;
nn =
0;n1 = 0;
= n;
(x3!=
x5 && y3!= y5)
{= n +
2;;
}= n +
1;
((2 *
d1 + 2 * R == y5) && (zona == 3 || zona == 4))
{-;
}
= n +
1;
(x4!=
x6 && y4!= y6)
{= n1
+ 2;
}++;
[0] =
n0; Numer0[1] = n + 1; Numer0[2] = nn;
[0] =
nn; Numer[1] = n + 1; Numer[2] = n + 2;
[0] =
nn; Numer1[1] = n + 2; Numer1[2] = nn + 1;
[nomer_treug]
= new KElement(cr, y0, x2, y2, x1, y1, Numer0,material);_treug++;[nomer_treug]
= new KElement(x1, y1, x2, y2, x4, y4, Numer,material);_treug++;[nomer_treug] =
new KElement(x1, y1, x4, y4, x3, y3, Numer1,material);_treug++;
m =
0;(zona == 1 || zona == 2)
{(y6
> y0)
{= 1;
}=2;
}(zona
== 3 || zona == 4)
{(y6
> y0)
{= 2;
}= 1;
}
(x4!=
x6 && y4!= y6)
{[0] =
nn + 1; Numer[1] = n + 2; Numer[2] = n + 3;[nomer_treug] = new KElement(x3, y3,
x4, y4, x6, y6, Numer,m);_treug++;
}
(x3!=
x5 && y3!= y5)
{[0] =
nn + 1; Numer1[1] = n1; Numer1[2] = n;((2 * d1 + 2 * R == y5) && (zona
== 3 || zona == 4))
{[2] =
niz_numers1[niz_numers1.Length - 1];
}[nomer_treug]
= new KElement(x3, y3, x6, y6, x5, y5, Numer1,m);_treug++;
}(bok2
== 0 || bok1 == 0)
{(zona
== 3 || zona == 4)
{_numers2[bok2]
= Numer1[2];
}(zona
== 1 || zona == 2)
{_numers1[bok1]
= Numer1[2];
}
++;
bok2++;
}
(x3 ==
x5 && y3 == y5)
{[1] =
Numer[2];
}
(zona
== 3||zona==4)
{_numers2[bok2]
= Numer1[1];
}(zona
== 1||zona==2)
{_numers1[bok1]
= Numer1[1];
}++;
bok2++;
}
(fi
< 585 && fi >= 495)
{= x6
= r;
Ntrad
= Math.Abs(x5 / Cos(fi));= Math.Abs(Ntrad * Sin(fi) + y0);= Math.Abs(x6 /
Cos(tfi));= Ntrad * Sin(tfi) + y0;= x6 = x0 - x5;
nn =
n;
(x3!=
x5 && y3!= y5)
{= n +
2;;
}= n +
1;
(y5 ==
d1 + 2 * R || y5 == 2 * d1 + 4 * R)
{= nn
+ 6;(zona == 2 || zona == 4)
{= nn
+ 2;
}
}
(zona
== 2 || zona == 4)
{= n -
1;
}
n1 = n
+ 1;
(x4!=
x6 && y4!= y6)
{= n1
+ 2;
}++;
Numer0[0]
= n0; Numer0[1] = n + 1; Numer0[2] = nn;[0] = nn; Numer[1] = n + 1; Numer[2] =
n + 2;[0] = nn; Numer1[1] = n + 2; Numer1[2] = nn + 1;
(x4 ==
x6 && y4 == y6 && (zona == 2 || zona == 4))
{[0] =
n0; Numer0[1] = n + 1; Numer0[2] = nn;[0] = nn; Numer[1] = n + 1; Numer[2] =
bok_numers1L[bok1L + 1];[0] = nn; Numer1[1] = Numer[2]; Numer1[2] = nn + 1;
}(x3
== x5 && y3 == y5 && (zona == 2 || zona == 4))
{[0] =
n0; Numer0[1] = n + 1; Numer0[2] = nn;[0] = nn; Numer[1] = n + 1; Numer[2] = n
+ 2;[0] = nn; Numer1[1] = Numer[2]; Numer1[2] = bok_numers1L[bok1L];
}
[nomer_treug]
= new KElement(cr, y0, x2, y2, x1, y1, Numer0,material);_treug++;
[nomer_treug]
= new KElement(x1, y1, x2, y2, x4, y4, Numer,material);_treug++;[nomer_treug] =
new KElement(x1, y1, x4, y4, x3, y3, Numer1,material);_treug++;
m =
0;(zona == 1 || zona == 2)
{(y6
< y0)
{= 2;
}= 1;
}(zona
== 3 || zona == 4)
{(y6
< y0)
{= 1;
}= 2;
}
(x4!=
x6 && y4!= y6)
{[0] =
nn + 1; Numer[1] = n + 2; Numer[2] = n + 3;(zona == 2 || zona == 4)
{
//
Numer[1] = bok_numers1L[bok1L + 1];[2] = bok_numers1L[bok1L + 1];
}(x3
== x5 && y3 == y5&&(zona==2||zona==4))
{[0] =
bok_numers1L[bok1L];
}(zona
== 3 && y6 == (2 * d1 + 2 * R))[2] = niz_numers1[0];[nomer_treug] = new
KElement(x3, y3, x4, y4, x6, y6, Numer,m);_treug++;
}(x3!=
x5 && y3!= y5)
{nn1 =
n;(y5 == d1 + 2 * R)= nn + 2;[0] = nn + 1; Numer1[1] = n1; Numer1[2] =
nn1;(zona == 2 || zona == 4)
{[1] =
bok_numers1L[bok1L + 1];[2] = bok_numers1L[bok1L];
}(zona
== 3 && y5 == 2*d1 + 4 * R)
{[2] =
nn + 2;
}(zona
== 3 && y6 == (2 * d1 + 2 * R))[1] = niz_numers1[0];[nomer_treug] = new
KElement(x3, y3, x6, y6, x5, y5, Numer1,m);_treug++;
}L++;
//MessageBox.Show(nx_xspec.ToString());
}
(fi
< 675 && fi >= 585)
{= y6
= r;Ntrad = Math.Abs(y5 / Sin(fi));
=
Math.Abs(Ntrad * Cos(fi) + x0);
=
Math.Abs(y6 / Sin(tfi));
=
Ntrad * Cos(tfi) + x0;(zona == 1 || zona == 2)= y6 = d1;= y6 = y0 - y5;
nn =
n;
(x3!=
x5 && y3!= y5)
{= n +
2;
}= n +
1;
(zona
== 3 || zona == 4)-;
n1 =
0;
if
(zona == 1 || zona == 2)= n + 5;n1 = n + 1;
nn1 =
n1;
(x4!=
x6 && y4!= y6)
{= n1
+ 2;
}++;
(x5 ==
x0 - R && zona == 2)
{=
nn+2;
}
(zona
== 1 || zona == 2)
{[0] =
n0; Numer0[1] = nn1; Numer0[2] = nn;[0] = nn; Numer[1] = nn1; Numer[2] = nn1 +
1;[0] = nn; Numer1[1] = nn1 + 1; Numer1[2] = nn + 1;
}
{[0] =
n0; Numer0[1] = n + 1; Numer0[2] = nn;[0] = nn; Numer[1] = n + 1; Numer[2] = n
+ 2;[0] = nn; Numer1[1] = n + 2; Numer1[2] = nn + 1;
}(x4
== x6 && y4 == y6 && (zona == 3||zona==4))
{[0] =
n0; Numer0[1] = n + 1; Numer0[2] = nn;[0] = nn; Numer[1] = n + 1; Numer[2] =
niz_numers1[jj1 + 1];[0] = nn; Numer1[1] = Numer[2]; Numer1[2] = nn + 1;
}(x3
== x5 && y3 == y5 && (zona == 3 || zona == 4))
{[0] =
n0; Numer0[1] = n + 1; Numer0[2] = nn;[0] = nn; Numer[1] = n + 1; Numer[2] = n
+ 2;[0] = nn; Numer1[1] = Numer[2]; Numer1[2] = niz_numers1[jj1];
}
(x6 ==
x0 + R)
{[0] =
n0; Numer0[1] = n0 + 1; Numer0[2] = nn;[0] = nn; Numer[1] = n0 + 1; Numer[2] =
n0 + 2;[0] = nn; Numer1[1] = n0 + 2; Numer1[2] = nn + 1;
}
[nomer_treug]
= new KElement(cr, y0, x2, y2, x1, y1, Numer0,material);_treug++;
[nomer_treug]
= new KElement(x1, y1, x2, y2, x4, y4, Numer,material);_treug++;[nomer_treug] =
new KElement(x1, y1, x4, y4, x3, y3, Numer1,material);_treug++;
m =
0;(zona == 1 || zona == 2)
{= 2;
}m =
1;(x4!= x6 && y4!= y6)
{[0] =
nn + 1; Numer[1] = nn1 + 1; Numer[2] = nn1 + 2;
(zona
== 3 || zona == 4)
{[2] =
niz_numers1[jj1 + 1];
}(x3
== x5 && y3 == y5&&(zona==3||zona==4))
{[0] =
niz_numers1[jj1];
}(x6
== x0 + R && (zona == 1 || zona == 2))
{[0] =
nn + 1; Numer[1] = n0 + 2; Numer[2] = n0 + 3;
}(x6
== x0 + R && (zona == 3 || zona == 4))
{[0] =
nn + 1; Numer[1] = n0 + 2; Numer[2] = niz_numers1[niz_numers1.Length - 1];
}
[nomer_treug]
= new KElement(x3, y3, x4, y4, x6, y6, Numer,m);_treug++;
}(x3!=
x5 && y3!= y5)
{[0] =
nn + 1; Numer1[1] = n1; Numer1[2] = nn + 2;(x5 == x0 - R && zona == 2)
{[1] =
nn1 + 2;[2] = bok_numers3L[0];= nn + 1;= nn1 + 2;
}
(zona
== 3 || zona == 4)
{[2] =
niz_numers1[jj1];[1] = niz_numers1[jj1 + 1];
}(x6
== x0 + R && (zona == 1 || zona == 2))
{[0] =
nn + 1; Numer1[1] = n0 + 3; Numer1[2] = nn + 2;= n + 5;
}(x6
== x0 + R && (zona == 3 || zona == 4))
{[0] =
nn + 1; Numer1[1] = niz_numers1[niz_numers1.Length - 1];[2] =
niz_numers1[niz_numers1.Length - 2];
}[nomer_treug]
= new KElement(x3, y3, x6, y6, x5, y5, Numer1,m);_treug++;
}++;
(zona
== 1 || zona == 2)
{xx,
yy;= x6;h = d1 / 4;kol_poY = 4;
=
kol_poY;t = 0;
/*(x5
== x0 - R && zona == 2)
{
//n1 =
n + 3;
//MessageBox.Show(n1.ToString());
}*/(double
tyy = 1; tyy < 5; tyy = tyy + 1)
{= y5
- h;[0] = n; Numer[1] = n1; Numer[2] = n1 + 1;[0] = n; Numer1[1] = n1 + 1;
Numer1[2] = n + 1;
(x5 ==
x0 - R && zona == 2)
{[0] =
bok_numers3L[bok3L]; Numer[1] = n1; Numer[2] = n1 + 1;[0] =
bok_numers3L[bok3L]; Numer1[1] = Numer[2]; Numer1[2] = bok_numers3L[bok3L +
1];L++;
}((x6
== (x0 + R))&&t==0)
{[1] =
n0 + 3;[2] = n1;[1] = n1;--;
}
((zona
== 1 || zona == 2) && xx == x0 + R)
{(bok3
== 0)
{_numers3[bok3]
= Numer[1];
++;
}_numers3[bok3]
= Numer1[1];++;
}
[nomer_treug]
= new KElement(x5, y5, x6, y6, xx, yy, Numer, 2);//гайка[] gu = new int[3];(t == 3)
{
gu[0] = 0; gu[1] = 0; gu[2] = 1; }[nomer_treug].setGU(gu);_treug++;
[nomer_treug]
= new KElement(x5, y5, xx, yy, x5, yy, Numer1, 2);//гайка(t == 3)
{[0] =
0; gu[1] = 1; gu[2] = 1;
}[nomer_treug].setGU(gu);_treug++;=
y6 = yy;= n + 1;= n1 + 1;++;
}(x6
== (x0 + R))
{=n1;
}(x5
== x0 - R && zona == 2)
{=
nn1-1;
}
}
}++;
}
}
double
Cos(double fi)
{Math.Round(Math.Cos(fi
* (Math.PI / 180)), 2);
}double
Sin(double fi)
{Math.Round(Math.Sin(fi
* (Math.PI / 180)), 2);
}void
paint(Graphics gr)
{g =
new Bitmap(panel1.Width, panel1.Height);ob =
Graphics.FromImage(g);(ControlStyles.OptimizedDoubleBuffer, true);brush = new
SolidBrush(Color.Azure);pen = new Pen(Color.Black, 1);p1 = new Pen(Color.Black,
2);det = R * 1.5;
//
MessageBox.Show(nomer_treug.ToString());(t == 1)
{(int
i = 0; i < nomer_treug; i++)
{[] x
= KG[i].X();[] y = KG[i].Y();
.DrawLine(pen,
(float)x[0] * pix, (float)y[0] * pix, (float)x[1] * pix, (float)y[1] *
pix);.DrawLine(pen, (float)x[1] * pix, (float)y[1] * pix, (float)x[2] * pix,
(float)y[2] * pix);.DrawLine(pen, (float)x[2] * pix, (float)y[2] * pix,
(float)x[0] * pix, (float)y[0] * pix);
}
}.DrawImage(g,
0, 0);
}void
panel1_Paint(object sender, PaintEventArgs e)
{g =
new Bitmap(5000, 5000);ob =
Graphics.FromImage(g);(ControlStyles.OptimizedDoubleBuffer, true);
brush
= new SolidBrush(Color.Azure);pen = new Pen(Color.Azure, 1);p1 = new
Pen(Color.Black, 1);
det =
R * 1.5;font = new Font("Times New Roman", 8, FontStyle.Regular);
//
MessageBox.Show(nomer_treug.ToString());(t == 1)
{(int
i = 0; i < nomer_treug; i++)
{[] x
= KG[i].X();[] y = KG[i].Y();[] nom = KG[i].N();m = KG[i].Mat();(m == 1).Color
= Color.Blue;.Color = Color.Red;
[]
points = new PointF[3];(int j = 0; j < 3; j++)
{[j].X
= (float)x[j] * pix;[j].Y = (float)y[j] * pix;
}.FillPolygon(brush,
points);.DrawPolygon(pen, points);
//ob.DrawString(nom[2].ToString(),
font, Brushes.Black, (float)x[2] * pix, (float)y[2] * pix);
//
ob.DrawLine(pen, (float)x[0] * pix, (float)y[0] * pix, (float)x[1] * pix,
(float)y[1] * pix);
//ob.DrawLine(pen,
(float)x[1] * pix, (float)y[1] * pix, (float)x[2] * pix, (float)y[2] * pix);
//ob.DrawLine(pen,
(float)x[2] * pix, (float)y[2] * pix, (float)x[0] * pix, (float)y[0] * pix);
}
}
(t ==
2)
{(int
i = 0; i < nomer_treug; i++)
{[] x
= KG[i].X();[] y = KG[i].Y();[] nom = KG[i].N();m = KG[i].Mat();(m == 1).Color
= Color.Blue;.Color = Color.Red;
[]
points = new PointF[3];sum = 0;(int j = 0; j < 3; j++)
{[j].X
= ((float)x[j] + (float)X[nom[j] * 2]) * pix;[j].Y = ((float)y[j] +
(float)X[nom[j] * 2 + 1]) * pix;(nom[j] == usel)
{
}
}
}.Graphics.DrawImage(g,
koordX, koord);
}void
button2_Click(object sender, EventArgs e)
{=
koord - (int)numericUpDown4.Value;.Refresh();
}[]
X;void button3_Click(object sender, EventArgs e)
{();=
new double[KolUsel * 2, KolUsel * 2];(int i = 0; i < nomer_treug; i++)
{[] x
= new double[3];// KG[i].X();[] y = new double[3]; //KG[i].Y();.Copy(KG[i].X(),
x, 3);.Copy(KG[i].Y(), y, 3);
(x[0],
y[0], x[1], y[1], x[2], y[2]);= matrixOperation.inverseMatrix(AA);[,] md = new
double[3, 3];[0, 0] = 1; md[1, 0] = 1; md[2, 0] = 1;[0, 1] = x[0]; md[1, 1] =
x[1]; md[2, 1] = x[2];[0, 2] = y[0]; md[1, 2] = y[1];md[2,2]=y[2];sTrigl = 0.5
* Math.Abs(matrixOperation.det(md));//площадь
//MessageBox.Show(sTrigl.ToString());(KG[i].Mat()
== 1)
{=
double.Parse(textBox5.Text);//2e11= double.Parse(textBox4.Text);
}(KG[i].Mat()
== 2)
{=
double.Parse(textBox2.Text);//2e5= double.Parse(textBox3.Text);
}();=
matrixOperation.multiplication(matrixOperation.transposition(BB),
matrixOperation.transposition(Q));= matrixOperation.multiplication(K, E);=
matrixOperation.multiplication(K, Q);= matrixOperation.multiplication(K, BB);=
matrixOperation.multiplication(K, sTrigl);[] Numer = KG[i].N();(int si = 0; si
< 3; si++)(int sj = 0; sj < 3; sj++)(int ki = 0; ki < 2; ki++)(int kj
= 0; kj < 2; kj++)
{[Numer[si]
* 2 + ki, Numer[sj] * 2 + kj] += K[si * 2 + ki, sj * 2 + kj];
}
}[] RR
= new double[KolUsel * 2];(int j = 0; j < nomer_treug; j++)
{[] gu
= KG[j].GetGU();index=0;[] nd;(int k = 0; k < 3; k++)
{(gu[k]
== 1)
{=
KG[j].N();= nd[k];(int i = 0; i < KolUsel * 2; i++)
{[index
* 2, i] = 0;[index * 2 + 1, i] = 0;[i, index * 2] = 0;[i,index * 2 + 1] = 0;
}[index
* 2, index * 2] = 1;[index * 2 + 1, index * 2 + 1] = 1;[index * 2] = 0;[index *
2 + 1] = 0;
}
}
}=
Convert.ToInt32(textBox11.Text);Fx = double.Parse(textBox7.Text);Fy =
double.Parse(textBox8.Text);[usel * 2] = Fx;[usel * 2 + 1] = Fy;maxInd = 0;=
0;= 0;=new double[KolUsel*2];= matrixOperation.gausSLAU(gK, RR);kk = 0;(int i =
0; i < X.GetLength(0); i=i+2)
{(Math.Abs(maxX)
<= Math.Abs(X[i]))
{=
X[i];
}
}(int
i = 1; i < X.GetLength(0); i = i + 2)
{(Math.Abs(maxY)
<= Math.Abs(X[i]))
{=
X[i];
}
}.Show("Расчет завершен\n maxX = " + maxX.ToString() + "\n maxY = " +
maxY.ToString());maxDxDy = 2 * R * double.Parse(textBox6.Text)/100;.Text =
"max U="+Math.Round(maxX, 7).ToString();.Text = "max
V="+Math.Round(maxY, 7).ToString();(maxX > maxDxDy || maxY >
maxDxDy)
label18.Text
= "Состояние: разрушение";.Text = "Состояние: ок";
t =
2;.Refresh();.Enabled = true;
}
{view
= new result();
//view.dataGridView1.RowCount
= nomer_treug*KolUsel*2;k=0;(int i = 0; i < nomer_treug; i++)
{
[] x =
KG[i].X();[] y = KG[i].Y();[] N = KG[i].N();(int j = 0; j < 3; j++)
{.dataGridView1.RowCount
= k + 1;.dataGridView1[0, k].Value = (i+1).ToString();.dataGridView1[1,
k].Value = x[j].ToString();.dataGridView1[2, k].Value =
y[j].ToString();.dataGridView1[3, k].Value =
(N[j]+1).ToString();.dataGridView1[4, k].Value =
X[N[j]*2].ToString();.dataGridView1[5, k].Value = X[N[j]*2+1].ToString();++;
}
}.label1.Text="Количество узлов: "+KolUsel.ToString();.label2.Text="Количество элементов: "+nomer_treug.ToString();
view.label3.Text
= "Максимальное смещение по X: " + maxX.ToString();.label4.Text =
"Максимальное смещение по Y: " + maxY.ToString();
view.Show();
}
void
Form1_KeyDown(object sender, KeyEventArgs e)
{(e.Control)=
true;
}
void
Form1_KeyUp(object sender, KeyEventArgs e)
{=
false;
}void
hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{.Stop();+=
e.OldValue - e.NewValue;.Start();
}void
timer1_Tick(object sender, EventArgs e)
{.Refresh();.Stop();
}
}class
KElement
{type;[]
x;[] y;[] Num;material;[] GU;KElement(double x1, double y1, double x2, double
y2, double x3, double y3, int[] Nu,int mat)
{= new
int[3];= new double[3];= new double[3];[0] = x1; x[1] = x2; x[2] = x3;[0] = y1;
y[1] = y2; y[2] = y3;= new int[3];[0] = Nu[0]; Num[1] = Nu[1]; Num[2] = Nu[2];=
mat;
}void
setGU(int[] gu)
{[0]=gu[0];[1]=gu[1];[2]=gu[2];
}int[]
GetGU()
{GU;
}double[]
X()
{x;
}
double[]
Y()
{y;
}int[]
N()
{Num;
}void
setN(int N, int j)
{[j] =
N;
}int
Mat()
{material;
}
}matrixOperation
{public
double[,] transposition(double[,] matr)
{[,]
tMatr = new double[matr.GetLength(1), matr.GetLength(0)];(int i = 0; i <
matr.GetLength(0); i++)(int j = 0; j < matr.GetLength(1); j++)[j, i] =
matr[i, j];tMatr;
}
public
double[,] summation(double[,] matrA, double[,] matrB)
{[,]
mulMatr = new double[matrA.GetLength(0), matrB.GetLength(1)];(int i = 0; i <
matrA.GetLength(0); i++)(int j = 0; j < matrA.GetLength(1); j++)[i, j] =
matrA[i, j] + matrB[i, j];mulMatr;
}
public
double[,] multiplication(double[,] matrA, double[,] matrB)
{[,]
mulMatr = new double[matrA.GetLength(0), matrB.GetLength(1)];
(int i
= 0; i < matrA.GetLength(0); i++)(int j = 0; j < matrB.GetLength(1);
j++)(int k = 0; k < matrB.GetLength(0); k++)[i, j] += matrA[i, k] * matrB[k,
j];mulMatr;
}
public
double[] multiplication(double[,] matrA, double[] vectorB)
{[]
mulMatr = new double[matrA.GetLength(0)];
(int i
= 0; i < matrA.GetLength(0); i++)(int k = 0; k < vectorB.GetLength(0);
k++)[i] += matrA[i, k] * vectorB[k];mulMatr;
}
public
double[,] multiplication(double[,] matrA, double Zn)
{[,]
mulMatr = new double[matrA.GetLength(0), matrA.GetLength(1)];
(int i
= 0; i < matrA.GetLength(0); i++)(int k = 0; k < matrA.GetLength(1);
k++)[i, k] = matrA[i, k] * Zn;mulMatr;
}
public
double[] gausSLAU(double[,] A, double[] B)
{[] X
= new double[A.GetLength(0)];
ln =
A.GetLength(0); (int i = 0; i < ln; i++) //выполнение
прямого хода Метода Гауса
{(Math.Abs(A[i,
i]) < 0.000000001) //проверка
стоит ли на главной диогонали 0
{maxEl =
0; //максимальный найденый элемент ниже нулевогоind = 0; //индекс строки с
которой нужно произвести перестановку(int j = i; j < ln; j++) //если был
найден 0
{(Math.Abs(A[j,
i]) > maxEl) //выполняем поиско подходящей строки
{=
Math.Abs(A[j, i]);= j;
}
}(ind!=
0)
{tmp =
0;
for (int
j = 0; j < ln; j++) //перестановка строк
{=
A[i, j];[i, j] = A[ind, j];[ind, j] = tmp;
}=
B[i];[i] = B[ind];[ind] = tmp;
}
}
/*получение
треугольной матрицы*/(int j = i + 1; j < ln; j++)
{(Math.Abs(A[j,
i]) > 0.0000000001)
{lokKaf
= A[j, i] / A[i, i]; //определение коэффициента домножения(int k = 0; k < ln; k++) //отнимание строк
{[j,
k] = A[j, k] - A[i, k] * lokKaf;
}[j] =
B[j] - B[i] * lokKaf;
}
}
}
/*-------обратный
ход метода Гауса---------*/
{
double
det = 1;
/*for
(int i = 0; i < n; i++)
{*=
A[i, i];
}*/(Math.Abs(A[ln
- 1, ln - 1]) < 0.000000001)
{(Math.Abs(B[ln
- 1]) < 0.000000001)
{new
Exception("Система имеет множество решений");
}(Math.Abs(det)
< 0.000000001)
throw new
Exception("Система не имеет решений, определитель равен 0");
}
= new
double[ln]; //инициализация массива ответов
for
(int i = ln - 1; i >= 0; i--)
{h =
B[i];// h присваиваем ответ из массива сил
for
(int j = 0; j < ln; j++)
h = h -
X[j] * A[i, j]; //вычетание элементов строки матрицы[i] = h / A[i, i];//h делим
на коэффициент при иксу
}
}(Exception
ex) { MessageBox.Show(ex.Message); }
X;
}
public
double[,] inverseMatrix(double[,] A)
{[,] B
= new double[A.GetLength(0), A.GetLength(1)];(int i = 0; i < A.GetLength(0);
i++)
B[i, i] =
1;
{(int i =
0; i < A.GetLength(0); i++) //выполнять цыкл пока не будет обработана вся
матрица
{((Math.Abs(A[i,
i]) < 0.00001)) //проверка стоит ли на главной диогонали 0
{maxEl
= 0;ind = 0;(int j = i; j < A.GetLength(0); j++) //если был найден 0
{(Math.Abs(A[j,
i]) > maxEl) //выполняем поиско подходящей строки
{=
Math.Abs(A[j, i]);= j;
}
}(ind!=
0)
{(int
j = 0; j < A.GetLength(0); j++) //перестановка строк
{tmp =
0;= A[i, j];[i, j] = A[ind, j];[ind, j] = tmp;= B[i, j];[i, j] = B[ind, j];
B[ind, j]
= tmp;
}
}
}kaf =
A[i, i]; //преобразование элемента стоящего на главной доогонали в
1(Math.Abs(kaf) < 0.0000000000000001)
{new
Exception("Нельзя получить обратную матрицу");
}
(int j
= 0; j < A.GetLength(0); j++)
{[i,
j] = A[i, j] / kaf;[i, j] = B[i, j] / kaf;
}
/*получение
единичной матрицы*/(int j = 0; j < A.GetLength(0); j++)
{(i!=
j && Math.Abs(A[j, i]) > 0.000000001)
{lokKaf
= A[j, i] / A[i, i];(int k = 0; k < A.GetLength(0); k++)
{[j,
k] = A[j, k] - A[i, k] * lokKaf;[j, k] = B[j, k] - B[i, k] * lokKaf;
}
}
}
}
}(Exception
ex) { MessageBox.Show(ex.Message); }B;
}public
double det(double[,] A)
{ln =
A.GetLength(0);(int i = 0; i < ln; i++) //выполнение прямого хода Метода Гауса
{
if
(Math.Abs(A[i, i]) < 0.000000001) //проверка стоит ли на главной диогонали 0
{maxEl =
0; //максимальный найденый элемент ниже нулевогоind = 0; //индекс строки с
которой нужно произвести перестановку(int j = i; j < ln; j++) //если был
найден 0
{(Math.Abs(A[j,
i]) > maxEl) //выполняем поиско подходящей строки
{=
Math.Abs(A[j, i]);= j;
}
}(ind!=
0)
{tmp =
0;
for (int
j = 0; j < ln; j++) //перестановка строк
{=
A[i, j];[i, j] = A[ind, j];
A[ind, j]
= tmp;
}
}
}
/*получение
треугольной матрицы*/
for
(int j = i + 1; j < ln; j++)
{(Math.Abs(A[j,
i]) > 0.0000000001)
{lokKaf
= A[j, i] / A[i, i]; //определение коэффициента домножения(int k = 0; k < ln; k++) //отнимание строк
{[j,
k] = A[j, k] - A[i, k] * lokKaf;
}
}
}
}
X = 1;
(int i
= 0; i < ln; i++)*= A[i, i];
X;
}
}
}