Xreferat.com » Рефераты по математике » Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь

Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь

width="74" height="22" align="BOTTOM" border="0" />. Тоді


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


Зауваження:

На стійкість різницевої схеми впливає не тільки апроксимація рівнянь (1) (тобто оператора А), але, і особливо, крайових умов (2).

Якщо змінних у задачі мало, то розглядають безумовну й умовну стійкість;

Збіжність різницевої схеми

Розв’язуючи сіткову задачу (3)-(4) нас цікавить близькість сіткового розв’язку у(х) до розв’язку и(х) задачі (1)-(2). Різницевий розв’язок у(х) збігається до розв’язку и(х), якщо


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь (10)

Різницевий розв’язок має порядок точності Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь, якщо


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь (10')


Нагадаємо ще раз, що ми розглядаємо лише коректні різницеві схеми (3)-(4), тобто рішення різницевої схеми існує і єдино при будь-яких вхідних даних Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь и Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь з заданих класів функцій і схема стійка по вхідним даної (її рішення неперервно них залежить).

Теорема: Якщо розв’язок задачі (1)-(2) Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь існує, різницева схема (3)-(4) коректна и апроксимує задачу (1)-(2), то різницевий розв’язок Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь збігається до точного:


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


("Апроксимація + Стійкість =>Збіжність").

Доведення: Запишемо нев’язку різницевої схеми (3)-(4).


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь (*)


Функція u(x) задовольняє задачі (*) — збуреній задачі (3)-(4). Так як схема стійка, то Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь:


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


В силу апроксимації Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь має місце

Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


Таким чином: Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь маємо


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


тобто Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь і при Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь

Зауваження:

Якщо яка-небудь дана нам умова апроксимується точно, то стійкість по ній можна не вимагати, тому що вона не вносить похибки у розв’язок (окрім помилок округлення, тоді стійкість по цим даним потрібна).

Для умовної апроксимації (чи стійкості) збіжність теж носить умовний характер.


Програмна реалізація(представлена на мові Delphi)


Розв’язати диференційне рівняння:


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


З крайовими умовами:


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь

Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


Розв’язання з використанням методу Гауса:


unit Unit1;


interface


uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Buttons;


type

TForm1 = class(TForm)

Panel1: TPanel;

Label1: TLabel;

Image1: TImage;

Image2: TImage;

Label2: TLabel;

LabeledEdit1: TLabeledEdit;

LabeledEdit2: TLabeledEdit;

LabeledEdit3: TLabeledEdit;

LabeledEdit4: TLabeledEdit;

LabeledEdit5: TLabeledEdit;

LabeledEdit6: TLabeledEdit;

LabeledEdit7: TLabeledEdit;

LabeledEdit8: TLabeledEdit;

LabeledEdit9: TLabeledEdit;

LabeledEdit10: TLabeledEdit;

LabeledEdit11: TLabeledEdit;

Label3: TLabel;

Label4: TLabel;

SpeedButton1: TSpeedButton;

LabeledEdit12: TLabeledEdit;

Label5: TLabel;

Image3: TImage;

procedure FormCreate(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;


var

Form1: TForm1;


type Dynmas=array of array of real;


dynvec=array of real;


var a,b,pi,qi,fi,a1,a2,b1,b2,AA,BB:real;

eps,h:real;

c:dynmas;

st,m,i:integer;

x,d,y,memory:dynvec;

t_all,tx,ty,k_i:textfile;

g:boolean;


str:string;


implementation


uses Unit2;


{$R *.dfm}

function Gauss(n:Integer; a:dynmas; b:dynVec; var x:dynVec):Boolean;

Var i,j,k,l:Integer;

q,m,t:real;

Begin

for k:=0 to n-2 do

begin

l:=-1;

m:=0;

for i:=k to n-1 do

if Abs(a[i, k])>m then

begin

m:=Abs(a[i, k]);

l:=i;

end;

if l=-1 then

begin

Gauss:=false;

Exit;

end;

if l<>k then

begin

For j:=0 to n-1 do

begin

t:=a[k,j];

a[k,j]:=a[l,j];

a[l,j]:=t;

end;

t:=b[k];

b[k]:=b[l];

b[l]:=t;

end;

for i:=k+1 to n-1 do

begin

q:=a[i,k]/a[k,k];

for j:=0 to n-1 do

If j=k then

a[i,j]:= 0

else

a[i,j]:= a[i,j]-q*a[k,j];

b[i]:=b[i]-q*b[k];

end;

end;


if a[n-1,n-1]<>0 then

x[n-1]:=b[n-1]/a[n-1,n-1]

else

begin

Gauss:=false;

Exit;

end;


for i:=n-2 downto 0 do

begin

t:=0;

for j:=1 to n-i do

t:=t+a[i,i+j]*x[i+j];

x[i]:=(1/a[i,i])*(b[i]-t);

end;

Gauss := true;

end;


procedure Koef(var s:dynmas; k:integer; h:real; v:dynvec; var z:dynvec);

var i:integer;

begin

s[0,0]:=h*a1-a2; s[0,1]:=a2;

z[0]:=h*AA;

for i:=0 to 2*(k-1) do

begin

s[i+1,i]:=1-(h*pi*ln(v[i]))/2;

s[i+1,i+1]:=h*h*qi-2;

s[i+1,i+2]:=1+(h*pi*ln(v[i]))/2;

z[i+1]:=h*h*fi;

end;

s[2*k,2*k-1]:=-b2; s[2*k,2*k]:=h*b1+b2;

z[2*k]:=h*BB;

end;


procedure TForm1.FormCreate(Sender: TObject);

begin

getdir(0,str);

str:=str+'otv';

end;


procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

if (form1.LabeledEdit1.Text='') and

(form1.LabeledEdit9.Text='') and

(form1.LabeledEdit12.Text='') then

begin

showmessage('так як ви не ввели коефіцієнти, то программа буде задіяна зі стандартним набором данних');

pi:=-1;

qi:=-2;

fi:=1;

a1:=1;

a2:=-1;

a:=0.5;

AA:=1;

b1:=1;

b2:=1;

b:=1.5;

BB:=0;

eps:=0.0001;

end

else

begin

pi:=strtofloat(form1.LabeledEdit1.Text);

qi:=strtofloat(form1.LabeledEdit2.Text);

fi:=strtofloat(form1.LabeledEdit3.Text);

a1:=strtofloat(form1.LabeledEdit4.Text);

a2:=strtofloat(form1.LabeledEdit5.Text);

a:=strtofloat(form1.LabeledEdit6.Text);

AA:=strtofloat(form1.LabeledEdit7.Text);

b1:=strtofloat(form1.LabeledEdit8.Text);

b2:=strtofloat(form1.LabeledEdit9.Text);

b:=strtofloat(form1.LabeledEdit10.Text);

BB:=strtofloat(form1.LabeledEdit11.Text);

eps:=strtofloat(form1.LabeledEdit12.Text);

end;


form2.Series1.Clear;

AssignFile(t_all,str+'otv.txt');

AssignFile(tx,str+'otv_x.txt');

AssignFile(ty,str+'otv_y.txt');

AssignFile(k_i,str+'otv_krok_vuzl.txt');

Rewrite(t_all);

m:=1;

g:=false;

While not g do

begin

h:=(b-a)/(2*m);

SetLength(y,2*m+1);

SetLength(x,2*m+1);

SetLength(d,2*m+1);

for i:=0 to 2*m do

x[i]:=a+i*h;

Setlength(c,2*m+1);

for i:=0 to 2*m do

Setlength(c[i],2*m+1);


Koef(c,m,h,x,d);


if gauss(2*m+1,c,d,y)<>true then

break;

if m<>1 then

for i:=0 to m do

if abs(memory[i]-y[2*i])/15>eps then

begin

g:=false;

break;

end

else

g:=true;

SetLength(memory,2*m+1);

memory:=Copy(y);

if g then

writeln(t_all,'Крайова задача розвязана з точністю eps =',eps:0:4);

for i:=0 to 2*m do

begin

write(t_all,y[i]:0:10);

write(t_all,' ');

writeln(t_all,x[i]:0:10);

end;

Writeln(t_all,'Кількість вузлів - ',2*m+1);

Writeln(t_all,'Крок сітки - ',h:0:10);

Writeln(t_all);

st:=m;

m:=m*2;

end;

rewrite(ty);

rewrite(tx);

rewrite(k_i);

writeln(k_i,h:0:10);

writeln(k_i,2*m+1);

form2.StringGrid1.ColCount:=2*st+2;

for i:=0 to (2*st+1) do

begin

form2.StringGrid1.Cells[i+1,0]:=inttostr(i+1);

form2.StringGrid1.Cells[i+1,1]:=floattostr(x[i]);

form2.StringGrid1.Cells[i+1,2]:=floattostr(y[i]);

writeln(ty,y[i]:0:10);

writeln(tx,x[i]:0:10);

end;

for i:=0 to (2*st) do

form2.Series1.AddXY(x[i],y[i]);

form2.Label1.Caption:='Крок сітки - '+floattostr(h);

form2.Label2.Caption:='Кількість вузлів - '+floattostr(2*st+1);

CloseFile(t_all);

CloseFile(tx);

CloseFile(ty);

CloseFile(k_i);

form2.Show;

end;


end.


Результати записуємо у файл.

Графік отриманий програмою:


Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


Розв’язання з використанням методу прогонки:


unit Unit1;


interface


uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Buttons;


type

TForm1 = class(TForm)

Panel1: TPanel;

Label1: TLabel;

Image1: TImage;

Image2: TImage;

Label2: TLabel;

LabeledEdit1: TLabeledEdit;

LabeledEdit2: TLabeledEdit;

LabeledEdit3: TLabeledEdit;

LabeledEdit4: TLabeledEdit;

LabeledEdit5: TLabeledEdit;

LabeledEdit6: TLabeledEdit;

LabeledEdit7: TLabeledEdit;

LabeledEdit8: TLabeledEdit;

LabeledEdit9: TLabeledEdit;

LabeledEdit10: TLabeledEdit;

LabeledEdit11: TLabeledEdit;

Label3: TLabel;

Label4: TLabel;

SpeedButton1: TSpeedButton;

LabeledEdit12: TLabeledEdit;

Label5: TLabel;

Image3: TImage;

procedure FormCreate(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;


var

Form1: TForm1;


type Dynmas=array of array of real;

dynvec=array of real;


var a,b,pi,qi,fi,a1,a2,b1,b2,AA,BB:real;

eps,h:real;

c:dynmas;

st,m,i:integer;

w_,v_,x,d,y,memory:dynvec;

t_all,tx,ty,k_i:textfile;

g:boolean;

time1,time2,vremja:longint;

str:string;


implementation


uses Unit2;


{$R *.dfm}


Function Timer:longint;

const c60:longint=60;

var h,m,s,s100:word;

begin

decodetime(now,h,m,s,s100);

timer:=((h*c60+m)*c60+s)*100+s100;

end;


function progonka(n:Integer; a:dynmas; b:dynVec; var x:dynVec):boolean;

Var i,j,k,l:Integer;

q,m,t:real;

ls:integer;

Begin

{прямой ход}

w_[0]:=(-a[0,1]/a[0,0]);

v_[0]:=(d[0]/a[0,0]);

for i:=1 to n-1 do

begin

w_[i]:=-(a[i,i+1]/(a[i,i-1]*w_[i-1]+a[i,i]));

v_[i]:=(d[i]-a[i,i-1]*v_[i-1])/(a[i,i-1]*w_[i-1]+a[i,i]);

end;

{w_[n]:= ;

v_[n]:= ;}


for i:=0 to n-1 do

begin

x[i]:=v_[i]+w_[i]*x[i+1];

end;

x[n-1]:=v_[n-1];


{обратный ход}

x[n-1]:=v_[n-1];

for i:=n-1 downto 0 do

begin

x[i]:=w_[i]*x[i+1]+v_[i];

end;


{for k:=0 to n-2 do

begin

l:=-1;

m:=0;

for i:=k to n-1 do

if Abs(a[i, k])>m then

begin

m:=Abs(a[i, k]);

l:=i;

end;

if l=-1 then

begin

progonka:=false;

Exit;

end;

if l<>k then

begin

For j:=0 to n-1 do

begin

t:=a[k,j];

a[k,j]:=a[l,j];

a[l,j]:=t;

end;

t:=b[k];

b[k]:=b[l];

b[l]:=t;

end;


for i:=k+1 to n-1 do

begin

q:=a[i,k]/a[k,k];

for j:=0 to n-1 do

If j=k then

a[i,j]:= 0

else

a[i,j]:= a[i,j]-q*a[k,j];

b[i]:=b[i]-q*b[k];

end;

end;


if a[n-1,n-1]<>0 then

x[n-1]:=b[n-1]/a[n-1,n-1]

else

begin

progonka:=false;

Exit;

end;


for i:=n-2 downto 0 do

begin

t:=0;

for j:=1 to n-i do

t:=t+a[i,i+j]*x[i+j];

x[i]:=(1/a[i,i])*(b[i]-t);

end;}


progonka := true;


end;


procedure Koef(var s:dynmas; k:integer; h:real; v:dynvec; var z:dynvec);

var i:integer;

begin

s[0,0]:=h*a1-a2; s[0,1]:=a2;

z[0]:=h*AA;

for i:=0 to 2*(k-1) do

begin

s[i+1,i]:=1-(h*pi*ln(v[i]))/2;

s[i+1,i+1]:=h*h*qi-2;

s[i+1,i+2]:=1+(h*pi*ln(v[i]))/2;

z[i+1]:=h*h*fi;

end;

s[2*k,2*k-1]:=-b2; s[2*k,2*k]:=h*b1+b2;

z[2*k]:=h*BB;

end;


procedure TForm1.FormCreate(Sender: TObject);

begin

getdir(0,str);

str:=str+'otv';

vremja:=0;

end;


procedure TForm1.SpeedButton1Click(Sender: TObject);

begin

if (form1.LabeledEdit1.Text='') and

(form1.LabeledEdit9.Text='') and

(form1.LabeledEdit12.Text='') then

begin

showmessage('так як ви не ввели коефіцієнти, то программа буде задіяна зі стандартним набором данних');

pi:=-1;

qi:=-2;

fi:=1;

a1:=1;

a2:=-1;

a:=0.5;

AA:=1;

b1:=1;

b2:=1;

b:=1.5;

BB:=0;

eps:=0.0001;

end

else

begin

pi:=strtofloat(form1.LabeledEdit1.Text);

qi:=strtofloat(form1.LabeledEdit2.Text);

fi:=strtofloat(form1.LabeledEdit3.Text);

a1:=strtofloat(form1.LabeledEdit4.Text);

a2:=strtofloat(form1.LabeledEdit5.Text);

a:=strtofloat(form1.LabeledEdit6.Text);

AA:=strtofloat(form1.LabeledEdit7.Text);

b1:=strtofloat(form1.LabeledEdit8.Text);

b2:=strtofloat(form1.LabeledEdit9.Text);

b:=strtofloat(form1.LabeledEdit10.Text);

BB:=strtofloat(form1.LabeledEdit11.Text);

eps:=strtofloat(form1.LabeledEdit12.Text);

end;

time2:=timer;


form2.Series1.Clear;

AssignFile(t_all,str+'otv.txt');

AssignFile(tx,str+'otv_x.txt');

AssignFile(ty,str+'otv_y.txt');

AssignFile(k_i,str+'otv_krok_vuzl.txt');

Rewrite(t_all);

m:=1;

g:=false;


While not g do

begin

h:=(b-a)/(2*m);


SetLength(y,2*m+1);

SetLength(x,2*m+1);

SetLength(d,2*m+1);

SetLength(w_,2*m+1);

SetLength(v_,2*m+1);

for i:=0 to 2*m do

x[i]:=a+i*h;

Setlength(c,2*m+1);

for i:=0 to 2*m do

Setlength(c[i],2*m+1);


Koef(c,m,h,x,d);


if progonka(2*m+1,c,d,y)<>true then

break;


if m<>1 then

for i:=0 to m do

if abs(memory[i]-y[2*i])/15>eps then

begin

g:=false;

break;

end

else

g:=true;

SetLength(memory,2*m+1);

memory:=Copy(y);

if g then

writeln(t_all,'Крайова задача розвязана з точністю eps =',eps:0:4);

for i:=0 to 2*m do

begin

write(t_all,y[i]:0:10);

write(t_all,' ');

writeln(t_all,x[i]:0:10);

end;

Writeln(t_all,'Кількість вузлів - ',2*m+1);

Writeln(t_all,'Крок сітки - ',h:0:10);

Writeln(t_all);

st:=m;

m:=m*2;

end;

rewrite(ty);

rewrite(tx);

rewrite(k_i);

writeln(k_i,h:0:10);

writeln(k_i,2*m+1);

form2.StringGrid1.ColCount:=2*st+2;

for i:=0 to (2*st+1) do

begin

form2.StringGrid1.Cells[i+1,0]:=inttostr(i+1);

form2.StringGrid1.Cells[i+1,1]:=floattostr(x[i]);

form2.StringGrid1.Cells[i+1,2]:=floattostr(y[i]);

writeln(ty,y[i]:0:10);

writeln(tx,x[i]:0:10);

end;

for i:=0 to (2*st) do

form2.Series1.AddXY(x[i],y[i]);

form2.Label1.Caption:='Крок сітки - '+floattostr(h);

form2.Label2.Caption:='Кількість вузлів - '+floattostr(2*st+1);

time1:=timer;

vremja:=abs(time2-time1);

form2.Label3.Caption:='час роботи: '+floattostr(vremja*0.01)+' секунд(и)';

writeln(k_i,vremja*0.01:0:5);

CloseFile(t_all);

CloseFile(tx);

CloseFile(ty);

CloseFile(k_i);

form2.Show;

end;


end


Результати записуємо у файл.

Графік отриманий програмою:

Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


Якщо проаналізувати ці два приклади програми:

1)з використанням методу Гауса для розв’язання тридіагональної матриці;

2)з використанням методу прогонки для розв’язання тридіагональної матриці.

Ми можемо сказати, що для однієї і тієї ж задачі час розв’язання з використанням 1ого методу складає 2,99 сек., а для 2ого 0.1 сек. Така розбіжність у часі випливає з того, що метод прогону є модифікацією методу Гауса і призначений спеціально для розв’язку матриць з 3и і 5и діагональними структурами.

Розв’язуємо задачу за допомогою пакету Mathematica:

Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь


100

0.01

-0.123705

Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь

MultipleListPlot[{{0.5,0.154796},{0.51,0.146438},{0.52,0.138265},{0.53,0.130272},{0.54,0.122456},{0.55,0.114812},{0.56,0.107336},{0.57,0.100024},{0.58,0.0928731},{0.59,0.0858792},{0.6,0.079039},{0.61,0.0723491},{0.62,0.0658064},{0.63,0.0594079},{0.64,0.0531504},{0.65,0.0470312},{0.66,0.0410475},{0.67,0.0351966},{0.68,0.0294758},{0.69,0.0238829},{0.7,0.0184152},{0.71,0.0130705},{0.72,0.00784647},{0.73,0.00274101},{0.74,-0.002248},{0.75,-0.00712262},{0.76,-0.0118848},{0.77,-0.0165364},{0.78,-0.0210793},{0.79,-0.0255153},{0.8,-0.029846},{0.81,-0.0340732},{0.82,-0.0381983},{0.83,-0.0422231},{0.84,-0.0461488},{0.85,-0.049977},{0.86,-0.0537091},{0.87,-0.0573463},{0.88,-0.06089},{0.89,-0.0643414},{0.9,-0.0677017},{0.91,-0.0709721},{0.92,-0.0741536},{0.93,-0.0772473},{0.94,-0.0802542},{0.95,-0.0831754},{0.96,-0.0860117},{0.97,-0.0887641},{0.98,-0.0914334},{0.99,-0.0940204},{1.,-0.096526},{1.01,-0.0989509},{1.02,-0.101296},{1.03,-0.103561},{1.04,-0.105748},{1.05,-0.107857},{1.06,-0.109889},{1.07,-0.111844},{1.08,-0.113722},{1.09,-0.115525},{1.1,-0.117252},{1.11,-0.118904},{1.12,-0.120482},{1.13,-0.121985},{1.14,-0.123415},{1.15,-0.124771},{1.16,-0.126054},{1.17,-0.127264},{1.18,-0.128401},{1.19,-0.129466},{1.2,-0.130459},{1.21,-0.131379},{1.22,-0.132228},{1.23,-0.133004},{1.24,-0.133708},{1.25,-0.134341},{1.26,-0.134902},{1.27,-0.135391},{1.28,-0.135808},{1.29,-0.136154},{1.3,-0.136427},{1.31,-0.136628},{1.32,-0.136757},{1.33,-0.136814},{1.34,-0.136798},{1.35,-0.136709},{1.36,-0.136547},{1.37,-0.136312},{1.38,-0.136004},{1.39,-0.135621},{1.4,-0.135164},{1.41,-0.134633},{1.42,-0.134026},{1.43,-0.133344},{1.44,-0.132586},{1.45,-0.131752},{1.46,-0.130841},{1.47,-0.129852},{1.48,-0.128786},{1.49,-0.127641},{1.5,-0.126416}},{{0.5,0.159038},{0.51,0.150628},{0.52,0.142405},{0.53,0.134363},{0.54,0.126498},{0.55,0.118807},{0.56,0.111285},{0.57,0.103929},{0.58,0.0967336},{0.59,0.0896968},{0.6,0.0828146},{0.61,0.0760838},{0.62,0.0695011},{0.63,0.0630634},{0.64,0.0567678},{0.65,0.0506112},{0.66,0.0445911},{0.67,0.0387046},{0.68,0.0329491},{0.69,0.0273222},{0.7,0.0218214},{0.71,0.0164443},{0.72,0.0111888},{0.73,0.00605251},{0.74,0.00103346},{0.75,-0.00387045},{0.76,-0.00866119},{0.77,-0.0133407},{0.78,-0.0179107},{0.79,-0.0223731},{0.8,-0.0267296},{0.81,-0.0309819},{0.82,-0.0351315},{0.83,-0.0391799},{0.84,-0.0431288},{0.85,-0.0469795},{0.86,-0.0507334},{0.87,-0.0543918},{0.88,-0.0579562},{0.89,-0.0614276},{0.9,-0.0648073},{0.91,-0.0680964},{0.92,-0.0712961},{0.93,-0.0744074},{0.94,-0.0774314},{0.95,-0.0803691},{0.96,-0.0832213},{0.97,-0.085989},{0.98,-0.0886731},{0.99,-0.0912744},{1.,-0.0937936},{1.01,-0.0962317},{1.02,-0.0985892},{1.03,-0.100867},{1.04,-0.103065},{1.05,-0.105185},{1.06,-0.107227},{1.07,-0.109192},{1.08,-0.11108},{1.09,-0.112891},{1.1,-0.114627},{1.11,-0.116287},{1.12,-0.117872},{1.13,-0.119382},{1.14,-0.120819},{1.15,-0.122181},{1.16,-0.123469},{1.17,-0.124684},{1.18,-0.125825},{1.19,-0.126894},{1.2,-0.12789},{1.21,-0.128813},{1.22,-0.129664},{1.23,-0.130442},{1.24,-0.131148},{1.25,-0.131781},{1.26,-0.132342},{1.27,-0.132831},{1.28,-0.133248},{1.29,-0.133592},{1.3,-0.133863},{1.31,-0.134062},{1.32,-0.134189},{1.33,-0.134242},{1.34,-0.134222},{1.35,-0.134129},{1.36,-0.133962},{1.37,-0.133722},{1.38,-0.133407},{1.39,-0.133018},{1.4,-0.132554},{1.41,-0.132015},{1.42,-0.1314},{1.43,-0.13071},{1.44,-0.129943},{1.45,-0.129098},{1.46,-0.128177},{1.47,-0.127177},{1.48,-0.126099},{1.49,-0.124942},{1.5,-0.123705}},PlotLegend{Mathematica,Rizn method},PlotJoined{False,True},PlotPosition{0.3,-0.5}]


Отримуємо графіки:

Чисельні методи розв’язування крайових задач для звичайних диференціальних рівнянь

де червона – метод скінченних різниць.

синя – стандартний метод пакету Mathematica

Висновки


Крайова задача для звичайних диференціальних рівнянь є набагато складнішою, ніж задача Коші. Одним із підходів до розв'язання цієї задачі є зведення її до задачі Коші зі змінними початковими умовами. Розв'язок задачі отримують багаторазовим розв'язанням задачі Коші.

У загальному випадку для розв'язання двоточкової крайової задачі (одно- чи багатовимірної, лінійної чи нелінійної) доцільно застосовувати метод прицілювання, а для розв'язання окремих лінійних одновимірних задач — метод композиції двох розв'язків задачі Коші з різними початковими умовами.

Ефективним методом розв'язання лінійної крайової задачі для диференціального рівняння другого порядку є метод скінченних різниць, у якому використовуються різницеві схеми апроксимації для похідних першого і другого порядків. У результаті крайова задача перетворюється на задачу розв'язання системи лінійних рівнянь із тридіагональною матрицею. Цю систему можна розв'язати методом прогону.

Метод скінченних різниць дозволяє також обчислювати власні значення і власні функції крайової задачі, які визначають нетривіальні розв'язки однорідної крайової задачі.

Метод скінченних різниць можна застосовувати і для розв'язання нелінійних крайових задач, але в цьому випадку необхідно лінеаризовувати нелінійні функції, що входять в умову задачі.

Розв'язок крайової задачі у вигляді апроксимуючого аналітичного виразу отримують методами колокацій, Гальоркіна і найменших квадратів введенням базисних функцій, які враховують граничні умови.

Коефіцієнти для базисних функцій та їх композиції, які апроксимують розв'язок крайової задачі, у методі колокацій вибирають з умови нульової нев'язки в обраних вузлах інтервалу розв'язку, у методі найменших квадратів — з умови мінімуму квадрату нев'язки, а в методі Гальоркіна — з умови ортогональності нев'язки до обраних базисних функцій.

У сучасних математичних пакетах розв'язання крайових задач для рівнянь з частинними похідними конкуренцію розглянутим методам складає метод скінчених елементів, що базується на концепціях метода Гальоркіна за умови спеціального вибору базисних функцій.


Література


1.Н.С.Бахвалов, Н.П.Жидков, Г.М.Кобельков «Численные методы»

2.В.А.Буслов, С.Л.Яковлев «Численные методы ІІ.Решение уравнений».-Курс лекций,- СПб, 2001.

3.Н.Н.Калиткин «Численные методы»

4.А.А.Самарский, А.В.Гулин «Численные методы»,- Москва,- «Наука»,-1989г.

5.Б.П.Демидович, И.А.Марон, Э.Э.Шувалов «Численные методы анализа»,-ред. Б.П.Демидовича,- Москва,- «Наука»,- 1967г.

Если Вам нужна помощь с академической работой (курсовая, контрольная, диплом, реферат и т.д.), обратитесь к нашим специалистам. Более 90000 специалистов готовы Вам помочь.
Бесплатные корректировки и доработки. Бесплатная оценка стоимости работы.

Поможем написать работу на аналогичную тему

Получить выполненную работу или консультацию специалиста по вашему учебному проекту
Нужна помощь в написании работы?
Мы - биржа профессиональных авторов (преподавателей и доцентов вузов). Пишем статьи РИНЦ, ВАК, Scopus. Помогаем в публикации. Правки вносим бесплатно.

Похожие рефераты: