[英]Find a root of a function in a given range
我有一組函數f_t
有幾個根(實際上是兩個)。 我想找到“第一”根,並且使用fsolve
執行此操作大部分時間都fsolve
正常工作。 問題是,兩個根會合,因為t變為無窮大。 (我的函數的一個簡單例子是f_t(x) = x^2 - 1/t
)。 所以t
越大, fsolve
就越失誤。 是否有一個預定義的函數,類似於fsolve
我可以告訴它應該只查看給定的范圍(例如,總是查找[0, inf
)中的根)。
問題基本上與https://mathematica.stackexchange.com/questions/91784/how-to-find-numerically-all-roots-of-a-function-in-a-given-range?noredirect=1&lq相同= 1 ,然而Mathematica的答案,我想用Python。
PS:我現在如何編寫我自己的算法,但由於這些內容往往較慢,我希望找到一個同樣的內置函數。 特別是我讀過這篇文章在給定的時間間隔內查找函數的根
您可以使用scipy.optimize.bisect
,它使用兩個參數a
和b
來定義起始間隔。 但是有一些限制:
f(a)
和f(b)
必須有相反的符號)所以,例如,你找不到f(x) = abs(x)
(如果那是偶數的話)根“在數學意義上”。 此外,它不適用於f(x) = x**2 - 1
和[a,b]的間隔,其中<-1且b> 1。 另一種方法是使用scipy.optimize.minimize
來最小化abs(f(x))
。 此函數可以采用包含無窮大的bounds
。 但最小化可能最終導致函數的非根局部最小值。
人們普遍認為,對於平滑,表現良好的函數, Brent方法是保證提供根的最快方法。 與列出的其他兩種方法一樣,您必須提供一個間隔[a,b],函數是連續的並且會改變符號。
Scipy實現在此處記錄 。 您提到的函數的示例用例可能如下所示:
from __future__ import division
import scipy
def func(x,t):
return(x**2 - 1/t)
t0 = 1
min = 0
max = 100000 # set max to some sufficiently large value
root = scipy.optimize.brentq(func, min, max, args = (t0)) # args just supplies any extra
# argument for the function that isn't the varied parameter
傳統上,您可以使用root
:
import numpy as np
from scipy.optimize import root
def func(x, t):
return x ** 2 - 1. / t
t = 5000
res = root(func, 0.5, args=(t, )).x[0]
print res
這將打印正面的,在這種情況下0.0141421356237
。
如果要指定范圍並確定此間隔內的所有根 ,可以使用chebpy
:
from chebpy import chebfun
x = chebfun('x', [-100000, 100000])
t = 5000
f = x ** 2 - 1. / t
rts = f.roots()
print rts
在這種情況下,這將打印正根和負根
[-0.01413648 0.01413648]
如果您只想查看正范圍,則可以更改
x = chebfun('x', [-100000, 100000])
至
x = chebfun('x', [0, 100000])
但是,我不知道如何使用無限,但我認為你可以使用非常高的數字用於實際目的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.