簡體   English   中英

查找給定范圍內的函數的根

[英]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 ,它使用兩個參數ab來定義起始間隔。 但是有一些限制:

  • 間隔需要是有限的。 您無法在[0,inf]中搜索。
  • 該函數必須在根處翻轉符號( 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM