这是我的问题的一个最小的例子-用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'
。这一点很清楚,因为我的矩阵方程比变量多(过度确定)。
到目前为止,我唯一的想法是将尽可能多的方程式的绝对值相加,以减小输出形状的大小,但我对此绝对不满意。
我将非常感谢替代或改进的解决方案或任何其他建议。在
我通常不使用最小二乘法,而是使用一个好的NLP(非线性规划)解算器。这意味着,对于
F(x)=b
显式形式:当然,对于任何重要的NLP,我们要注意:
相关问题 更多 >
编程相关推荐