【问题标题】:solving nonlinear system with fsolve用 fsolve 求解非线性系统
【发布时间】:2019-01-15 10:51:20
【问题描述】:

我有一个这种类型的系统:

a = alpha(x,k)  
b = beta(x,k,alpha)  
gamma(x,k,a,b) = 0

x、a 和 b 作为未知数。 像下面的示例那样设置/解决它是否正确?

k=1.5
def gamma(x,k):
    def alpha(x,k):
        return (x-k)**3
    def beta(x, f1):
        return x + f1(x,k)
    return x**2 - alpha(x,k) - beta(x, alpha)*x
x, info, flag, msg = fsolve(gamma, 0., args=(k), full_output=True)
print x
print info
xp = np.linspace(-5, 5)
yp = [gamma(xx, k) for xx in xp]
plt.plot(xp, yp, '.-b')
plt.grid()

打印出来的:

[1.49999677]
{'qtf': array([-8.8817842e-16]), 'nfev': 44, 'r': array([2.57880614e-10]), 'fjac': array([[-1.]]), 'fvec': array([0.])}

如果是这样,我怎样才能让 fsolve 返回 both 根,如图所示? graph of solutions from gamma

提前致谢!

【问题讨论】:

  • 您可以使用不同的初始值启动多个 fsolve 实例并收集输出
  • 注意:可以直接写yp = gamma(xp, k),因为gamma 与 Numpy nd-arrays 一起使用

标签: python scipy nonlinear-optimization


【解决方案1】:

如果您将起点设置为-2 而不是零,它会找到左根。如果您使用 [-2., 0] 而不是 fsolve 返回两个根(请参阅此 answer):

x, info, flag, msg = fsolve(gamma, [-2., 0], args=(k), full_output=True)
print(x)
# [-1.          1.49999586]

困难的问题是如何选择起点……

【讨论】:

  • 谢谢!确切地说“如何选择起点......”以及相关的循环/清理解决方案是一种痛苦。我想问题是否设置正确?只是收集多个(或全部)根的功能有点颠簸?
  • 我认为问题设置正确。我会将betaalpha 函数从gamma 中移出,但这并不是一个巨大的变化。顺便说一句,我认为这不是您要解决的实际问题,因为这是一个多项式方程,根是-1k。选择起点的方法会随着问题的种类而变化:画图检查是否合理?根在一定范围内吗?根数是否已知? ...等
  • 再次感谢。事实上,这里的伽玛只是一个例子,我的问题使用了不同的函数。绘图和检查是可行的(这是我目前所做的),但不是最好的。在实际情况中,我正在寻找从最小二乘最小化派生的函数的根,它的输出是先验未知的,以及它的根的数量/范围。
猜你喜欢
  • 2013-11-14
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2017-12-13
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多