Как указал @Dair, lambdify sympy обычно требует более одного аргумента, в то время как scipy ожидает только один аргумент, список (или массив), который содержит все значения каждой переменной. Поскольку мою целевую функцию удобнее всего определить с помощью sympy, мне нужно найти способ обойти эту несовместимость sympy и scipy.
@lhcgeneva указала ответ на аналогичный вопрос. В этом ответе неудобно обрабатывать большое количество независимых переменных, особенно когда количество независимых переменных может измениться, что требует переопределения «векторизованной» версии целевой функции. Однако, вдохновленный этим сообщением, я нашел следующее решение, используя *tuple():
import sympy
from scipy.optimize import minimize
from sympy.utilities.lambdify import lambdify
a,b,G = sympy.symbols('a b G')
func = -1*((G - a)**2 + b)
my_func = lambdify((G,a,b), func)
def my_func_v(x):
return my_func(*tuple(x))
results = minimize(my_func_v,[0.1,0.1,0.1])
В примере, который я привел, использование *tuple() кажется излишним, но для проблемы, которую я хочу решить, это избавляет от многих хлопот. Вот пример, который больше похож на вопрос, который я хочу решить
NUM_VAR = 10
x = np.array(sympy.symbols('x0:%d'%NUM_VAR))
func = np.sum((x-1)**2)
my_func = lambdify(x, func)
def my_func_v(x):
return my_func(*tuple(x))
results = minimize(my_func_v,np.zeros(NUM_VAR))
Эта вещь *tuple() может избавить меня от записи всех элементов x, как показано ниже (для случая NUM_VAR=10):
def my_func_v(x):
return my_func(x[0],x[1],x[2],x[3],x[4],x[5],x[6],x[7],x[8],x[9])
Кроме того, нам не нужно менять my_func_v при изменении NUM_VAR.
person
user3821012
schedule
07.12.2015
minimize
ожидает, что функция будет иметь один аргумент в том смысле, что вещь, которую вы передаете, является одним объектом. Однако одним объектом может быть список. Вы уверены, что вам нужноsympy
для этого?Scipy
(неsympy
) выполняет числовые операции, а не символические... - person Dair   schedule 06.12.2015func = lambda x: (x[0] - x[1])**2 + x[2]
- person Dair   schedule 06.12.2015