计算rk方法/无绘图的函数

时间:2015-03-23 17:40:47

标签: python numpy matplotlib lambda

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()起作用。打开绘图窗口我该怎么做?

2 个答案:

答案 0 :(得分:1)

您尚未定义f;相反,f是通过语句from matplotlib import *

从matplotlib导入的
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程序。即使您调用它,也不会填写rkerror_rk列表。您只需使用runge_kutta调用的结果,...

即可

如在另一个帖子中所述,重复发布,您将系统等式定义为f(y,t),但将其用作f(t,y)

delta的使用存在一些混淆,有时它是整合变量,有时是rk4步更新。

在rk4步骤中,存在一些错位的乘法,其中应该有添加。行

    k1=k2=k3=k4=delta=phi_dot

是完全无意义的,并使之前的计算失效,并使下一步的rk4-update无意义。

删除数学和linspace的导入,代码中都没有使用。将plt的别名移动到顶部并将其与不必要的matplotlib导入合并。