【发布时间】:2018-04-11 00:18:01
【问题描述】:
以下内容再简单不过了,但我找不到如何使它工作......
from scipy.optimize import fsolve
def a(x):
return x*x-x
def ap(x):
return 2*x-1
#works
print(fsolve(a, 0.3))
#works
print(fsolve(a, 0.3, fprime=ap))
#works
print(fsolve(a, [0.3], fprime=ap))
#works
print(fsolve(a, [0.3, 0.7]))
#crashes
print(fsolve(a, [0.3, 0.7], fprime=ap))
当它崩溃时给出错误
TypeError: fsolve: there is a mismatch between the input and output shape of the 'fprime' argument 'ap'.Shape should be (2, 2) but it is (2,).
ap 的输出维度看起来肯定应该和输入一样。这怎么可能出错(以及如何解决)?
我认为一些反对者忽略了这个问题的微妙之处,所以这里更深入地解释了我为什么感到困惑:
似乎 scipy 将 a 解释为一个变量的函数,[0.3,0.7] 开始估计 fsolve(a, [0.3, 0.7]) 中的两个根,但在 fsolve(a, [0.3, 0.7], fprime=ap) 中,它将 a 解释为带有 [.3,.7] 的两个变量的函数是单根的估计。根据文档(https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fsolve.html),第二个参数
x0 : ndarray
The starting estimate for the roots of func(x) = 0.
说它正在寻找根的估计(复数)。但是它在给定fprime 的情况下的行为听起来像是x0 被解释为对单个根的估计。
【问题讨论】:
-
你认为你会在下面的代码中得到什么输出:
ap([0.3, 0.7]) -
scipy 要求 ap(x) 的 2x2 输出,因为这是 jacobian matrix 的形式。
-
@eyllanesc 我不希望 scipy 传入一个列表,而是一个数组,我希望
ap(np.array([0.3, 0.7])) == np.array([ap(0.3), ap(0.7)])确实如此。如果要允许ap接收列表,我会将其定义为return 2*np.array(x)-1,但这并不能解决形状不匹配问题。 -
能否解释一下为什么这是一个糟糕的问题?对我来说,倒数第二个
fsolve(a, [0.3, 0.7])有效但fsolve(a, [0.3, 0.7], fprime=ap)无效的原因似乎很重要。 -
另外@sascha我意识到两个变量的函数的雅可比是一个2x2矩阵,但是一个变量的函数的雅可比也是一个变量的函数,所以我的问题是为什么scipy将
a解释为一个变量的函数,[.3,.7]在fsolve(a, [0.3, 0.7])中开始估计两个根,但在fsolve(a, [0.3, 0.7], fprime=ap)中它将a解释为两个变量的函数,[.3,.7]是单个根的估计?