Лямбда лямбдифицированной функции, аргумент которой является функцией - PullRequest
1 голос
/ 12 июля 2019

В настоящее время я пытаюсь создать лямбда-функцию, которая будет передавать переменную как функции, являющейся входом для лямбдифицированной функции, так и самой самой лямбдифицированной функции.Моя версия Python - 2.7, а моя версия - 1.3.

Я могу заставить функцию lambdify (f) работать правильно, когда передан правильный аргумент (Y).Затем я пытаюсь создать лямбда-функцию, которая передаст переменную (z) в функцию (controlFunc), которая затем будет введена в мою функцию lambdify (f).

Проблема заключается в том, что лямбдаФункция будет использовать последнюю функцию lambdify на каждой итерации (что и должно быть) И обновлять все ПРЕДЫДУЩИЕ лямбда-функции, чтобы использовать также последнюю функцию lambdify.Я считаю, что это не ошибка в моем коде, но я легко могу ошибаться.

Я попытался установить функцию lambdify в vasriable, а затем сделать из нее функцию lambda.Я попытался использовать всю функцию lambdify в функции лямбда.Я даже пытался использовать списочное понимание (я считаю, что это правильный термин) для оценки каждой лямбда-выражения лямбда в списке.

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 Ответ

1 голос
/ 12 июля 2019

Это довольно распространенная проблема с лямбда-функциями внутри циклов. Лямбда-выражения разрешаются во время вызова (не во время зацикливания, а после). Рассмотрим следующую небольшую коррекцию:

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.].

Я использую Python 3. Однако этот способ должен работать и в Python 2. Попробуй.

...