将列表作为参数传递给python中的函数

时间:2019-03-04 05:48:38

标签: python physics numerical-methods numerical-integration

我正在尝试求解一个微分方程:

Y'= E-(2αY+4β(Y ^ 3)+6γ(Y ^ 5))

我能够使用以下代码解决其中E为常数(即E = 20)的情况。我使用RK4循环来计算给定时间步长h的方程积分,并将Y绘制为t的函数。

import numpy as np  
import matplotlib.pyplot as plt



def fun(y,t):
    return np.array([(-(2*alpha*y + 4*beta*(y**3) + 6*gamma*(y**5)) + E)/(-2*alpha)])

def rk4(y,dy,t,h):                    #RK4 FUNCTION to integrate equation (fun) for solution for given time step
   k1 = dy(y,t)
   k2 = dy(y+h/2*k1,t+h/2)
   k3 = dy(y+h/2*k2,t+h/2)
   k4 = dy(y+h*k3,t+h)
    y = y + h*(k1+2*k2+2*k3+k4)/6     #solution y
    return [t,y]                      #return solution y for given time t
    t = t + h                         #increment t by step size h



y = np.array([0.2])                   #y0
t = 0
h = 0.1
w = 1
alpha = -52.419
beta = 58.252
gamma = 150.39
tmax = 10
ts = np.array([t])                    #store all t's
ys = np.array([y])                    #store all y solutions
E = 20

for i in range(int(tmax/h)-1):
    (t,y) = rk4(y,fun,t,h)
    ts = np.append(ts,t)
    ys = np.append(ys,y)
    print('ys',y)


plt.plot(ys)
plt.legend(["RK4 solution"], loc=1)
plt.title('Y(t) for E = 20')
plt.xlabel('t', fontsize=17)
plt.ylabel('y(t)', fontsize=17)
plt.tight_layout()
plt.show()

现在的问题是,我想将E更改为等于E = cos(w * t),然后将Y绘制为E的这个新定义的函数。我不确定该怎么做。

我编辑了for循环以尝试定义E,然后按以下方式计算y的值(不考虑其余代码):

et = 0
for i in range(int(tmax/h)-1):
    E = np.array([np.cos(w*et)])
    Es = np.append(Es,E)
    et = et + h
    (t,y) = rk4(y,fun,t,h)
    ts = np.append(ts,t)
    ys = np.append(ys,y)
.
.
.
plt.plot(Es,ys)

但这并没有产生我希望的结果。

任何人和所有建议都欢迎并提前致谢!

0 个答案:

没有答案