布伦特方法兼有二分法和反二次插值的优点,只要函数f(x)在方程的有根区间内可求值,其收敛速度就比二分法快且对病态函数也能保证收敛。
设[a, b]为方程f(x) = 0 的一个有根区间,即f(a) f(b)<0,不妨设| f(b)|≤| f(a)|,则算法步骤为:
(1)取c = a,f(c) = f(a)。
(2)若0.5|c-b|<ε或f(b) = 0,则b 点为满足精度要求的根,计算结束;否则,执行下一步。
(3)若a = c,则用二分法求出根的新的近似值x;若a≠c,则用(a, f(a))、(b, f(b))、(c, f(c))三点作反二次插值,得到根的新近似值:X = b+P/Q。其中,P =S[T(R-T)(c-b)-(1-R)(b-a)],Q = (T-1)(R-1)(S-1),R = f(b)/f(c),S = f(b)/f(a),T = f(a)/f(c)。
(4)将原来的b 作为新的a,用x 代替原来的b。
在上述过程中,b 总是当前根的最好的近似值,P/Q 为对b 的一个微小修正值。当修正值P/Q 使新的根的近似值x 跑出了区间[c, b],以及当有根区间用反二次插值计算衰减很慢时,用二分法求根的近似值。
(5)返回(2),重复执行上述步骤;只有当找到了满足精度要求的根或迭代次数已达到给定的最大迭代次数时,上述过程才停止。
用布伦特方法求解非线性方程f(x)的算法步骤如下:
步骤1:输入有根区间端点a 和b、方程精度E1 和解精度E2、最大迭代次数M。
步骤2:计算f(x)在区间[a, b]端点处的函数值f(a)和f(b)。(www.xing528.com)
步骤3:若|f(a)|<E1 或|f(b)|<E1,则输出a 或b,计算结束;否则,往下进行。
步骤4:若 f ( a ) f ( b) > 0,则用二分法找到有根区间[a, b],使 f ( a ) f (b ) < 0。
步骤5:若|f(a)|<|f(b)|,则a↔ b, f ( a)↔f ( b)。
步骤6:取c = a, f ( c)= f ( a )。
对于K = 1, 2, …, M,执行步骤7 至步骤9。
步骤7:若|c-b|/2<E2 或f(b)<E1,则b 为满足精度要求的根,计算结束。
步骤8:若a = c,则用二分法求一根的新的近似值X;若a≠c,则用(a, f(a)),(b, f(b)),(c, f(c))三点作反二次插值,得根的新的近似值:
步骤9:a = b,b = X。
步骤10:输出“布伦特方法已迭代M 次,没有得到符合要求的解”,停止计算。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。