对于方程组,fsolve,brentq和root的用法和精度有何不同?

时间:2019-04-08 20:11:35

标签: python scipy numerical-methods numerical-analysis

我问了这个问题Is fsolve good to any system of equations?,从中我得到了满意的答案。我在那里展示的系统

  

x = A * exp(x + y)

     

y = 4 * exp(x + y)

只是一个玩具模型,与我的真实案例问题相似,fsolve的工作方式如下(答案中的代码):

from scipy.optimize import fsolve
import matplotlib.pyplot as plt
import numpy as np
def f(p,*args):
  x, y = p
  A = args[0] 

  return (x -A* np.exp(x+y),y- 4* np.exp(x+y))
A = np.linspace(0,4,5)
X = []
Y =[]
for a in A:
  x,y =  fsolve(f,(0.0, 0.0) , args=(a))
  X.append(x)
  Y.append(y)
  print(x,y)

plt.plot(A,X)
plt.plot(A,Y)

但是,我在这里阅读stackoverflow.com/questions/6519380/…brenqtfsolve快得多。然后,我尝试使用它,但是继续获取​​f(a) and f(b) must have different signs。我了解f must be continuous. f(a) and f(b) must have opposite signs.,因此,我相信brenqt对于该系统不是一个好的选择。如果我错了,请纠正我。

在我的真实情况下,我确实遇到了how to solve 3 nonlinear equations in python所说的答案,即“ fsolve())对初始条件非常敏感”,我想避免“首先最小化平方和”,因为我有比该问题的操作要多的参数。如何使用optimize.root产生与我最初问题中的fsolve相似的结果?

1 个答案:

答案 0 :(得分:0)

我现在了解(由于上面的评论)brentq仅适用于标量函数。我的确找到了optimize.root很好的解决方案,并且使用他们的一些可用方法也给出了很好的解决方案,例如:

def f(p,*args):
   x,y = p
   A = args[0] 
   return (x -A* np.exp(x+y),y- 4* np.exp(x+y))
A = np.linspace(0,4,5)
X = []
Y =[]
for a in A: 
   sol=optimize.root(f,[1.0,10.0],args=(a),method='lm')
   sol.message
   x,y= sol.x[0],sol.x[1]
   X.append(x)
   Y.append(y)
   print(x,y)
plt.plot(A,X)
plt.plot(A,Y)

我仍然在努力为系统获取合适的method,因为求解器对此非常敏感。例如,如果我在上面的相同代码中使用method='broyden',则会得到完全不同的解决方案。 我将发布另一个问题以寻求帮助。