【问题标题】:How does the inner lambda use the outer lambda fuction in this RK4 ODE-solver? Python在这个 RK4 ODE 求解器中,内部 lambda 如何使用外部 lambda 函数? Python
【发布时间】:2017-11-02 01:47:18
【问题描述】:

我在搜索中发现了以下代码来改进我的数值分析代码:

from math import sqrt

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

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 嵌套是如何工作的。如果我理解正确,RK4 中的所有dyN 都是在内部定义的函数,因为它们是这种 ODE 求解方法所必需的。但我不知道内部 lambda 在其定义中如何使用外部 lambda。也许我没有正确理解 lambda 语法。

【问题讨论】:

标签: python python-3.x lambda ode nested-function


【解决方案1】:

这里发生的是定义并立即调用 lambda 函数。首先,请意识到以下只是计算y 平方的复杂方法:

( lambda x:
    x**2
)( y )

嵌套依次传递将另一个lambda 包裹在这样的构造周围以修改其参数。同样,以下是计算w 的正弦平方的复杂方法,即(math.sin(w))**2

( lambda z: (
        lambda x: x**2
    )(math.sin(z))
) (w)

因此,阅读本文的方法是将步骤从下到上相互应用。

使用普通函数和没有嵌套调用的示例编写lambda-construction,它变为:

def step_5(f,dy1,dy2,dy3,dy4):
    return (dy1 + 2 * dy2 + 2 * dy3 + dy4) / 6

def step_4(f,dy1,dy2,dy3):
    return step_5( dy1,dy2,dy3, dt * f(t + dt, y + dy3) )

def step_3(f,dy1,dy2):
    return step_4( dy1,dy2, dt * f(t + dt / 2, y + dy2 / 2) )

def step_2(f,dy1):
    return step_3( dy1, dt * f(t + dt / 2, y + dy1 / 2))

def RK4(f):
    return step_2( dt * f(t, y) )

从那里开始,只需一小步就可以编写出可读的 Runge-Kutta 方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 2016-07-13
    • 2019-11-23
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多