找到函数a x^n+bx-c=0的根,其中n不是带Numpy的整数?

2024-05-13 19:35:55 发布

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

我正在用python编写一个程序,在其中我需要找到一个函数的根,即:

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

其中ab是在程序早期计算的常数,但它们有几千个。 我需要对所有的ab值重复这个等式两次,一次使用n = 77/27,一次使用n = 3

我怎么能用python做这个? 我检查了numpy.roots(p),我想这在n = 3的时候有效。但是对于n = 77/27我怎么能做到呢?


Tags: 函数程序numpy常数roots等式
3条回答

我认为你的野兽选择是^{}

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

我会用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

当然,这给了你a根,不一定全部根。


编辑:使用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

herehere

我为自己感到骄傲,我仍然记得细节(没有读链接!):)

如果你不明白,那就看here

相关问题 更多 >