超定非线性方程组的Python数值求解

2024-06-02 05:23:05 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我的问题的一个最小的例子-用scipy.optimize.leatsq在

from scipy.optimize import leastsq
from numpy import array, exp, sin, cos

def MatrixFun(x, *par):
    a, b, c, d = par
    m11 = a*sin(x[0])+b*cos(x[1])
    m12 = c*cos(x[0])*sin(x[1])
    m21 = c*sin(x[0])/cos(x[1])
    m22 = d*exp(x[0]*x[1])
    M = array([[m11, m12], [m21, m22]])
    return M

def Residualvector(x, parameters):
    MatrixAim = MatrixFun([-1 , 1], *parameters)
    return (MatrixFun(x, *parameters)-MatrixAim).flatten()

parameters = [1, 2, 3, 4]
start = [0, 0]
print(leastsq(Residualvector, start, args=parameters))

Problems:

  • Requires good starting point
  • Does not converge to desired values with my real systems
  • I need constraints for x

这是我对示例问题的bruteforce解决方案

^{pr2}$

Problems:

  • Slow
  • Stability unclear

我宁愿用scipy.optimize.brute或者scipy.optimize.basinhopping公司这两者都会导致错误TypeError: fsolve: there is a mismatch between the input and output shape of the 'func' argument 'F'。这一点很清楚,因为我的矩阵方程比变量多(过度确定)。
到目前为止,我唯一的想法是将尽可能多的方程式的绝对值相加,以减小输出形状的大小,但我对此绝对不满意。
我将非常感谢替代或改进的解决方案或任何其他建议。在


Tags: fromimportdefscipysincosarrayoptimize
1条回答
网友
1楼 · 发布于 2024-06-02 05:23:05

我通常不使用最小二乘法,而是使用一个好的NLP(非线性规划)解算器。这意味着,对于F(x)=b显式形式:

min w'w
F(x) = b + w 

当然,对于任何重要的NLP,我们要注意:

  1. 提供良好的边界(确保所有函数和梯度都可以评估)
  2. 提供一个好的起点
  3. 注意结垢
  4. 注意奇点。E、 你有一个部门,可能应该重新制定
  5. 如果不使用具有自动微分功能的建模系统,请指定正确和精确的梯度(如果需要,还需要二阶导数)。对于复杂的 模型我建议使用一个支持自动微分和多个非线性求解器的建模系统(例如GAMSAMPL)。在

相关问题 更多 >