我是Python的初学者/中级人物。我已将4th-order Runge-Kutta method (RK4)编码为Python。它基本上是解决一个钟摆,但这不是重点。
我想通过以下方式改进RK4方法:我希望能够将函数f直接传递给RK4函数,即RK4(y_0,n,h)应该变为RK4(f,y_0,n, H)。这将有很大的优势,我可以将RK4用于描述其他系统的其他f函数,而不仅仅是这个钟摆。
我只是将简单的函数传递给RK4,但我做错了。我如何在Python中执行此操作?
import numpy as np
def RK4(y_0, n, h):
#4th order Runge-Kutta solver, takes as input
#initial value y_0, the number of steps n and stepsize h
#returns solution vector y and time vector t
#right now function f is defined below
t = np.linspace(0,n*h,n,endpoint = False) #create time vector t
y = np.zeros((n,len(y_0))) #create solution vector y
y[0] = y_0 #assign initial value to first position in y
for i in range(0,n-1):
#compute Runge-Kutta weights k_1 till k_4
k_1 = f(t[i],y[i])
k_2 = f(t[i] + 0.5*h, y[i] + 0.5*h*k_1)
k_3 = f(t[i] + 0.5*h, y[i] + 0.5*h*k_2)
k_4 = f(t[i] + 0.5*h, y[i] + h*k_3)
#compute next y
y[i+1] = y[i] + h / 6. * (k_1 + 2.*k_2 + 2.*k_3 + k_4)
return t,y
def f(t,vec):
theta=vec[0]
omega = vec[1]
omegaDot = -np.sin(theta) - omega + np.cos(t)
result = np.array([omega,omegaDot])
return result
test = np.array([0,0.5])
t,y = RK4(test,10,0.1)
答案 0 :(得分:4)
Python函数也是对象。你可以像任何其他对象一样传递它们:
>>> def foo(): print 'Hello world!'
...
>>> foo
<function foo at 0x10c4685f0>
>>> foo()
Hello world!
>>> bar = foo
>>> bar()
Hello world!
只需将函数作为额外参数传递给RK4
函数,并将其用作局部变量。
答案 1 :(得分:3)
您可以像在预期的那样将函数传递给Python中的函数:
def call_function(f):
f()
def my_function():
print "OK"
call_function(my_function) # Prints OK
也许您应该发布失败的代码?
答案 2 :(得分:2)
这很简单。更改RK4
函数的定义,如下所示:
def RK4(f, y_0, n, h):
在这里,我添加了一个额外的参数,即函数。
然后,当您致电RK4
时,传递函数:
t, y = RK4(f, test, 10, 0.1)
现在,当然,您可以替换不同的函数,而无需重新编写集成代码。
Python中的函数只是另一种对象。你可以像传递更多平凡的对象一样传递它们。