Скачиваний:
42
Добавлен:
10.05.2014
Размер:
47.86 Кб
Скачать

Министерство образования и науки Российской Федерации

Федеральное государственное бюджетное образовательное учреждение Высшего профессионального образования

НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ЯДЕРНЫЙ УНИВЕРСИТЕТ

Отчёт по лабораторной работе № 3

«ЧИСЛЕННОЕ РЕШЕНИЕ КРАЕВОЙ ЗАДАЧИ ДЛЯ ОБЫКНОВЕННОГО ДИФФЕРЕНЦИАЛЬНОГО УРАВНЕНИЯ»

Программа/

Результат

Теоретический материал

Оценка

Группа: Ф6-0

Курс: Численные методы

Выполнил:

Преподаватель: Рябов Павел Николаевич

Москва 2012 год

1. Полная постановка задачи:

2. График точного решения :

Для шага h=0.05

Точное решение задачи,

Численное решение задачи с аппроксимацией краевых условий с первым порядком точности,

Численное решение задачи с аппроксимацией краевых условий со вторым порядком точности,

Модуль разности точного решения и численного в первом случае,

Модуль разности точного решения и численного во втором случае,

Для шага h=0.1

Модуль разности точного решения и численного в первом случае,

Модуль разности точного решения и численного во втором случае,

Код с 1 порядком аппроксимации

//1 poryadok approximacii

function p(x:real):real; //pered u'

begin

p:= x/(1+x*x);

end;

function q(x:real):real; //pered u

begin

q:= -1/(1+x*x);

end;

function f(x:real):real; //posle znaka =

begin

f:= (3-2*x+4*x*x)/(1+x*x)*exp(-2*x) ;

end;

function y0(x:real):real; //to4noe reshenye

begin

y0:= sqrt(1+x*x)+exp(-2*x) ;

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,'c:\3-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; // a0 vsegda =0

t[1]:= 1+2*h; // b0

t[2]:= -1; // c0

t[3]:= 6*h; // 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]:= 0 ; // an

t[1]:= 1 ; // bn

t[2]:= 0 ; // cn = 0

t[3]:=1.549549; // 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

function p(x:real):real; //pered u'

begin

p:= x/(1+x*x);

end;

function q(x:real):real; //pered u

begin

q:= -1/(1+x*x);

end;

function f(x:real):real; //posle znaka =

begin

f:= (3-2*x+4*x*x)/(1+x*x)*exp(-2*x) ;

end;

function y0(x:real):real; //to4noe reshenye

begin

y0:= sqrt(1+x*x)+exp(-2*x) ;

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,'c:\3-2.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; // a0 vsegda =0

t[1]:= 1+2*h+h*h/2 ; // b0

t[2]:= -1; // c0

t[3]:= 6*h-h*h/2*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]:= 0 ; // an

t[1]:= 1 ; // bn

t[2]:= 0 ; // cn = 0

t[3]:=1.549549;// 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.

Соседние файлы в папке 3. Краевая задача для ОДУ 2 порядка