1-1.2 数值方法B 续
求解非线性方程
一般地,对一个方程求解,就是令\(f(x)=0\)。那么,解方程就意味着找到方程的根(root)。
有很多求解非线性方程的方法,它们一般有两种分类;
- 区间法/夹逼法:选择一个区间,该区间的两端函数值的符号相反,然后逐步缩小区间以逼近根。
这种方法总能收敛,但收敛速度较慢。 - 开区间法:只需要一个初始猜测值,然后使用迭代公式逼近根。
这种方法计算速度快,但不保证收敛:如果初始猜测不够好,可能导致找不到根或发散。
以下是几种常见的求解非线性方程根的数值方法:
-
二分法:区间法,即通过逐渐缩小一个已知包含根的区间来逼近解。
-
牛顿-拉夫森法:开区间法。
-
割线法:牛顿法的改进版,它无需计算导数,而是通过两点的割线来近似导数,其迭代公式为:
\[x_{n+1}=x_n-\frac{f(x_n)(x_n-x_{n-1})}{f(x_n)-f(x_{n-1})} \] -
布伦特法:结合了二分法的稳健性和牛顿法的快速收敛性,在函数符号发生变化的区间内,逐步收缩区间,同时采用类似牛顿法的二次插值以加速收敛。
牛顿-拉夫森法
使用该法的基本步骤:
-
选择初始猜测解\(x_i\)
-
对函数\(f(x)\)进行一阶泰勒展开:
\[0=f_T(x_{i+1})=f(x_i)+f^{\prime}(x_i)(x_{i+1}-x_i) \]\[x_{i+1}=x_i-\frac{f(x_i)}{f^{\prime}(x_i)} \]
\(f_T(x)=f(x_i)+f^{\prime}(x_i)(x-x_i)\)
表示\(x_i\)处的线性近似。
目标是找到使得\(f(x)=0\)成立的x值,因此令\(f_{T}(x)=0\):这就是牛顿-拉夫森法的迭代公式。
-
在\(x_i\)处,计算函数斜率\(f^{'}(x_i)\),回代进上述迭代公式以更新迭代。
该法的一些陷阱(pitfalls):
-
初始猜测\(x_0\)必须接近实际根;
-
收敛依赖于函数的性质:
- 接近拐点:函数的导数\(f^{'}(x)\)接近0,特别是在\(f^{''}(x)=0\)时,迭代过程可能由于导数过小,步长过大,算法跳出根附近的区域,进而无法收敛,如图a;
- 接近极值点:接近极大值或极小值时,迭代过程可能在不同点之间来回震荡(如图b),可能跳到另一个不相关的根(如图c),还可能完全发散(如图d)。
-
没有类似二分法的区间保证,因此无法收敛时,可能发散,导致迭代步伐越走越远;
-
需要计算函数的导数,对一些复杂函数而言可能非常麻烦,或者导数本身在某些点附近非常小,甚至为0,导致算法失败。
应对措施:
- 设置最大迭代次数,防止算法进入无限循环或发散;
- 检查\(|f(x_{n})|\)的大小,确保其逐渐趋近于0;
- 尝试其他数值方法。
标签:1.2,导数,牛顿,数值,区间,收敛,方法,迭代,函数 From: https://www.cnblogs.com/yukibvvd/p/18513272/112-numerical-method-b-continuation-f0k3s