【问题标题】:Howto pass a function to a function in Python?如何将函数传递给 Python 中的函数?
【发布时间】:2013-03-21 10:49:54
【问题描述】:

我是 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)

【问题讨论】:

    标签: python function-call runge-kutta


    【解决方案1】:

    Python 函数也是对象。您可以像传递任何其他对象一样传递它们:

    >>> def foo(): print 'Hello world!'
    ...
    >>> foo
    <function foo at 0x10c4685f0>
    >>> foo()
    Hello world!
    >>> bar = foo
    >>> bar()
    Hello world!
    

    只需将函数作为额外参数传递给您的 RK4 函数并将其用作局部变量。

    【讨论】:

    • 感谢您的澄清。我来自 MatLab(带有一些 C)。所以 Python 并没有停止让我惊讶:-)。
    【解决方案2】:

    您可以按照您的预期将函数传递给 Python 中的函数:

    def call_function(f):
        f()
    
    def my_function():
        print "OK"
    
    call_function(my_function)  # Prints OK
    

    也许您应该发布失败的代码?

    【讨论】:

      【解决方案3】:

      这很简单。像这样更改RK4 函数的定义:

      def RK4(f, y_0, n, h):
      

      在这里,我添加了一个额外的参数,函数。

      然后,当你调用RK4时,传递函数:

      t, y = RK4(f, test, 10, 0.1)
      

      当然,现在您可以替换不同的函数,而无需重新编写集成代码。

      Python 中的函数只是另一种对象。你可以像做更多平淡无奇的物体一样传递它们。

      【讨论】:

      • 好的,我把它放进去,现在它可以工作了。我是一个该死的新手!无论如何,把这些全部输入并发布在这里是一个很好的练习。
      • 是的,通常情况下,编写简洁示例的纪律有助于您的理解。顺便说一句,这是一个写得很好的问题,做得很好!
      猜你喜欢
      • 1970-01-01
      • 2020-08-26
      • 2015-12-18
      • 2015-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多