Както отбеляза @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