import math
import matplotlib
import numpy as np
from numpy import linspace
tmax=10.0
n=2000
G=4
D=-1
m=2
t=np.linspace (0,400,n+1)
phi=10
dphi=delta=phi_dot=np.linspace(0,400,n+1)
def f(delta_dot,t):
return ((G)*(D*delta+m))
def iterate (func,phi,delta,tmax,n):
dt=tmax/(n-1)
t=0.0
for i in range(n):
phi,delta = func (phi,delta,t,dt)
t += dt
return phi
def rk_iter(phi,delta,t,dt):
k1=f(t,phi)
k2=f(t+dt*0.5,phi+k1*0.5*dt)
k3=f(t+dt*0.5,phi*k2*0.5*dt)
k4=f(t*dt,phi*k3*dt)
delta +=dt*(k1+2*k2+2*k3+k4)/6
k1=k2=k3=k4=delta=phi_dot
phi += dt*(k1+2*k2+2*k3+k4)/6
return phi,delta
runge_kutta = lambda delta, phi,tmax,n:iterate(rk_iter,delta,phi,tmax,n)
def plot_result (delta,phi,tmax,n):
dt=tmax/(n-1)
error_rk=[]
r_rk=[]
t=0.0
phi=phi_rk=phi
delta=delta_rk=delta
for i in range(n):
phi_rk,delta_rk=rk_iter(phi_rk,delta_rk,t,dt=tmax/(n-1))
t+=dt
_plot("error.png","Error","time t", "error e",error_rk)
def _plot(title,xlabel,ylabel,rk):
import matplotlib.pyplot as plt
plt.title(title)
plt.ylabel(ylabel)
plt.xlabel(xlabel)
plt.plot(rk,"r--",label="Runge-Kutta")
plt.legend(loc=4)
plt.grid(True)
plt.plot(runge_kutta,t)
print "runge_kutta=", runge_kutta(phi,delta,tmax,n)
print "tmax=",t
我不知道如何使函数plt.show()
起作用。打开绘图窗口我该怎么做?
答案 0 :(得分:1)
您尚未定义f
;相反,f
是通过语句from matplotlib import *
:
In [10]: import matplotlib
In [11]: matplotlib.f
Out[11]: Forward: "a"
In [12]: matplotlib.f(1,1)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-5843007d7dbe> in <module>()
----> 1 matplotlib.f(1,1)
TypeError: __call__() takes at most 2 arguments (3 given)
如果您从未在脚本中使用导入语句的*
形式,那么将来可以避免这样的麻烦。例如,使用以下两种形式之一代替from math import *
:
import math
# Now refer to math.sin, math.pi, etc.
或者,explicilty仅导入您将使用的名称:
from math import sin, pi
答案 1 :(得分:0)
您决不致电plot_result
程序。即使您调用它,也不会填写rk
和error_rk
列表。您只需使用runge_kutta
调用的结果,...
如在另一个帖子中所述,重复发布,您将系统等式定义为f(y,t)
,但将其用作f(t,y)
。
delta
的使用存在一些混淆,有时它是整合变量,有时是rk4步更新。
在rk4步骤中,存在一些错位的乘法,其中应该有添加。行
k1=k2=k3=k4=delta=phi_dot
是完全无意义的,并使之前的计算失效,并使下一步的rk4-update无意义。
删除数学和linspace的导入,代码中都没有使用。将plt的别名移动到顶部并将其与不必要的matplotlib导入合并。