我想使用scipy.optimise
我想找到等式
的解,na**n + b**n = c**n
,其中
a=2.3
b=2.4
c=2.94
我有一个三元组列表(a,b,c)我想试验一下,我知道指数n的范围总是2.0< n< 4.0。我能否利用这一事实来加速解决方案的融合。
答案 0 :(得分:2)
如果你的函数是标量,并接受标量(你的情况),并且如果你知道:
您可以使用bisection算法加速解决方案,在scipy中实现here,这需要上述条件来保证收敛。 算法背后的想法非常简单,具有对数收敛性。
参见算法所基于的this基本微积分定理。
编辑:我无法抗拒,这里有一个MWEimport 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进行操作的方法。
我们将a
,b
,c
参数作为字符串而不是Python浮点数提供,以获得最高精度。将字符串转换为mpf
(mp
浮点数)将与当前精度允许的一样准确。如果我们转而使用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个求解器给出相同的结果。