Последний раз редактировалось fronnya 06.07.2018, 15:26, всего редактировалось 1 раз.
Здравствуйте. Изучаю синтаксис Python и в качестве простого упражнения решил под Python переписать программу, которую я когда-то написал на Delphi, которая решает ОДУ методом Рунге-Кутты 4-го порядка. Вот вариант на Delphi
function f(x,y:real):real;
begin
result:=exp(2*x)-(3*y+2);
end;
procedure MRK4(x_old,y_old,h:real; Var y_new:real);
Var k1,k2,k3,k4:real;
begin
k1:=f(x_old,y_old);
k2:=f(x_old+h/2,y_old+k1*h/2);
k3:=f(x_old+h/2,y_old+k2*h/2);
k4:=f(x_old+h,y_old+h*k3);
y_new:=y_old+h/6*(k1+2*k2+2*k3+k4);
end;
procedure TForm1.Button1Click(Sender: TObject);
Var i,j,k,l:integer;
x_old,y_old,y_new,x,k1,k2,k3,k4,h, h1,x0,y0,y:real;
begin
x_old:=0;
y_old:=-3;
h:=0.01;
for i:=1 to round(3/h) do
begin
MRK4(x_old,y_old,h,y_new);
Series1.AddXY(x_old+h,y_new);
y_old:=y_new;
x_old:=x_old+h;
end;
h1:=-h;
x0:=0;
y0:=-3;
for i:=1 to round(1/h) do
begin
MRK4(x0,y0,h1,y);
Series1.AddXY(x0+h1,y);
y0:=y;
x0:=x0+h1;
end;
end;
end.
А вот эта же программа, но написанная на Python:
from matplotlib.pyplot import (axes,axis,title,legend,figure,
xlabel,ylabel,xticks,yticks,
xscale,yscale,text,grid,
plot,scatter)
from numpy import (linspace,logspace,zeros,ones,outer,meshgrid,
pi,sin,cos,sqrt,exp)
def f(x,y):
return exp(2 * x)-(3 * y + 2)
def MRK4(xold, yold, h, ynew):
k1 = f(xold,yold)
k2 = f(xold + h / 2, yold + k1 * h / 2)
k3 = f(xold + h / 2, yold + k2 * h / 2)
k4 = f(xold + h, yold + h * k3)
ynew = yold + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4)
return ynew
xold = 0
yold = -3
h = 0.01
i = 1
while i < (3 // h):
MRK4(xold, yold, h, ynew)
scatter(xold + h, ynew)
yold = ynew
xold = xold + h
i = i + 1
h1 = -h
x0 = 0
y0 = -3
i = 1
while i < (3 // h):
MRK4(x0, y0, h1, y)
scatter(x0 + h1, y)
y0 = y
x0 = x0 + h1
i = i + 1
Вроде как все идентично, но в Python мне выдает ошибку, что "name ynew is not defined". Я не понимаю, почему появляется эта ошибка, ведь я эту переменную определил в функции MRK4. Буду рад помощи.
|