参数为函数的lambdified函数的Lambda

时间:2019-07-11 23:19:30

标签: python python-2.7 lambda lambdify

我目前正在尝试创建一个lambda函数,该函数会将变量传递给lambdified函数的输入和lambdified函数本身。我的Python版本是2.7,而我的sympy版本是1.3。

当传递正确的参数(Y)时,我能够使lambdify函数(f)正常工作。然后,我尝试创建一个lambda函数,该函数会将变量(z)传递给函数(controlFunc),然后将两者都输入到我的lambdify函数(f)中。

问题似乎是lambda函数将在每次迭代中使用最新的lambdify函数(应该这样做),并将所有之前的lambda函数更新为也使用最新的lambdify函数。我相信这不是我的代码中的错误,但是我很容易错了。

我尝试将lambdify函数设置为vasriable,然后从中创建lambda函数。我尝试在lambda函数中使用整个lambdify函数。我什至尝试使用列表理解(我相信这是正确的术语)来评估列表中lambdify的每个lambda。

import sympy as sy
import numpy as np
r,s,t,v,w,x,y = sy.symbols('r,s,t,v,w,x,y')

variables = [[t,v,w,x,y]]
inputs = [[r,s]]
L = [[]]
controlledSim = True
ctrl_input = [[10., 10.]]
def controlFunc(x,controlDict):
    return ctrl_input[0]

control = [controlFunc for i in range(10)]
controlDict = []
func = [sy.Matrix([[1.*r*s*t*v*w*x*y],
                   [2.*r*s*t*v*w*x*y],
                   [3.*r*s*t*v*w*x*y],
                   [4.*r*s*t*v*w*x*y],
                   [5.*r*s*t*v*w*x*y]])]

X = [1.,1.,1.,1.,1.]
Y = [1.,1.,1.,1.,1.,10.,10.]

for j in range(len(L)):
    if controlledSim == True:
                    func[j] = list(func[j])
                    temp = [[] for i in range(len(func[j]))]
                    f = [[] for i in range(len(func[j]))]
                    for i in range(len(func[j])):
                        f[i] = sy.lambdify([np.append(variables[j],inputs[j])], func[j][i])
                        temp[i] = lambda z: f[i](np.append(z,control[i](z,controlDict)))
                    func_lambda = lambda z: np.array([lamb(z) for lamb in temp]).T

我知道func_lambda(X)的输出应该是[100.,200.,300.,400.,500。]的数组。

我当前的结果是[500.,500.,500.,500.,500。]的数组。

1 个答案:

答案 0 :(得分:1)

这是在循环内部使用lambda函数的常见问题。 Lambda表达式在调用时解析(不是在循环中而是在解析后)。考虑以下一些更正:

temp[i] = lambda z, i=i: f[i](np.append(z,control[i](z,controlDict)))

i=i是默认参数值,因此可以在函数定义中解析。经过这种修改,func_lambda(X)给了我[100. 200. 300. 400. 500.]

我使用python3。但是这种方式也应该在python 2中也可以使用。试试吧。