如何用Numpy找到非整数n的方程ax^n + bx - c = 0的根?

7 投票
4 回答
16752 浏览
提问于 2025-04-16 20:30

我正在用Python写一个程序,需要找到一个函数的根,也就是这个函数的解:

a*x^n + b*x -c = 0 

这里的ab是之前在程序中计算出来的常量,但它们有几千个。我需要对所有的ab的值重复这个方程两次,一次是n = 77/27,另一次是n = 3

我该如何在Python中做到这一点呢?我查过numpy.roots(p),我觉得它可以用在n = 3的情况。但对于n = 77/27,我该怎么做呢?

4 个回答

5

我会使用来自scipy的fsolve

from scipy.optimize import fsolve

def func(x,a,b,c,n):
    return a*x**n + b*x - c

a,b,c = 11.,23.,31.

n = 77./27.

guess = [4.0,]    

print fsolve(func,guess,args=(a,b,c,n)) # 0.94312258329

当然,这个方法只会给你一个解,不一定能找到所有的解。


补充:使用brentq,它快得多

from timeit import timeit

sp = """
from scipy.optimize import fsolve
from scipy.optimize import brentq

from numpy.random import uniform
from numpy import zeros

m = 10**3

z = zeros((m,4))
z[:,:3] = uniform(1,50,size=(m,3))
z[:,3] = uniform(1,10,m)

def func(x,a,b,c,n):
    return a*x**n + b*x - c

"""

s = "[fsolve(func,1.0,args=tuple(i)) for i in z]"
t = "[brentq(func,0.,10.,args=tuple(i)) for i in z]"

runs = 10**2

print 'fsolve\t', timeit(s,sp,number=runs)
print 'brentq\t', timeit(t,sp,number=runs)

给我带来了,

fsolve  15.5562820435
brentq  3.84963393211
5

看看这里这里

我为自己感到骄傲,我还记得具体的内容(没有看链接哦!):)

如果你不明白这些,可以看看这里

8

我觉得你最好的选择是 scipy.optimize.brentq()

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

print scipy.optimize.brentq(
    f, 0.0, 100.0, args=(77.0/27.0, 1.0, 1.0, 10.0))

打印输出

2.0672035922580592

撰写回答