Найти корни функции a x ^ n + bx - c = 0, где n не является целым числом с Numpy? - PullRequest
7 голосов
/ 29 июня 2011

Я пишу программу на python, и в ней мне нужно найти корни функции, которая:

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

, где a и b - это константы, рассчитанные ранее в программе, но их несколько тысяч. Мне нужно повторить это уравнение дважды для всех значений a и b, один раз с n = 77/27 и один раз с n = 3.

Как я могу сделать это в Python? Я проверил numpy.roots(p), и это будет работать, когда n = 3 я думаю. Но для n = 77/27 как бы я мог это сделать?

Ответы [ 4 ]

8 голосов
/ 29 июня 2011

Я думаю, что ваш выбор зверя 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
5 голосов
/ 29 июня 2011

Я бы использовал fsolve от scipy,

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 голосов
/ 29 июня 2011

Смотрите здесь и здесь .

Я так горжусь собой, я до сих пор помню детали (не читая ссылку!):)

Если вы этого не понимаете, посмотрите здесь .

0 голосов
/ 29 июня 2011

Вам нужен алгоритм поиска корня, такой как метод Ньютона.Все корневые алгоритмы поиска будут работать с нецелыми степенями.Они даже не должны быть рациональными числами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...