牛顿迭代法
牛顿迭代法介绍
设 \(r\) 是 \(f(x)=0\) 的根,选取 \(x_0\) 作为 \(r\) 的初始近似值,过点 \(x_0,f(x_0)\) 做曲线 \(y=f(x)\) 的切线 \(L\),\(L:y=f(x_0)+f'(x_0)(x-x_0)\),则 \(L\) 与 \(x\) 轴交点的横坐标 \(x_1=x_0-{f(x_0)\over f'(x_0)}\),称 \(x_1\) 为 \(r\) 的一次近似值。过点 \((x_1,f(x_1))\) 做曲线 \(y=f(x)\) 的切线,并求该切线与 \(x\) 轴交点的横坐标 \(x_2=x_1-{f(x_1)\over f'(x_1)}\),称 \(x_2\) 为 \(r\) 的二次近似值。重复以上过程,得 \(r\) 的近似值序列,其中,\(x_{n+1}=x_n-{f(x)\over f'(x_n)}\) 称为 \(r\) 的 \(n+1\) 次近似值,上式称为牛顿迭代公式。
用牛顿迭代法解非线性方程,是把非线性方程 \(f(x)=0\) 线性化的一种近似方法。把 \(f(x)\) 在点 \(x_0\) 的某邻域内展开成泰勒级数 \(f(x)=f(x_0)+f'(x_0)(x-x_0)+{f''(x_0)(x-x_0)^2\over 2!}+\cdots + {f^{(n)}(x_0)(x-x_0)^n\over n!}+R_n(x)\),取其线性部分(即泰勒展开的前两项),并令其等于 \(0\),即 \(f(x_0)+f'(x_0)(x-x_0)=0\),以此作为非线性方程 \(f(x)=0\) 的近似方程,若 \(f'(x_0)\neq 0\),则其解为 \(x_1=x_0-{f(x_0)\over f'(x_0)}\),这样,得到牛顿迭代法的一个迭代关系式:\(x_{n+1}=x_n-{f(x_n)\over f'(x_n)}\)。
已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为 \(0\), 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。
例如:输入一个正整数 \(n(1\le n\le 1000)\),请求出 \(\sqrt{n}\) 的值,精确到小数点后 \(2\) 位。
#include <iostream>
using namespace std;
int main() {
double n, x;
cin >> n;
x = n;
for (int i = 1; i <= 20; ++i)
x = x - (x*x - n)/(2*x);
cout << x;
}

浙公网安备 33010602011771号