- •«Каркасно-пружинная модель твердого тела»
- •Введение
- •Исследование и анализ деформации упругих тел.
- •Основные понятия, теории и методы построения математической модели деформирования.
- •Среда разработки Delphi
- •Использованные технологии и алгоритмы
- •Реализация рассмотренной модели в виде отдельного программного обеспечения.
- •Заключение
- •Список использованной литературы
- •Приложение
Заключение
В соответствии с поставленными задачами в настоящей работе рассмотрена математическая модель деформирования каркасно-пружинной модели твердого тела, определенная системой линейных алгебраических уравнений и решается методом Гаусса-Зейделя и методом верхней релаксации для ускорения сходимости.
Рассмотренная модель реализована в виде отдельного программного обеспечения. В ходе его написания были вскрыты основные методологические проблемы и общие принципы математического моделирования деформации тел.
Таким образом, построение эффективной математической модели для основных задач теории упругости, включающие в себя исследования деформации тел, а также разработка алгоритмов численного решения этих задач позволило более широко осмыслить методологию построения сложных алгоритмов учитывающих большое количество переменных. Глубоко разобраться в двумерных и трехмерных системах, что в дальнейшем сумеет, оказать полезный опыт при работе с задачами включающие в себя двухмерные, трехмерные системы и методы и алгоритмы, рассмотренные в данной работе. В то время как такие типы задач встречаются довольно часто.
Проведенный численный анализ метода реализации СЛАУ показал преимущества прямого метода (метод Гаусса-Зейделя)перед остальными итерационными методами.
Список использованной литературы
Александров А. В., Потапов В. Д. Основы теории упругости и пластичности.—М.: Высшая школа, 1990.— 400с.
Барашков В.Н., Люкшин Б.А. Алгоритм реализации трехмерной задачи теории упругости и пластичности // Моделирование в механике: Сборник научных трудов / РАН. Сибирское отделение. Интернат теории прикладной механики. —Новосибирск, 1993. —Т. 7 (24), № 4.— 10-25.
Бахвалов И.В., Жидков Н.П., Кобельков Г.М. Численные методы. Москва— Санкт-Петербург, Физматлит. 2000.— 622с.
Димитриенко Ю. И. Нелинейная механика сплошной среды.—М.: Физматлит, 2010,—624с.
Ильюшин А.А., Ленский В.С. Сопротивление материалов. —М., Физматгиз, 1959
Каландия А.И. Математические методы двумерной упругости. М: Наука, 1973.—303с.
Калиткин Н. Н. Численные методы.—М.: Наука, 1978.— 512с.
Курош А.Г. Курс высшей алгебры.—М: Наука. 1971.—431с.
Ландау Л.Д., Лившиц Е.М. Теория упругости. 4-е изд.— М.: Наука, 1987.— 246с.
Лихачёв В. А., Малинин В. Г. Структурно-аналитическая теория прочности.— СПб.: Наука. 1993.— 471с.
Лурье А. И. Нелинейная теория упругости.— М.: Наука, 1980.— 512с.
Лурье А. И. Теория упругости.— М.: Наука, 1970.— 940с.
Нох В.Ф. Совместный эйлерово-лагранжев (СЭЛ) метод для расчета нестационарных двумерных задач // Вычислительные методы в гидродинамике.—М., 1967.—128-184с.
Седов Л. И. Механика сплошной среды. Том 1.— М.: Наука, 1970.
Трусделл К. Первоначальный курс рациональной механики сплошной среды.— М.: Наука, 1975.
Приложение
procedure MoveTo_R(canvas:TCanvas;x,y:extended);
var
ex,ey:integer;
begin
ex:=nkx+round(x*mx);
ey:=nky-round(y*my);
canvas.MoveTo(ex,ey);
end;
procedure LineTo_R(canvas:TCanvas;x,y:extended);
var
ex,ey:integer;
begin
ex:=nkx+round(x*mx);
ey:=nky-round(y*my);
canvas.LineTo(ex,ey);
end;
function get_rx(X:integer):extended;
begin
result:=(x-nkx)/mx;
end;
function get_ry(Y:integer):extended;
begin
result:=-(y-nky)/my;
end;
procedure Circle_R(canvas:TCanvas;x,y:extended;r:extended);
var
ex,ey:integer;
dx,dy:integer;
begin
ex:=nkx+round(x*mx);
ey:=nky-round(y*my);
dx:=round(r*mx);
dy:=round(r*my);
canvas.Ellipse(ex-dx,ey-dy,ex+dx,ey+dy);
end;
procedure Pruzh_1d_ris(canvas:TCanvas;p:TSpring;rx1,ry1,rx2,ry2:extended);
var
i:integer;
l,dl:extended;
x,y:extended;
dx1,dy1:extended;
sina,cosa:extended;
begin
l:=sqrt((rx2-rx1)*(rx2-rx1)+(ry2-ry1)*(ry2-ry1));
cosa:=(rx2-rx1)/l;
sina:=(ry2-ry1)/l;
dx1:=p.diam/1*sina;
dy1:=p.diam/1*cosa;
dl:=(l-2*p.dl)/p.Twist_Count;
MoveTo_r(canvas,rx1,ry1);
x:=rx1+p.dl*cosa;
y:=ry1+p.dl*sina;
LineTo_r(canvas,x,y);
for i:=1 to p.Twist_Count do
begin
x:=x+dl*cosa/4;
y:=y+dl*sina/4;
x:=x-dx1;
y:=y+dy1;
LineTo_r(canvas,x,y);
x:=x+dx1;
y:=y-dy1;
x:=x+dl*cosa/2;
y:=y+dl*sina/2;
x:=x+dx1;
y:=y-dy1;
LineTo_r(canvas,x,y);
x:=x-dx1;
y:=y+dy1;
x:=x+dl*cosa/4;
y:=y+dl*sina/4;
LineTo_r(canvas,x,y);
end;
x:=rx2-p.dl*cosa;
y:=ry2-p.dl*sina;
LineTo_r(canvas,x,y);
MoveTo_r(canvas,x,y);
LineTo_r(canvas,rx2,ry2);
end;
function Get_Spring(p1,p2:TPoint_3d):TSpring;
var
i:integer;
s:TSpring;
begin
result:=nil;
for i:=0 to SpringsList.Count-1 do
begin
s:=SpringsList[i];
if ((p1=s.Otr.First) and (p2=s.Otr.Last)) then result:=s;
if ((p2=s.Otr.First) and (p1=s.Otr.Last)) then result:=s;
end;
end;
procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
i,np:integer;
rx,ry:extended;
p:Tpoint_3d;
begin
selected:=-1;
rx:=get_rx(X);
ry:=get_ry(Y);
np:=PointsList.Count;
for i:=0 to np-1 do
begin
p:=PointsList.Items[i];
if ((abs(rx-p.x)<5) and (abs(ry-p.y)<5)) then
begin
selected:=i;
break;
end
end;
end;
procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
var
rx,ry:extended;
begin
rx:=get_rx(X);
ry:=get_ry(Y);
statusbar1.Panels[0].Text:=' X: ' + intToStr(x)+ ' rX: ' +FloatToStrF(rx,fffixed,8,3);
statusbar1.Panels[1].Text:=' Y: '+intToStr(y)+ ' rY: ' +FloatToStrF(ry,fffixed,8,3);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
nkx:=40;
nky:=paintbox1.ClientHeight-dely;
mx:=(paintbox1.ClientWidth-delx*2)/widthX;
my:=mx;
end;
procedure TForm1.AddPointTo(rX, rY:extended);
var
p:TPoint_3d;
begin
p:=TPoint_3d.Create_withCoord(rx,ry);
PointsList.Add(p);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
PointsList:=TList.Create;
SpringsList:=TList.Create;
end;
procedure TForm1.PaintBox1MouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
p:TPoint_3d;
rx,ry:extended;
point_select:boolean;
otr:TOtr_3d;
S:TSpring;
l:Extended;
value_n:integer;
d:extended;
begin
d:=2;
rx:=get_rx(X);
ry:=get_ry(Y);
if Adding_points then
begin
AddPointTo(rX,rY);
memos_update;
end;
if Adding_springs then
begin
if FirstSelected then
begin
if selected<>-1 then
begin
p2:=PointsList[selected];
otr:=TOtr_3d.Create_withPoints(p1,p2);
l:=abs(otr.GetLength);
value_n:=round(l/d)+1;
s:=TSpring.Create_withParam(otr,l,5,d,2*d,value_n);
SpringsList.Add(s);
selected:=-1;
FirstSelected:=false;
memos_update;
end;
end
else
begin
if selected<>-1 then
begin
p1:=PointsList[selected];
FirstSelected:=true;
end;
end;
end;
if fixing_points then
begin
if selected<>-1 then
begin
p:=PointsList[selected];
if mbLeft = Button then
begin
p.fixed:=1;
end
else
begin
p.fixed:=0;
end;
end;
memos_update;
end;
paintbox1.repaint;
end;
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
i,np,ns:integer;
nx,ny:integer;
rx,ry:extended;
x,y:integer;
p,p1,p2:TPoint_3d;
s:TSpring;
str:string;
oldcolor:Tcolor;
tw,th:integer;
begin
rx:=get_rx(paintbox1.ClientWidth-nkx-delx);
nx:=round(rx/10);
ry:=get_ry(dely);
ny:=round(ry/10);
for i:=0 to nx do
begin
str:=FloatToStrF(i*10,fffixed,4,1);
tw:=PaintBox1.Canvas.TextWidth(str);
PaintBox1.Canvas.TextOut(nkx+round(mx*10*i-tw/2),nky+5,str);
moveto_r(PaintBox1.Canvas,i*10,0);
Lineto_r(PaintBox1.Canvas,i*10,10*ny);
end;
for i:=0 to ny do
begin
str:=FloatToStrF(i*10,fffixed,4,1);
tw:=PaintBox1.Canvas.TextWidth(str);
th:=PaintBox1.Canvas.TextHeight(str);
PaintBox1.Canvas.TextOut(nkx-tw-2,nky-round(my*10*i)-th div 2,str);
moveto_r(PaintBox1.Canvas,0,i*10);
Lineto_r(PaintBox1.Canvas,10*nx,i*10);
end;
np:=PointsList.Count;
if np<>0 then
begin
for i:=0 to np-1 do
begin
p:=PointsList[i];
oldcolor:=PaintBox1.Canvas.Brush.Color;
PaintBox1.Canvas.Brush.Color:=clgreen;
if p.fixed=1 then PaintBox1.Canvas.Brush.Color:=clred;
Circle_r(PaintBox1.Canvas,p.X,p.Y,2);
PaintBox1.Canvas.Brush.Color:=oldcolor;
end;
end;
ns:=SpringsList.Count;
if ns<>0 then
begin
for i:=0 to ns-1 do
begin
s:=SpringsList[i];
p1:=s.Otr.First;
p2:=s.Otr.Last;
Pruzh_1d_ris(PaintBox1.Canvas,s,p1.X,p1.Y,p2.X,p2.Y);
end;
end;
memos_update;
end;
procedure TForm1.Panel2Click(Sender: TObject);
begin
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
end;
procedure TForm1.SpeedButton2Click(Sender: TObject);
begin
Adding_points:=false;
Adding_springs:=false;
fixing_points:=true;
end;
procedure TForm1.SpeedButton3Click(Sender: TObject);
begin
Adding_springs:=true;
fixing_points:=false;
Adding_points:=false;
end;
procedure TForm1.SpeedButton4Click(Sender: TObject);
begin
Adding_points:=true;
Adding_springs:=false;
fixing_points:=false;
end;
procedure TForm1.Memos_update;
var
i,np,ns:integer;
rx,ry:extended;
p,p1,p2:TPoint_3d;
s:TSpring;
str:string;
begin
np:=PointsList.Count;
memo1.Lines.Clear;
if np<>0 then
begin
for i:=0 to np-1 do
begin
p:=PointsList[i];
str:=IntToStr(i)+' rX: ' +FloatToStrF(p.x,fffixed,8,3)+' rY: ' +FloatToStrF(p.y,fffixed,8,3)+' fixed: ' +IntToStr(p.fixed);
memo1.Lines.Add(str);
end;
end;
ns:=SpringsList.Count;
memo2.Lines.Clear;
if ns<>0 then
begin
for i:=0 to ns-1 do
begin
s:=SpringsList[i];
p1:=s.Otr.First;
p2:=s.Otr.Last;
str:=IntToStr(i)+' (' +FloatToStrF(p1.x,fffixed,8,2)+',' +FloatToStrF(p1.y,fffixed,8,2)+')';
str:=Str+' ,(' +FloatToStrF(p2.x,fffixed,8,2)+',' +FloatToStrF(p2.y,fffixed,8,2)+')';
str:=Str+' k=' +FloatToStrF(s.k,fffixed,8,2)+', l=' +FloatToStrF(s.l,fffixed,8,2)+')';
memo2.Lines.Add(str);
end;
end;
end;
function sgn(x1,x2:extended):integer;
begin
if x1>x2 then result:=1 else result:=-1;
end;
procedure TForm1.solve_pos;
var
i,j:integer;
kkk:integer;
ax,bx,cx,razn,pu:extended;
ay,by,cy:extended;
okey:boolean;
np:integer;
p:TPoint_3d;
p1:TPoint_3d;
s:TSpring;
pm:extended;
k,l:extended;
begin
pm:=100;
kkk:=0;
np:=PointsList.Count;
// repeat
razn:=0;
for i:=0 to np-1 do //проход по всем точкам
begin
p:=PointsList[i]; //текущая точка
if p.fixed<>1 then //если не зафиксирована
begin
ax:=0; bx:=0; cx:=0 ;ay:=0; by:=0; cy:=0;
forj:=0 to np-1 do // по всем точкам
begin
p1:=PointsList[j];
if p1<>p then //если точка другая
begin
s:=get_spring(p,p1); //определяем пружину которая соединяет эти точки
if s<>nil then
begin
l:=s.l;
k:=s.k;
ax:=ax+p1.x*k; // вычисление формулы 13
bx:=bx-sgn(p.X,p1.X)*l;
cx:=cx+k;
ay:=ay+p1.y*k; // вычисление формулы 14
by:=by-sgn(p.y,p1.y)*l;
cy:=cy+k;
end;
end;
end;
pu:=p.x; //для определения ошибок
p.x:=(ax+bx)/cx; //новое значение х-координаты
if (abs(pu-p.x)>=razn) then razn:=abs(pu-p.x);
pu:=p.y; //для определения ошибок
p.y:=(ay+by-pm)/cy; //новое значение у-координаты
if (abs(pu-p.y)>=razn) then razn:=abs(pu-p.y);
end;
end;
okey:= (razn < 0.001);
kkk:=kkk+1; end; procedure TForm1.Button1Click(Sender: TObject); begin solve_pos; PaintBox1.Repaint; end; end.