
Програмки с отчётами по числакам / 3. Краевая задача для ОДУ 2 порядка / 3. Вар 2
.docxМинистерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение Высшего профессионального образования
НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ЯДЕРНЫЙ УНИВЕРСИТЕТ
Отчёт по лабораторной работе № 3
«ЧИСЛЕННОЕ РЕШЕНИЕ КРАЕВОЙ ЗАДАЧИ ДЛЯ ОБЫКНОВЕННОГО ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ»
Программа/ Результат |
Теоретический материал |
Оценка |
|
|
|
Группа: Ф-03
Курс: Численные методы
Выполнил:
Преподаватель: Рябов Павел Николаевич
Москва 2012 год
1. Полная постановка задачи:
2. График
точного решения
Для шага h=0.05
Точное решение задачи, |
Численное
решение задачи с аппроксимацией
краевых условий с первым порядком
точности,
|
Численное
решение задачи с аппроксимацией
краевых условий со вторым порядком
точности,
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
Модуль разности точного решения и численного в первом случае, |
Модуль разности точного решения и численного во втором случае, |
||||||||||||||||||||||||||||||||||||||||||
|
|
Для шага h=0.1
Модуль
разности точного решения и численного
в первом случае,
|
Модуль
разности точного решения и численного
во втором случае,
|
||||||||||||||||||||||
|
|
Код с 1 порядком аппроксимации
//1 poryadok approximacii
uses math ;
function p(x:real):real; //pered u'
begin
p:= -tanh(x);
end;
function q(x:real):real; //pered u
begin
q:= cosh(x)*cosh(x);
end;
function f(x:real):real; //posle znaka =
begin
f:= (x*cosh(x)*cosh(x)-tanh(x))/3 ;
end;
function y0(x:real):real; //to4noe reshenye
begin
y0:= sin(sinh(x))+x/3;
end;
type mat=array[0..100] of real ;
var x,h:real;
n,i:integer;
f1:text;
t,x0,a,b:mat; {zadaem matricy, t - dlya koefficientov a=t[0],b=t[1],c=t[2],d=t[3]
(a,b,c - koefficienty treh diagonal'noy matricy);
x0 - dlya resheniy v tochkah;
a - dlya koefficientov A(i);
b - dlya koefficientov B(i);
chto za koefficienty? - smotret' lekcii! }
begin
assign(f1,'out3-1.txt');
rewrite(f1);
h:=0.05; //shag
n:=20; // 1/h - chislo tochek
// approximaciya na levoi granice - zapicyvaem
// uravneniye a0*y(-1)+b0*y0+c0*y1=d0
t[0]:= 0.0; // a0 vsegda =0
t[1]:= (1-h); // b0
t[2]:= -1; // c0
t[3]:=-4*h/3; // d0
// Pryamoi hod
a[0]:=-t[2]/t[1]; //A(0) i B(0) pered pryamym hodom
b[0]:=t[3]/t[1];
for i:=1 to n-1 do
begin
t[0]:=(1/(h*h))-p(i*h)/(2*h);
t[1]:=-2/(h*h)+q(i*h);
t[2]:=1/(h*h)+p(i*h)/(2*h);
t[3]:=f(i*h); {ai,bi,ci,di}
a[i]:=-t[2]/(t[1]+t[0]*a[i-1]);{A(i)}
b[i]:=(t[3]-t[0]*b[i-1])/(t[1]+t[0]*a[i-1]);{B(i)}
end;
// approximaciya na pravoi granice - zapicyvaem
// uravneniye an*y(n-1)+bn*yn+cn*y(n+1)=dn
t[0]:= 1.0 ; // an
t[1]:=-1.0 ; // bn
t[2]:= 0.0 ; // cn = 0
t[3]:=-0.9280*h; // dn
//Obratny hod
a[n]:=0; {A(n)=0! iz lekcii}
b[n]:=(t[3]-t[0]*b[n-1])/(t[1]+t[0]*a[n-1]);
x0[n]:=b[n];
for i:=n-1 downto 0 do
x0[i]:=a[i]*x0[i+1]+b[i];
// Vyvod polychennyh znacheny
writeln(f1,' y u0 y[i]-u0[i]');
writeln(f1,' ') ;
for i:=0 to n do
writeln(f1,x0[i]:1:4,' ',y0(h*i):1:6,' ',abs(x0[i]-y0(h*i)):1:6);
close(f1);
readln;
end.
Код со 2 порядком аппроксимации
//2 poryadok approximacii
uses math ;
function p(x:real):real; //pered u'
begin
p:= -tanh(x);
end;
function q(x:real):real; //pered u
begin
q:= cosh(x)*cosh(x);
end;
function f(x:real):real; //posle znaka =
begin
f:= (x*cosh(x)*cosh(x)-tanh(x))/3 ;
end;
function y0(x:real):real; //to4noe reshenye
begin
y0:= sin(sinh(x))+x/3;
end;
type mat=array[0..100] of real ;
var x,h:real;
n,i:integer;
f1:text;
t,x0,a,b:mat; {zadaem matricy, t - dlya koefficientov a=t[0],b=t[1],c=t[2],d=t[3]
(a,b,c - koefficienty treh diagonal'noy matricy);
x0 - dlya resheniy v tochkah;
a - dlya koefficientov A(i);
b - dlya koefficientov B(i);
chto za koefficienty? - smotret' lekcii! }
begin
assign(f1,'out3-2.txt');
rewrite(f1);
h:=0.10; //shag
n:=10; // 1/h - chislo tochek
// approximaciya na levoi granice - zapicyvaem
// uravneniye a0*y(-1)+b0*y0+c0*y1=d0
t[0]:= 0.0; // a0 vsegda =0
t[1]:=1-h-h*h/2; // b0
t[2]:=-1.0; // c0
t[3]:=-4*h/3; // d0
// Pryamoi hod
a[0]:=-t[2]/t[1]; //A(0) i B(0) pered pryamym hodom
b[0]:=t[3]/t[1];
for i:=1 to n-1 do
begin
t[0]:=(1/(h*h))-p(i*h)/(2*h);
t[1]:=-2/(h*h)+q(i*h);
t[2]:=1/(h*h)+p(i*h)/(2*h);
t[3]:=f(i*h); {ai,bi,ci,di}
a[i]:=-t[2]/(t[1]+t[0]*a[i-1]);{A(i)}
b[i]:=(t[3]-t[0]*b[i-1])/(t[1]+t[0]*a[i-1]);{B(i)}
end;
// approximaciya na pravoi granice - zapicyvaem
// uravneniye an*y(n-1)+bn*yn+cn*y(n+1)=dn
t[0]:= 1.0 ; // an
t[1]:= h*h/2*q(1)-1; // bn
t[2]:= 0.0 ; // cn = 0
t[3]:=h*h/2*(f(1)-0.9280*p(1))-0.9280*h ; // dn
//Obratny hod
a[n]:=0; {A(n)=0! iz lekcii}
b[n]:=(t[3]-t[0]*b[n-1])/(t[1]+t[0]*a[n-1]);
x0[n]:=b[n];
for i:=n-1 downto 0 do
x0[i]:=a[i]*x0[i+1]+b[i];
// Vyvod polychennyh znacheny
writeln(f1,' y u0 y[i]-u0[i]');
writeln(f1,' ') ;
for i:=0 to n do
writeln(f1,x0[i]:1:6,' ',y0(h*i):1:6,' ',abs(x0[i]-y0(h*i)):1:6);
close(f1);
readln;
end.