2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Помощь с Python
Сообщение06.07.2018, 15:20 
Аватара пользователя
Здравствуйте. Изучаю синтаксис Python и в качестве простого упражнения решил под Python переписать программу, которую я когда-то написал на Delphi, которая решает ОДУ методом Рунге-Кутты 4-го порядка.
Вот вариант на Delphi
код: [ скачать ] [ спрятать ]
Используется синтаксис 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:
код: [ скачать ] [ спрятать ]
Используется синтаксис 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. Буду рад помощи.

 
 
 
 Re: Помощь с Python
Сообщение06.07.2018, 15:32 
Аватара пользователя
Ошибка вот здесь:
Используется синтаксис Delphi
procedure MRK4(x_old,y_old,h:real; Var y_new:real);

;-)
Это очень плохая привычка так писать (вместо функции процедуру, которая меняет аргументы).
И в python это не работает.

 
 
 
 Re: Помощь с Python
Сообщение06.07.2018, 15:36 
fronnya в сообщении #1324849 писал(а):
я эту переменную определил в функции MRK4
Вы, стесняюсь спросить, действительно пишете на Дельфи и до сих пор не знаете отличия переменной от формального параметра? Поразительно!

 
 
 
 Re: Помощь с Python
Сообщение06.07.2018, 15:57 
Аватара пользователя
Geen в сообщении #1324854 писал(а):
;-)
Это очень плохая привычка так писать (вместо функции процедуру, которая меняет аргументы).
И в python это не работает.

Благодарю :-) Основная проблема решена и я, на всякий случай, приведу код рабочей программы:
код: [ скачать ] [ спрятать ]
Используется синтаксис 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):
    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)
    return yold + (h / 6) * (k1 + 2 * k2 + 2 * k3 + k4)

xold = 0
yold = -3
h = 0.01
i = 1

while i < (3 // h):
   
    scatter(xold + h, MRK4(xold, yold, h))
    yold = MRK4(xold, yold, h)
    xold = xold + h
    i = i + 1

xold = 0
yold = -3
i = 1
h1 = -h

while i < (1 // h):
    scatter(xold + h, MRK4(xold, yold, h1))
    yold = MRK4(xold, yold, h1)
    xold = xold + h1
    i = i + 1


iifat в сообщении #1324857 писал(а):
Вы, стесняюсь спросить, действительно пишете на Дельфи и до сих пор не знаете отличия переменной от формального параметра?

Давайте по порядку:

1) В первом сообщении я писал:
fronnya в сообщении #1324849 писал(а):
которую я когда-то написал на Delphi

что означает, что давненько я уже не писал на Delphi. Оно означает именно это, хотя понятие "когда-то" -- растяжимое.

2) Этого вы не знали, но я уже давно не занимался программированием. Я не предупредил, так что каюсь. И о различии пременной и формального параметра функции я задумался только после того, как вы высказали свое негодование. Спасибо, конечно. Но раз вы разбираетесь, не могли бы вы как разбирающийся человек объяснить чайнику вроде меня, в чем различие? У меня есть догадки, но вы-то наверняка правду знаете.

 
 
 
 Re: Помощь с Python
Сообщение06.07.2018, 18:43 
fronnya в сообщении #1324861 писал(а):
Но раз вы разбираетесь, не могли бы вы как разбирающийся человек объяснить чайнику вроде меня, в чем различие?

В Питоне нельзя вызывать локальные переменные (что это такое, см. тут http://pythontutor.ru/lessons/functions/#section_2).

 
 
 
 Re: Помощь с Python
Сообщение07.07.2018, 00:44 
Аватара пользователя
kotenok gav, спасибо!

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group