我应该找到一组函数f_t
在几个根(实际上是两个)。我想找到“第一个”根,并与fsolve
做这个工作正常的时间。问题是,这两个根收敛,因为 t 到无穷大。(我的函数的一个简单的例子是f_t(x) = x^2 - 1/t
)。
这个问题本质上与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:我现在如何编写自己的算法,但是由于这些算法往往会像 builtins 一样慢,所以我希望找到一个执行相同操作的 builtin。特别是我已经阅读了这篇文章Find root of a function in a given interval
通常认为,对于平稳、行为良好的函数,Brent method是保证提供根的最快方法。与列出的其他两种方法一样,您必须提供一个区间 [a,b],函数在该区间内是连续的并改变符号。
Scipy 实现记录为here。您提到的函数的示例用例可能如下所示:
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
您可以使用scipy.optimize.bisect
,它采用两个参数a
和b
来定义起始间隔。
间隔必须是有限的。不能在 [0,inf] 中搜索。
该函数必须在根处翻转符号(f(a)
和f(b)
必须具有相反的符号),因此,例如,您找不到f(x) = abs(x)
的根(如果在数学意义上甚至是“根”)。此外,它不适用于f(x) = x**2 - 1
和间隔为 [a,b] 的 a & lt;-1 和 b & gt;
该方法不是基于梯度的。如果函数非常参差不齐或评估成本很高,但在其他函数上可能会更慢,这可能是一个优势。
另一种方法是使用scipy.optimize.minimize
来最小化abs(f(x))
。该函数可以采用包含无穷大的bounds
。但是最小化可能会在函数的非根局部最小值中结束。
传统上,您可以使用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])
然而,我不知道如何使用无穷大,但你可以使用一个非常高的数字用于实际目的,我认为。
本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处
评论列表(24条)