2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Помощь с Python
Сообщение06.07.2018, 15:20 
Аватара пользователя


27/03/14
1091
Здравствуйте. Изучаю синтаксис 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 
Заслуженный участник
Аватара пользователя


01/09/13
4318
Ошибка вот здесь:
Используется синтаксис Delphi
procedure MRK4(x_old,y_old,h:real; Var y_new:real);

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

 Профиль  
                  
 
 Re: Помощь с Python
Сообщение06.07.2018, 15:36 
Заслуженный участник


16/02/13
4105
Владивосток
fronnya в сообщении #1324849 писал(а):
я эту переменную определил в функции MRK4
Вы, стесняюсь спросить, действительно пишете на Дельфи и до сих пор не знаете отличия переменной от формального параметра? Поразительно!

 Профиль  
                  
 
 Re: Помощь с Python
Сообщение06.07.2018, 15:57 
Аватара пользователя


27/03/14
1091
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 


21/05/16
4292
Аделаида
fronnya в сообщении #1324861 писал(а):
Но раз вы разбираетесь, не могли бы вы как разбирающийся человек объяснить чайнику вроде меня, в чем различие?

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

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


27/03/14
1091
kotenok gav, спасибо!

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group