Консультация № 178528
20.05.2010, 20:02
45.00 руб.
0 3 1
Помогите разобраться в решении по вычеслительной математике.

В приложении код, хотелось бы понять как он работает. Т.е. не как работает программа (readln, writeln и прочее понятно и так), а именно само решение, связанное непосредственно с математикой. Т.е. функции, формулы, ну Вы меня поняли :-)

Задание звучало так:


Заранее спасибо!

Приложение:
Program Runge;
Uses Crt;

const
a = 0;
b = 1;
e = 0.0000000000001;

Var
ff:text;

xn,xk,yn,h,k0,k1,k2,k3:real;
i,n:integer;
x,y:array [1..20] of real;

dx, x1, y1, integ : real;
n1 : integer;

Function f(x,y:real):real;
begin
f:=cos(6*x+y)+7*(x-y);
end;

Function f1(x,t: real): real;
begin
f1 := x*t*t;
end;

Begin
assign(ff,'1.txt');
rewrite(ff);

ClrScr;
Writeln(' Rewenie diff yravnenijaя ');
Writeln(' dy/dx=cos(6*x+y)+7*(x-y) metodom Rynge-Kytta 2-ogo porjadka');
xn:=0; yn:=1; xk:=1; h:=0.1;
x[1]:=xn; y[1]:=yn; i:=1;
repeat
k0:=h*f(x[i],y[i]);
k1:=h*f(x[i]+1/2*h,y[i]+1/2*k0); {beta 21}
y[i+1]:=y[i]+(0*k0+k1);
x[i+1]:=x[i]+h;
i:=i+1;
until x[i]>xk;
n:=i;
Writeln('----------------------');
Writeln('| # | x | y |');
Writeln('----------------------');
for i:= 1 to n do
begin
Writeln('|', i:2, ' |', x[i]:5:2, ' |', y[i]:7:4, ' |');
Writeln(ff,'|', i:2, ' |', x[i]:5:2, ' |', y[i]:7:4, ' |');
end;
Writeln('----------------------',n);
Writeln(ff,'----------------------',n);
Readln;

integ := y[n]*y[n];
n1 := 1;
y1 := 0;
while integ - y1 > e do
begin

n1 := n1 + 1;
dx := (b - a) / n1;
y1 := 0;
x1 := a + dx;
while x1 < b do
begin
y1 := y1 + f1(x1,y[n]);
x1 := x1 + dx;
end;
y1 :=y1 + ( + (f1(a,y[n]) + f1(b,y[n])) / 2) * dx;
end;

writeln ('Kolichestvo otrezkov razbieniya: ',n1);
writeln ('Priblijennoe znachenie integrala: ',y1:7:6);
writeln ('Tochnoe znachenie integrala : ',integ:7:6);
writeln ('Otnositelnaya pogreshnost vichislenya : ',(integ - y1));

writeln (ff,'Kolichestvo otrezkov razbieniya: ',n1);
writeln (ff,'Priblijennoe znachenie integrala: ',y1:7:6);
writeln (ff,'Tochnoe znachenie integrala : ',integ:7:6);
writeln (ff,'Otnositelnaya pogreshnost vichislenya : ',(integ - y1));

close(ff);
end.

Обсуждение

Неизвестный
20.05.2010, 20:04
общий
PS. Прошу прощения, конечно же вычислительной математике
Неизвестный
20.05.2010, 21:08
общий
Сущность метода можно просмотреть здесь. Вроде все просто и понятно.

Интеграл (количество выделившегося тепла) можно вычислить как сумму чисел:
Q = t*[$8721$]010(yi2),
где t = 0.1 - шаг интегрирования.
давно
Профессор
230118
3054
21.05.2010, 00:36
общий
это ответ
Здравствуйте, Vilgelm.

Метод Рунге-Кутты применяется в этом куске программы.

xn:=0; yn:=1; xk:=1; h:=0.1;
x[1]:=xn; y[1]:=yn; i:=1;
repeat
k0:=h*f(x[i],y[i]);
k1:=h*f(x[i]+1/2*h,y[i]+1/2*k0); {beta 21}
y[i+1]:=y[i]+(0*k0+k1);
x[i+1]:=x[i]+h;
i:=i+1;
until x[i]>xk;
Имеем дифференциальное уравнение y'=f(x,y)
Основная идея методов Рунге-Кутты заключается в том, что производные аппроксимируются через значения функции в точках на интервале [x0,x0+h], которые выбираются из условия близости к ряду Тейлора. Для второго порядка получено однопараметрическое семейство схем вида
y(x0+h)=y0+h[(1-L)f0+Lf(x0+h/2L,y0+f0*h/2L)]
В данной программе применяется параметр L=1
y(x0+h)=y0+h[0*f0+f(x0+h/2,y0+f0*h/2)]
Здесь вычисляется приближенное значение функции в средней точке x0+h/2, и приращение считается исходя из значения функции в этой точке, которое равно значению производного исходя из уравнения.
Метод трапеций записан в куске кода:
integ := y[n]*y[n];n1 := 1;y1 := 0;
while integ - y1 > e do
begin
n1 := n1 + 1;
dx := (b - a) / n1;
y1 := 0;
x1 := a + dx;
while x1 < b do
begin
y1 := y1 + f1(x1,y[n]);
x1 := x1 + dx;
end;
y1 :=y1 + ( + (f1(a,y[n]) + f1(b,y[n])) / 2) * dx;
end;
Здесь для приближенного вычисления интеграла площадь на каждом отрезке разбиения вычисляется как площадь трапеции, то есть среднее арифметическое значений на концах, умноженное на длину отрезка.
si=(yi+yi+1)/2*h
Для постоянного шага можно использовать формулу
h((y0+y1)/2+[$8721$]yi)
Форма ответа