Главная страница
Культура
Искусство
Языки
Языкознание
Вычислительная техника
Информатика
Финансы
Экономика
Биология
Сельское хозяйство
Психология
Ветеринария
Медицина
Юриспруденция
Право
Физика
История
Экология
Промышленность
Энергетика
Этика
Связь
Автоматика
Математика
Электротехника
Философия
Религия
Логика
Химия
Социология
Политология
Геология

Дипломная работа По специальности 230105. 65 Программное обеспечение вычислительной техники и автоматизированных систем



Скачать 493.29 Kb.
НазваниеДипломная работа По специальности 230105. 65 Программное обеспечение вычислительной техники и автоматизированных систем
АнкорDiplom-cho.docx
Дата12.01.2018
Размер493.29 Kb.
Формат файлаdocx
Имя файлаDiplom-cho.docx
ТипДиплом
#14938
страница4 из 4
1   2   3   4

Заключение


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

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

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

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

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


  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.
1   2   3   4
написать администратору сайта