我试图理解一个Python程序,它使用Runge-Kutta方法以数字方式求解微分方程。我已经开发了自己的解决方案,但正在寻找其他实现。我找到了几个,但是这个引起了我的兴趣,因为我很难理解lambda是如何工作的。
以下是代码:
def RK4(f):
return lambda t, y, dt: (
lambda dy1: (
lambda dy2: (
lambda dy3: (
lambda dy4: (dy1 + 2*dy2 + 2*dy3 + dy4)/6
)( dt * f( t + dt , y + dy3 ) )
)( dt * f( t + dt/2, y + dy2/2 ) )
)( dt * f( t + dt/2, y + dy1/2 ) )
)( dt * f( t , y ) )
def theory(t): return (t**2 + 4)**2 /16
from math import sqrt
dy = RK4(lambda t, y: t*sqrt(y))
t, y, dt = 0., 1., .1
while t <= 10:
if abs(round(t) - t) < 1e-5:
print("y(%2.1f)\t= %4.6f \t error: %4.6g" % ( t, y, abs(y - theory(t))))
t, y = t + dt, y + dy( t, y, dt )
长串的lambdas和dy函数令我困惑。
首先:调用dy时函数RK4如何接收(t,y,dt)?看起来dy = RK4(..)中的lambda只有两个参数。
第二:RK4中重复的lambda调用如何工作?
答案 0 :(得分:3)
首先,请阅读higher-order functions。
首先:调用dy时函数RK4如何接收(t,y,dt)? 看起来dy = RK4(..)中的lambda只占两个 参数。
好的,简单的事实:
def RK4(f)
RK4正在接受一个论点。在这种情况下,这是一个(lambda)函数:
dy = RK4(lambda t, y: t*sqrt(y))
因此,在这种情况下,f
将是lambda t, y: t*sqrt(y)
。
RK4 返回一个函数,该函数有3个参数:
return lambda t, y, dt: ( ... )
所以电话dy( t, y, dt )
没问题。
答案 1 :(得分:2)
lambda是用于创建具有最小样板的简单函数的语法糖。
例如:
f = lamdbda x: x + 5
以上在道德上等同于:
def __lambda_123_line_567(x): # name is for illustrative purposes, only
return x + 5 # Python internally may name it however it
# chooses to do so
f = __lambda_123_line_567
lambda的一般语法是关键字&#34; lambda&#34;,后跟参数列表,后跟冒号,后跟应该由函数返回的表达式。
答案 2 :(得分:1)
lambda运算符或lambda函数是一种创建小型匿名函数的方法。这是一般格式:
lambda(variable: test for, apply to)