Показать сообщение отдельно
Старый 03.10.2019, 20:40   #4 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Понятно.
То, что уравнений не два, а три — Вы поняли. Прекрасно. И даже тело программы записано правильно. Вот только... Понимаете, тут КАЖДАЯ из функций (у Вас — f, g и v) должна быть не от трёх, а от четырёх переменных. Кроме того, функция g записана неверно.
В общем, я тут нарисовал вариантик (немножко обозначения другие, в частности, у меня не v, а p) и решение задачки. Если не запутался в значках то, вроде, так. Попробуйте сравнить со своим кодом и разобраться:
Код:
Const
 x0=0.0;
 y0=1.0;
 z0=0.0;
 t0=0.0;
 N=20;
 x_max=2.0;

Var
 X,Y,Z,T,Y1,Z1,T1,h:real;
 i:integer;

Function f(x,y,z,t:real):real;
begin
 f:=x+x*y*y-z*z;
end;

Function g(x,y,z,t:real):real;
begin
 g:=t;
end;

Function p(x,y,z,t:real):real;
begin
 p:=z;
end;

Procedure RK(x,y,z,t:real; var Uy:real; var Uz:real; var Ut:real);
var k1,k2,k3,k4,q1,q2,q3,q4,r1,r2,r3,r4:real;
begin
 k1:=h*f(x,y,z,t);
 q1:=h*g(x,y,z,t);
 r1:=h*p(x,y,z,t);
 k2:=h*f(x+h/2,y+r1/2,z+q1/2,t+k1/2);
 q2:=h*g(x+h/2,y+r1/2,z+q1/2,t+k1/2);
 r2:=h*p(x+h/2,y+r1/2,z+q1/2,t+k1/2);
 k3:=h*f(x+h/2,y+r2/2,z+q2/2,t+k2/2);
 q3:=h*g(x+h/2,y+r2/2,z+q2/2,t+k2/2);
 r3:=h*p(x+h/2,y+r2/2,z+q2/2,t+k2/2);
 k4:=h*f(x+h,y+r3,z+q3,t+k3);
 q4:=h*g(x+h,y+r3,z+q3,t+k3);
 r4:=h*p(x+h,y+r3,z+q3,t+k3);
 Ut:=t+(k1+2*k2+2*k3+k4)/6;
 Uz:=z+(q1+2*q2+2*q3+q4)/6;
 Uy:=y+(r1+2*r2+2*r3+r4)/6;
end;

Begin
 h:=(x_max-x0)/N;
 X:=x0;
 Y:=y0;
 Z:=z0;
 T:=t0;
 Writeln('x = ',X:4:2,'    y = ',Y:8:5);
 For i:=1 to N do
  begin
   RK(X,Y,Z,T,Y1,Z1,T1);
   X:=X+h;
   Y:=Y1;
   Z:=Z1;
   T:=T1;
   Writeln('x = ',X:4:2,'    y = ',Y:8:5);
  end;
 Readln
End.
Изображения
 
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070