【问题标题】:SciPy optimization for under-constrained system欠约束系统的 SciPy 优化
【发布时间】: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


【解决方案1】:

如何将返回数组从 F() 调整为变量的数量:

import numpy as np
import scipy.optimize

mat = np.random.randn(5, 7)

def F(x):
    y = np.dot(mat, x)
    return np.resize(np.array([ y[0]**2 + y[1]**3 + 12, y[2] + 17]), 7)

while True:    
    x0 = np.random.randn(7)
    r = scipy.optimize.leastsq(F, x0)
    err = F(r[0])
    norm =  np.dot(err, err)
    if norm < 1e-6:
        break

print err

【讨论】:

  • 谢谢,这似乎有效。这不是自动完成的吗?如果没有副作用,也许我会建议将自动填充作为 scipy 的补丁。
猜你喜欢
  • 2014-07-13
  • 2019-02-10
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-17
  • 2017-08-01
相关资源
最近更新 更多