【发布时间】:2015-10-03 23:32:08
【问题描述】:
我正在尝试理解一个 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 )
长长的 lambda 字符串和 dy 函数让我感到困惑。
首先:函数RK4在调用dy时如何接收(t, y, dt)?看起来 dy = RK4(..) 中的 lambda 仅采用两个参数。
第二:RK4 中重复的 lambda 调用是如何工作的?
【问题讨论】:
-
你能澄清你的第二个问题吗?
-
是的,返回 lambda 上的嵌套 lambda。我现在从您的主要答案中了解到发生了什么。谢谢!