【发布时间】:2012-02-18 16:09:09
【问题描述】:
我经常需要解决变量数量超过约束数量(或有时反过来)的非线性问题。通常,某些约束或变量以复杂的方式是多余的。有没有办法解决这些问题?
大多数 scipy 求解器似乎假设约束的数量等于变量的数量,并且雅可比矩阵是非奇异的。 leastsq 有时有效,但当约束少于变量数量时,它甚至不会尝试。我意识到我可以在linalg.norm(F) 上运行fmin,但这比任何使用雅可比行列式的方法效率都要低。
这是一个问题示例,它演示了我在说什么。它显然有一个解决方案,但leastsq 给出了一个错误。当然,这个例子很容易手动解决,我只是把它放在这里演示问题。
import numpy as np
import scipy.optimize
mat = np.random.randn(5, 7)
def F(x):
y = np.dot(mat, x)
return np.array([ y[0]**2 + y[1]**3 + 12, y[2] + 17 ])
x0 = np.random.randn(7)
scipy.optimize.leastsq(F, x0)
我得到的错误信息是:
Traceback (most recent call last):
File "question.py", line 13, in <module>
scipy.optimize.leastsq(F, x0)
File "/home/dstahlke/apps/scipy/lib64/python2.7/site-packages/scipy/optimize/minpack.py", line 278, in leastsq
raise TypeError('Improper input: N=%s must not exceed M=%s' % (n,m))
TypeError: Improper input: N=7 must not exceed M=2
我已经在网上搜索了答案,甚至在 SciPy 邮件列表上询问过,但没有得到任何回复。目前我破解了 SciPy 源代码,以便 newton_krylov 求解器使用 pinv(),但我认为这不是最佳解决方案。
【问题讨论】:
-
这真的是一个 scipy 问题还是实际上是一个戴着假胡子的数学问题?
-
我相信这是一个 scipy 问题。我可以使用我编写的自定义求解器解决这些类型的问题,但更希望能够使用现有的 scipy 求解器。此外,matlab 的 fsolve 似乎能够解决这些问题。这似乎是一种常见的情况,很难相信 scipy 无法处理它(似乎)。
-
fsolve使用信任区域方法 IIRC。那么你真的想知道fsolve是否有类似的scipy函数? -
我不太关心实现的细节(也许我应该),我只想知道 scipy 中是否有任何求解器可以处理这些类型的问题,其他而不是在 norm(F(x)) 上使用一维最小化器。或者失败了,python中是否有其他开源求解器可以做到这一点。在这一点上,如果有一个好的 C 库,我什至愿意为 C 库编写一个包装器。我看了一些,但似乎都没有处理退化(即冗余)变量的情况。
标签: python scipy nonlinear-optimization