Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Diplom-cho.docx
Скачиваний:
15
Добавлен:
01.04.2015
Размер:
505.13 Кб
Скачать

Заключение

В соответствии с поставленными задачами в настоящей работе рассмотрена математическая модель деформирования каркасно-пружинной модели твердого тела, определенная системой линейных алгебраических уравнений и решается методом Гаусса-Зейделя и методом верхней релаксации для ускорения сходимости.

Рассмотренная модель реализована в виде отдельного программного обеспечения. В ходе его написания были вскрыты основные методологические проблемы и общие принципы математического моделирования деформации тел.

Таким образом, построение эффективной математической модели для основных задач теории упругости, включающие в себя исследования деформации тел, а также разработка алгоритмов численного решения этих задач позволило более широко осмыслить методологию построения сложных алгоритмов учитывающих большое количество переменных. Глубоко разобраться в двумерных и трехмерных системах, что в дальнейшем сумеет, оказать полезный опыт при работе с задачами включающие в себя двухмерные, трехмерные системы и методы и алгоритмы, рассмотренные в данной работе. В то время как такие типы задач встречаются довольно часто.

Проведенный численный анализ метода реализации СЛАУ показал преимущества прямого метода (метод Гаусса-Зейделя)перед остальными итерационными методами.

Список использованной литературы

  1. Александров А. В., Потапов В. Д. Основы теории упругости и пластичности.—М.: Высшая школа, 1990.— 400с.

  2. Барашков В.Н., Люкшин Б.А. Алгоритм реализации трехмерной задачи теории упругости и пластичности // Моделирование в механике: Сборник научных трудов / РАН. Сибирское отделение. Интернат теории прикладной механики. —Новосибирск, 1993. —Т. 7 (24), № 4.— 10-25.

  3. Бахвалов И.В., Жидков Н.П., Кобельков Г.М. Численные методы. Москва— Санкт-Петербург, Физматлит. 2000.— 622с.

  4. Димитриенко Ю. И. Нелинейная механика сплошной среды.—М.: Физматлит, 2010,—624с.

  5. Ильюшин А.А., Ленский В.С. Сопротивление материалов. —М., Физматгиз, 1959

  6. Каландия А.И. Математические методы двумерной упругости. М: Наука, 1973.—303с.

  7. Калиткин Н. Н. Численные методы.—М.: Наука, 1978.— 512с.

  8. Курош А.Г. Курс высшей алгебры.—М: Наука. 1971.—431с.

  9. Ландау Л.Д., Лившиц Е.М. Теория упругости. 4-е изд.— М.: Наука, 1987.— 246с.

  10. Лихачёв В. А., Малинин В. Г. Структурно-аналитическая теория прочности.— СПб.: Наука. 1993.— 471с.

  11. Лурье А. И. Нелинейная теория упругости.— М.: Наука, 1980.— 512с.

  12. Лурье А. И. Теория упругости.— М.: Наука, 1970.— 940с.

  13. Нох В.Ф. Совместный эйлерово-лагранжев (СЭЛ) метод для расчета нестационарных двумерных задач // Вычислительные методы в гидродинамике.—М., 1967.—128-184с.

  14. Седов Л. И. Механика сплошной среды. Том 1.— М.: Наука, 1970.

  15. Трусделл К. Первоначальный курс рациональной механики сплошной среды.— М.: Наука, 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.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]