使用 Lambda 函数的集成会出错

Integration using Lambda function gives an error

我第一次尝试使用 Lambda 函数对指数函数求积分。 有两个版本的代码应该是一样的,但是带有 Lambda 函数的代码会报错:

给出错误的代码是

import numpy as np
import sympy as sym

# Predetermined parameter values 
s, t, T= 0.2 ,0, 0.25
a1, a2= 1.2, 2.3
X1, X2, X3=0.5,-2.0,0.3
# Symbolic variable for integration
u = sym.symbols('u')

# Version 1 giving the above error
fx= lambda X1,X2,X3,a1,a2,T,u: (X1*sym.exp(-a1*(T-u)) + X2*sym.exp(-a2*(T-u))+X3)**2             
Fx=sym.integrate(sym.expand(fx), (u,t,s))
Fx=float(Fx)

另一方面,我可以使用以下没有 Lambda 函数的版本获得输出 Fx。

# Version 2 works fine
def expFun3fsq(X1,X2,X3,a1,a2,T,u):
    # Squared single line exponential function 
    # It returns a symbolic function where u is the only symbol in the function
    fx= (X1*sym.exp(-a1*(T-u))+X2*sym.exp(-a2*(T-u))+X3) **2
    return fx

Fx=sym.integrate(sym.expand(expFun3fsq(X1,X2,X3,a1,a2,T,u)), (u,t,s))
Fx=float(Fx)

错误的原因是什么,我该如何解决这个问题?

当您写 f = lambda x: 1 + x 时,您是在告诉 python 您将向 f(如 f(1))提供一个参数,并且该参数应引用为 x在公式中。如果您希望能够轻松更改表达式的参数,则只需要一个 lambda(在我的示例中,f 将向您传递给它的任何内容加 1)。

当你写 f = lambda: 1 + x 时,这意味着你不会传递任何参数,你只希望函数使用 x 的本地值并加 1。

>>> f = lambda: x + 1
>>> g = lambda x: x + 1
>>> x = 1
>>> f()
2
>>> g(1)
2
>>> x = 3
>>> f()
4
>>> g(1)
2    

确保您理解上述输出很重要。 lambda 的行为方式与定义的函数相同——并且您展示了您知道如何使用定义的函数。

既然你修复了除 u 之外的所有内容,并且你想集成一个 expression 这是 u 的函数,你必须在一些中定义该表达式方式:您可以将参数传递给 function/lambda (正确地)以获取该表达式或只编写表达式。因此,将 fx= lambda X1,X2,X3,a1,a2,T,u: 更改为 fx = 并且您的代码将起作用。或者,将所有变量传递给 lambda,就像您在使用该函数时所做的那样。

>>> s, t, T= 0.2 ,0, 0.25
>>> a1, a2= 1.2, 2.3
>>> X1, X2, X3=0.5,-2.0,0.3
>>> u = sym.symbols('u')

这里,fx是表达式

>>> fx=  (X1*sym.exp(-a1*(T-u)) + X2*sym.exp(-a2*(T-u))+X3)**2
>>> fx.subs(u, 0)  # less convenient than using a lambda as shown last below
0.207025570818871
>>> Fx1=sym.integrate(sym.expand(fx), (u,t,s))

这里,fx是我们必须传递所有参数的函数

>>> fx = lambda X1,X2,X3,a1,a2,T,u:(X1*sym.exp(-a1*(T-u)) + X2*sym.exp(-a2*(T-u))+X3)**2             
>>> Fx2=sym.integrate(sym.expand(fx(X1,X2,X3,a1,a2,T,u)), (u,t,s))

这里,fxu的函数,我们使用变量的局部值

>>> fx = lambda u:(X1*sym.exp(-a1*(T-u)) + X2*sym.exp(-a2*(T-u))+X3)**2     
>>> fx(0)
0.207025570818871   
>>> fx(u).n(2)
1.3*(0.33*exp(1.2*u) - exp(2.3*u) + 0.27)**2
>>> Fx3=sym.integrate(sym.expand(fx(u)), (u,t,s))

所有方法给出相同的答案:

>>> Fx1,Fx2, Fx3
(0.106060402899230, 0.106060402899230, 0.106060402899230)