Python使用scipy.optimise来找到方程的解

时间:2016-03-10 17:34:46

标签: python optimization scipy

我想使用scipy.optimise

解决方程式

我想找到等式

的解,n
a**n + b**n = c**n

,其中

a=2.3
b=2.4
c=2.94

我有一个三元组列表(a,b,c)我想试验一下,我知道指数n的范围总是2.0< n< 4.0。我能否利用这一事实来加速解决方案的融合。

2 个答案:

答案 0 :(得分:2)

如果你的函数是标量,并接受标量(你的情况),并且如果你知道:

  • 您的解决方案在给定的时间间隔内,并且该函数在相同的时间间隔(您的情况)中是连续的
  • 您对一个解决方案感兴趣,不一定在该时间间隔内的所有(如果超过1个)解决方案

您可以使用bisection算法加速解决方案,在scipy中实现here,这需要上述条件来保证收敛。 算法背后的想法非常简单,具有对数收敛性。

参见算法所基于的this基本微积分定理。

编辑:我无法抗拒,这里有一个MWE

import scipy.optimize as opt
def sol(a,b,c):
    f  = lambda n : a**n + b**n - c**n
    return opt.bisect(f,2,4)
print(sol(2.3,2.4,2.94)

>3.1010655957

答案 1 :(得分:1)

根据评论中的要求,以下是使用mpmath进行操作的方法。

我们将abc参数作为字符串而不是Python浮点数提供,以获得最高精度。将字符串转换为mpfmp浮点数)将与当前精度允许的一样准确。如果我们转而使用Python浮点数,那么我们将使用遭受Python浮点数固有的不精确性的数字。

mp.dps允许我们以十进制数字的形式设置精度。

mpmath findroot函数接受初始近似参数。这可以是单个值,也可以是作为列表或元组给出的间隔。可以在该时间间隔内使用Python浮点数。

from mpmath import mp

mp.dps = 30

a, b, c = [mp.mpf(u) for u in ('2.3', '2.4', '2.94')]

def f(x):
    return a**x + b**x - c**x

x = mp.findroot(f, [2, 4])

print(x, f(x))

<强>输出

3.10106559575904097402104750305 -3.15544362088404722164691426113e-30

默认情况下,findroot使用简单的割线解算器。文档建议在提供间隔时使用'anderson'或'ridder'求解器,但对于这个等式,所有3个求解器给出相同的结果。