Метод Симпсона (парабол)

В этом методе отрезок [a,в] разбивается на 2n частей, длинной h= и ординаты сверху соединяются кривой второго порядка (3 соседних точки).

 

     
 
h

 


Расчетная формула имеет вид :

у (y0 + 4y1+ 2y2 + 4y3 + …+ 4y2n*1 + y2n)

y0= f(a), y1= f(a+2h), y2= f(a+2h)… y2n-1= f(в-h)

y2n= f(в).

+1при i- нечётн. -1 при i- чётн.  
Для упрощения расчётов введём переменную сi

ci=          , тогда формула примет вид:

у (f(a)+f(в)+ (3+ci))


PROGRAM PRYAMOUGOLNIK;

CONST a= 0.4; b= 1.2; n=100;

var x,y:real;

у=0; х=а
i: integer;

function f (x:real):real;

begin

y=y+f(x)
f:= (sin(x*x+0.5)/cos(x*x+0.5))/(1+2*x*x);

end;

x=x+(b-a)/n
begin

y:=0; x:=a;

y=y*(b-a)/n
for i:=0 to n do

begin

y:=y+f(x);

 x:=x+(b-a)/n;

end;

y:=y*(b-a)/n;

writeln('y=',y:8:5);

readln;

end.

ОТВЕТ:

y=0.28099



у=0; х=а
PROGRAM TRAPEZIA;

h=(b-a)/n x=a+h
CONST a=0.4; b=0.8; n=100;

var x,y,h,s:real;

s:=(f(a)+f(b))/2
n: integer;

function f (x:real):real;

begin

s=s+f(x)
f:= (sin(x*x+0.5)/cos(x*x+0.5))/(1+2*x*x);

end;

x:=x+h
begin

h:=(b-a)/n; 

y:=s*h
x:=a+h;

s:=(f(a)+f(b))/2;

while x<=b-h do

begin

s:=s+f(x);

x:=x+h;

end;

y:=s*h;

writeln('y=',y:8:5);

readln;

end.

ОТВЕТ:

y=0.28173


     
 


h=(b-a)/2n  
PROGRAM SIMPSON;

s:=f(a)+f(b)
LABEL 10;

CONST a= 0.4; b=0.8; n=100;

c:=1 x:=x+h
var x,y,h,s:real;

c,n: integer;

s:=s+(3+c)*f(x)
function f (x:real):real;

begin

x:=x+h
f:= (sin(x*x+0.5)/cos(x*x+0.5))/(1+2*x*x);

c=-c
end;

begin

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

s:=f(a)+f(b);

y:=s*h/3
c:=1;

x:=a+h;

10: s:=s+(3+c)*f(x);

x:=x+h;

c:=-c;

if x<= b-h then goto 10;

y:=s*h/3;

writeln('y=',y:8:5);

readln;

end.

ОТВЕТ:

y= 0.27919

Решение интеграла в ППП "Eureka"

y=integ((sin(x^2+0.5)/cos(x^2+0.5))/(1+2*x^2),x,0.4,0.8)

y=0.2823564







Методы решения дифференциальных уравнений

При использовании различных протекающих во времени процессах первым этапом является составление дифференциального уравнения, описывающего процесс, а вторым – поиск решения этого уравнения. Дифференциальным уравнением называется равенство, связывающее значение аргумента, неизвестной функции некоторых ее производных. Наивысший порядок входящих в уравнение производных называется порядком дифференциального уравнения.

Рассмотрим уравнение вида:

y=f(x,y) (1)

Уравннение (1) имеет бесконечное множество решений (рис. 1) – через каждую точку плоскости проходит интегральная кривая. Чтобы выделить одну кривую, нужно указать точку плоскости, через которую проходит кривая, т.е. указать так называемые начальные уравнения (значения x=x0 и y=y0)     (2)

Метод Эйлера

Одним из методов решения дифференциального уравнения (1) с начальным условием (2) является метод Эйлера.

Будем рассматривать уравнение (1) на некотором отрезке [a,b]. Пусть отрезок поделен на n частей с шагом .

Обозначим X0=a, X1=X0+h, X2=X0+2h,…, Xn=X0+nh=b. Обозначим искомые y(X1),…y(Xn) через y1…yn.

Методика решения уравнения (1) с начальными условиями (2) связяна с разложением решения в ряд Тейлора в h-окрестности точки X0.

 При отбрасывании членов ряда, содержащие производные второго и высшего порядков, получим

где f(X,y) – правая часть уравнения (1).

Таким образом,

.

При достаточно малой величине шага h метод Эйлера дает решения с большей точностью, т.к. погрешность близка к h2 (h<<1) на каждом шаге интегрирования.

Метод Рунге-Кутта

 

Недостатком метода Эйлера является змедление вычислений при выборе малой величины шага h, задающей точность решения.

Наиболее распространенным методом численного интегрирования дифференциальных уравнений служит метод Рунге-Кутта, обеспечивающий ускорение за счет большей точности вычислений на каждом шаге. Точность метода Рунге-Кутта оценивается величиной E≈h2.

Уточнение достигается за счет специального подбора координат четурех точек, в которых вычисляется первая производная f(x,y). Вместо первой производной h∙f(x,y) используемой в формуле Эйлера, вычисляется усредненная первая производная fi.

Формулы интегрирования по методу Рунге-Кутта имеют вид:

где


h=(xn – x0)/n i=0,1,2,…n

y’=(1-y2)cos(x)+0.6y

при х0=0; xn=1; у0=0; h=0.1

program eyler;

label 100;

const h=0.1; x0=0; xk=1; у0=0;

х0=а;

var h,y,x:real;

i: integer;

function f (x,y: real): real;

begin

f:= (1-y*y)*cos(x)+0.6*y;

end;

begin

y:=y0; x:=x0;

100: y:=y+h*f(x,y);

x:=x+h;

writeln(‘ x=',x:5:1,'  y=',y:8:5);

if x<xk then goto 100;   

readln;

end.

ответ:

x=0.1 y=0.1000

x=0.2   y=0.2045

x=0.3 y=0.3107

x=0.4 y=0.4156

x=0.5 y=0.5168

x=0.6 y=0.6121

x=0.7 y=0.7004

x=0.8 y=0.7814

x=0.9   y=0.8554

x=1.0 y=0.9234

 

y’=(1-y2)cos(x)+0.6y

при х0=0; xn=1; у0=0; h=0.1

 

program rungekutta;

label 100;

var

x,p,x0,y0,xk,y,a,b,c,d,h:real;

 

function f(x,y:real):real;

begin

f:= (1-y*y)*cos(x)+0.6*y;

end;

 

 begin

x0:= 0; xk:=1; y0:= 0; h:=0.1;

x:=x0;y:=y0;

100: a:=h*f(x,y);

b:=h*f(x+h/2,y+a/2);

c:=h*f(x+h/2,y+b/2);

d:=h*f(x+h,y+c);

p:=(a+2*b+2*c+d)/6;

y:=y+p;

writeln('x=',x:8:1,'y=',y:8:5);

if x<xk then goto 100;

readln;

end.

 

ответ:

x=0.1 y=0.1025

x=0.2   y=0.2082

x=0.3 y=0.3141

x=0.4 y=0.4173

x=0.5 y=0.5156

x=0.6 y=0.6076

x=0.7 y=0.6926

x=0.8 y=0.7705

x=0.9   y=0.8419

x=1.0 y=0.9081





Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: