brentq

语法

brentq(f, a, b, [xtol], [rtol], [maxIter], [funcDataParam])

参数

f 是一个返回值为一个数值的函数。函数在 [a, b] 内连续且 f(a) 与 f(b) 的正负号需要相反。

a 是一个数值标量,指定区间的左边界。

b 是一个数值标量,指定区间的右边界。

xtol 是一个数值标量,用于指定求解结果的精度,默认值为 2e-12。

rtol 是一个数值标量,用于指定求解结果的精度,默认值为 4 倍的 DOUBLE 类型的机器精度。

maxIter 是一个整形标量,指定 Brent 的最大迭代次数,默认值为 100 。

funcDataParam 是一个向量,指定函数 f 的其他参数。

详情

使用 Brent 方法在一个给定区间 [a, b] 内求出函数 f(x) 的一个根 x0,使得 f(x0)=0 ,求解精度满足 |x-x0| <= (xtol + rtol* |x0| ),其中 x 是精确根,x0 为计算结果。

返回值为长度为2的向量 res:

  • res[0] 是一个字符串标量,表示求解状态。共有三种求解状态:
    • CONVERGED, 表示得到符合预期的解;
    • SIGNERR,表示 f(a) 与 f(b) 同号,不满足正负号相反的要求;
    • CONVERR,表示达到最大迭代次数
  • res[1] 是一个数值标量,表示求得的根。

例子

求解 f(x) = x^2 - 1 在 [-2,0], [0,2] 的根

def f(x) {
    return (pow(x, 2) - 1)
}

root1 = brentq(f, -2, 0)
root2 = brentq(f, 0, 2)
print("root1 : ", root1)
print("root2 : ", root2)

返回如下:

root1 :
("CONVERGED",-1)
root2 :
("CONVERGED",1)

求解带有额外参数的函数 f(x,b) 在 [0,2] 的根:

def f(x, b) {
    return (pow(x, 2) - b)
}
root = brentq(f, 0, 2, 2e-12, 1e-9, 100, [2])
print("root : ", root)

返回如下:

root : 
("CONVERGED",1.414213562373136)