簡體   English   中英

Python中超定非線性方程組的數值求解

[英]Numerical solving of overdetermined, nonlinear equation system in Python

這是我的問題的一個最小示例-使用scipy.optimize.leastsq解決

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))

問題:

  • 需要一個良好的起點
  • 無法在我的實際系統中收斂到所需的值
  • 我需要x的約束

這是示例問題的我的蠻力解決方案

from numpy import ones, array, arange, exp, sin, cos, sum, abs, argmin
from itertools import product as iterprod

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 ResidualMatrix(x, parameters):
    MatrixAim = MatrixFun([-1 , 1], *parameters)
    return MatrixFun(x, *parameters)-MatrixAim

def MyBruteMatrixMinimizer(ResidualMatrix, ranges, args=()):
    pathongrid = list(iterprod(*ranges))
    pathlength = len(pathongrid)
    MatSum = ones(pathlength)
    for i in range(pathlength):
        MatSum[i] = sum(abs(ResidualMatrix(pathongrid[i], args)))
    pathgoal = pathongrid[argmin(MatSum)]
    return pathgoal

parameters = [1, 2, 3, 4]
ranges = [arange(-2,0,1e-2), arange(0,2,1e-2)]

print(MyBruteMatrixMinimizer(ResidualMatrix, ranges, args=parameters))

問題:

  • 穩定性不清楚

我寧願使用scipy.optimize.brute或scipy.optimize.basinhopping兩者都導致錯誤TypeError: fsolve: there is a mismatch between the input and output shape of the 'func' argument 'F' 這很明顯,因為我的矩陣具有比變量更多的方程(超定)。
到目前為止,我唯一的想法是總結盡可能多的方程式的絕對值以減小輸出形狀的大小-但我對此絕對不滿意。
對於替代或改進的解決方案或任何其他建議,我將不勝感激。

我通常不使用最小二乘,而是使用良好的NLP(非線性編程)求解器。 這意味着,對於F(x)=b顯式形式:

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

對於任何非平凡的NLP,我們當然要注意:

  1. 提供良好的界限(確保可以評估所有函數和漸變)
  2. 提供一個很好的起點
  3. 注意縮放
  4. 注意奇點。 例如,您的部門可能應該重新制定
  5. 如果不使用帶有自動微分的建模系統,請指定正確和精確的梯度(如果需要,請指定二階導數)。 對於復雜的模型,我建議使用支持自動微分和多個非線性求解器(例如GAMSAMPL )的建模系統。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM