Предположим, у меня есть функция, область значений которой — скаляр, а область определения — вектор. Например:
def func(x):
return x[0] + 1 + x[1]**2
Как найти корень a этой функции? scipy.optimize.fsolve
и scipy.optimize.root
ожидают, что func
вернет вектор (а не скаляр), а scipy.optimize.newton
принимает только скалярные аргументы. Я могу переопределить func
как
def func(x):
return [x[0] + 1 + x[1]**2, 0]
Тогда root
и fsolve
могут найти корень, но нули в якобиане означают, что он не всегда будет работать хорошо. Например:
fsolve(func, array([0,2]))
=> array([-5, 2])
Он будет изменять только первый параметр, но не второй, а это означает, что он часто находит ноль, который находится далеко.
РЕДАКТИРОВАТЬ: похоже, что следующее переопределение func работает лучше:
def func(x):
fx = x[0] + 1 + x[1]**2
return [fx, fx]
fsolve(func, array([0,5]))
=>array([-16.27342781, 3.90812331])
Так что теперь он готов изменить оба параметра. Хотя код все равно какой-то уродливый.