1-1.2 数值方法B 续

1-1.2 数值方法B 续

求解非线性方程

一般地,对一个方程求解,就是令\(f(x)=0\)。那么,解方程就意味着找到方程的根(root)。

有很多求解非线性方程的方法,它们一般有两种分类;

  • 区间法/夹逼法:选择一个区间,该区间的两端函数值的符号相反,然后逐步缩小区间以逼近根。
    这种方法总能收敛,但收敛速度较慢。
  • 开区间法:只需要一个初始猜测值,然后使用迭代公式逼近根。
    这种方法计算速度快,但不保证收敛:如果初始猜测不够好,可能导致找不到根或发散。

以下是几种常见的求解非线性方程根的数值方法:

  1. 二分法:区间法,即通过逐渐缩小一个已知包含根的区间来逼近解。

  2. 牛顿-拉夫森法:开区间法。

  3. 割线法:牛顿法的改进版,它无需计算导数,而是通过两点的割线来近似导数,其迭代公式为:

    \[x_{n+1}=x_n-\frac{f(x_n)(x_n-x_{n-1})}{f(x_n)-f(x_{n-1})} \]

  4. 布伦特法:结合了二分法的稳健性和牛顿法的快速收敛性,在函数符号发生变化的区间内,逐步收缩区间,同时采用类似牛顿法的二次插值以加速收敛。

牛顿-拉夫森法

image

使用该法的基本步骤:

  1. 选择初始猜测解\(x_i\)

  2. 对函数\(f(x)\)进行一阶泰勒展开:
    \(f_T(x)=f(x_i)+f^{\prime}(x_i)(x-x_i)\)
    表示\(x_i\)处的线性近似。
    目标是找到使得\(f(x)=0\)成立的x值,因此令\(f_{T}(x)=0\)

    \[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)} \]

    这就是牛顿-拉夫森法的迭代公式。

  3. \(x_i\)处,计算函数斜率\(f^{'}(x_i)\),回代进上述迭代公式以更新迭代。

该法的一些陷阱(pitfalls):

  1. 初始猜测\(x_0\)必须接近实际根;

  2. 收敛依赖于函数的性质:
    image

    • 接近拐点:函数的导数\(f^{'}(x)\)接近0,特别是在\(f^{''}(x)=0\)时,迭代过程可能由于导数过小,步长过大,算法跳出根附近的区域,进而无法收敛,如图a;
    • 接近极值点:接近极大值或极小值时,迭代过程可能在不同点之间来回震荡(如图b),可能跳到另一个不相关的根(如图c),还可能完全发散(如图d)。
  3. 没有类似二分法的区间保证,因此无法收敛时,可能发散,导致迭代步伐越走越远;

  4. 需要计算函数的导数,对一些复杂函数而言可能非常麻烦,或者导数本身在某些点附近非常小,甚至为0,导致算法失败。

应对措施:

  1. 设置最大迭代次数,防止算法进入无限循环或发散;
  2. 检查\(|f(x_{n})|\)的大小,确保其逐渐趋近于0;
  3. 尝试其他数值方法。

posted @ 2024-10-29 15:05  灰鲤  阅读(22)  评论(0编辑  收藏  举报