【发布时间】:2014-03-17 01:35:49
【问题描述】:
我一直在测试一种已发表在文献中的算法,该算法涉及在 Matlab 和 Python 中求解一组“m”非线性方程。非线性方程组涉及包含复数的输入变量,因此得到的解也应该是复数。到现在为止,通过使用以下几行代码,我已经能够在 Matlab 中得到相当不错的结果了:
lambdas0 = ones(1,m)*1e-5;
options = optimset('Algorithm','levenberg-marquardt',...
'MaxFunEvals',1000000,'MaxIter',10000,'TolX',1e-20,...
'TolFun',1e-20);
Eq = @(lambda)maxentfun(lambda,m,h,g);
[lambdasf] = fsolve(Eq,lambdas0,options);
其中 h 和 g 分别是复数矩阵和向量。对于大范围的初始值,该解的收敛性非常好。
我一直试图在 Python 中模仿这些结果,但收效甚微。数值求解器的设置似乎大不相同,“levenburg-marquardt”算法存在于函数根下。在 python 中,这个算法不能处理复杂的根,当我运行以下行时:
lambdas0 = np.ones(m)*1e-5
sol = root(maxentfun, lambdas0, args = (m,h,g), method='lm', tol = 1e-20, options = {'maxiter':10000, 'xtol':1e-20})
lambdasf = sol.x
我收到以下错误:
minpack.error: Result from function call is not a proper array of floats.
我尝试过使用其他一些算法,例如 'broyden2' 和 'anderson',但它们比 Matlab 差很多,并且只有在尝试了初始条件后才能给出好的结果。函数“fsolve”也不能处理复杂变量。
我想知道我是否有错误地应用了某些东西,以及是否有人知道如何在 Python 中正确求解复杂的非线性方程。
非常感谢
【问题讨论】:
标签: python matlab numerical-methods complex-numbers nonlinear-functions