在给定范围内查找函数的根(root of the function)

我应该找到一组函数f_t在几个根(实际上是两个)。我想找到“第一个”根,并与fsolve做这个工作正常的时间。问题是,这两个根收敛,因为 t 到无穷大。(我的函数的一个简单的例子是f_t(x) = x^2-1/t)。

我应该找到一组函数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

5

通常认为,对于平稳、行为良好的函数,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
2

您可以使用scipy.optimize.bisect,它采用两个参数ab来定义起始间隔。

间隔必须是有限的。不能在 [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。但是最小化可能会在函数的非根局部最小值中结束。

1

传统上,您可以使用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])

然而,我不知道如何使用无穷大,但你可以使用一个非常高的数字用于实际目的,我认为。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(490)
C#从XE获取当前汇率
上一篇
如何获得当前月份 (october month number)
下一篇

相关推荐

发表评论

登录 后才能评论

评论列表(19条)