Если вы не возражаете, я сделал это несколько лет назад, и у меня есть небольшой скрипт для него, поэтому я дам вам свой код вместо того, чтобы находить ошибки в вашем.
Я думаю, что он очень ясный и явный.
import numpy as np
class dif_eq(object):
def __init__(self):
pass
def ft4(self,dt,u,x1_before,x2_before,x3_before,x4_before,functionn):
x1_now = x1_before + dt * x2_before
x2_now = x2_before + dt * x3_before
x3_now = x3_before + dt * x4_before
x4_now = x4_before + dt * functionn(u,x1_before,x2_before,x3_before,x4_before)
vals = [x1_now,x2_now,x3_now,x4_now]
return vals
def ft3(self,dt,u,x1_before,x2_before,x3_before,functionn):
x1_now = x1_before + dt * x2_before
x2_now = x2_before + dt * x3_before
x3_now = x3_before + dt*functionn(u,x1_before,x2_before,x3_before)
vals = [x1_now,x2_now,x3_now]
return vals
def ft2(self,dt,u,x1_before,x2_before,functionn):
x1_now = x1_before + dt * x2_before
x2_now = x2_before+ dt * functionn(u,x1_before,x2_before)
vals = [x1_now,x2_now]
return vals
def ft1(self,dt,u,x1_before,functionn):
x1_now = x1_before + dt*functionn(u,x1_before)
vals = [x1_now]
return vals
Пример использования:
"""
def order3equation(u,b,c,a): # Your differential equations
y=u-b*2-c*2.5-a*3.6 #+ noise*np.random.rand()/5
return y
def order1equation.....
....
return y
d=dif_eq()
val=[0] # init for 1order
val3=[0,0,0] # init for 3order
dt=0.05
result1order=[]
result3order=[]
for i in range(100):
val=d.ft1(dt,u,val[0],order1equation)
result1order.append(val[0])
for i in range(1000):
val3=d.ft3(dt,u,val3[0],val3[1],val3[2],order3equation)
result3order.append(val3[0])
"""
valx / vals являются фактическими значениями производных.Сначала вы передаете начальные значения, но затем передаете функции то, что на самом деле вернула функция.
Рабочий пример - Нестабильная система
u = 1 # input/impulse or whatever name it is
d=dif_eq()
val3=[0,0,0]
dt=0.05
zz=[]
def my3(u, b, c, a):
y = u - b * 1 - c * 1 - a *1
return y
for i in range(1000):
val3=d.ft3(dt,u,val3[0],val3[1],val3[2],my3)
zz.append(val3[0])
from matplotlib.pyplot import *
plot(zz)
show()