寻找单调函数的根:牛顿失败

2024-04-19 02:53:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个形状为$$f(x)=\sum iu I a_I\cdot x^{e_I}-c$$的函数,其中所有参数都是正的。 现在我要计算这个函数的根。在

  • f是单调的
  • $$f(0)=-c$$
  • 所以根必须是正的

我本想应用牛顿法/割线法,就像scipy.optimize.newton中那样,但有时它失败了。在

#secant method
f1 = (lambda a: 6.75304970913061 * a**2.37142857142857 - 1.91006495309903)
scipy.optimize.newton(f1,0)

无法在50步内收敛,在100次或1000次迭代后,结果会变得更糟(这不应该发生)。在

或者,我可以计算

^{pr2}$

因为我有负幂,我从1开始,但是我得到Failed to converge after 50 iterations, value is (2.9502746750095213e+29-7.147769018388161e+29j)。在

我需要调用什么来解决上述类型的每个实例?在


Tags: lambda函数参数newtonscipymethodf1optimize
1条回答
网友
1楼 · 发布于 2024-04-19 02:53:00

scipy.optimize.newton的SciPy文档建议在函数改变符号的区间[a,b]中使用scipy.optimize.brentq。对于单调函数,如所述,a=0和b可以通过尝试足够大的数来找到。在

import scipy.optimize

f1 = (lambda a: 6.75304970913061 * a**2.37142857142857 - 1.91006495309903)
f1(0) # -1.91006495309903
f1(1) # 4.84298475603158
scipy.optimize.brentq(f1,0.,1.) # 0.5871176550428887

f2 = (lambda a: 0.672716686237341 * a **0.0624999999999993 + 0.87283444645141 * a ** 0.134615384615384 - 1.34775906114245)
f2(0) # -1.34775906114245
f2(1) # 0.19779207154630107
scipy.optimize.brentq(f2,0.,1.) # 0.2624501197238087

相关问题 更多 >