gpt4 book ai didi

python - 欠约束系统的 SciPy 优化

转载 作者:太空狗 更新时间:2023-10-30 01:23:45 26 4
gpt4 key购买 nike

我经常需要解决变量数量超过约束数量(或有时相反)的非线性问题。通常一些约束或变量以复杂的方式是冗余的。有什么办法可以解决这样的问题吗?

大多数 scipy 求解器似乎都假设约束的数量等于变量的数量,并且 Jacobian 矩阵是非奇异的。 leastsq 有时可以工作,但当约束少于变量数时它甚至不会尝试。我意识到我可以在 linalg.norm(F) 上运行 fmin,但这比使用 Jacobian 的任何方法效率低得多。

这是一个问题示例,它演示了我在说什么。明明有解决办法,但是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(),但我认为这不是最佳解决方案。

最佳答案

如何将 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

关于python - 欠约束系统的 SciPy 优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9342734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com