考研数学:用切线法求方程的近似解

1. 切线法(牛顿迭代法)的原理

切线法是一种求解方程\(f(x) = 0\)的迭代方法。

基本思想:利用函数\(y = f(x)\)在某一点处的切线来近似代替函数曲线,然后求出切线与\(x\)轴的交点,将这个交点作为方程根的新的近似值,不断重复这个过程,直到达到所需的精度。

设函数\(y = f(x)\)在区间\([a,b]\)上具有二阶导数,且\(f(a)f(b)<0\),\(f^{\prime}(x)\)和\(f^{\prime \prime}(x)\)在区间\([a,b]\)上保持符号不变。

如果\(f(a)f^{\prime \prime}(a)>0\),则取初始值\(x_{0}=a\);如果\(f(b)f^{\prime \prime}(b)>0\),则取初始值\(x_{0}=b\)。

2. 切线法(牛顿迭代法)的迭代公式推导

设\(x_{n}\)是第\(n\)次迭代得到的近似根,函数\(y = f(x)\)在点\(x_{n}\)处的切线方程为\(y - f(x_{n})=f^{\prime}(x_{n})(x - x_{n})\)。

令\(y = 0\),则切线与\(x\)轴交点的横坐标\(x_{n + 1}=x_{n}-\frac{f(x_{n})}{f^{\prime}(x_{n})}\),这就是切线法(牛顿迭代法)的迭代公式。

例如,用切线法求方程\(x^{3}-x - 1 = 0\)的近似解。

设\(f(x)=x^{3}-x - 1\),则\(f^{\prime}(x)=3x^{2}-1\)。

因为\(f(1)= - 1\),\(f(2)=5\),\(f^{\prime \prime}(x)=6x>0\)(\(x>0\)),\(f(2)f^{\prime \prime}(2)>0\),所以取初始值\(x_{0}=2\)。

第一次迭代:

根据迭代公式\(x_{n + 1}=x_{n}-\frac{f(x_{n})}{f^{\prime}(x_{n})}\),\(n = 0\)时,\(x_{1}=x_{0}-\frac{f(x_{0})}{f^{\prime}(x_{0})}\)。

\(f(2)=5\),\(f^{\prime}(2)=3\times2^{2}-1 = 11\),则\(x_{1}=2-\frac{5}{11}=\frac{17}{11}\approx1.545\)。

第二次迭代:

\(n = 1\),\(x_{2}=x_{1}-\frac{f(x_{1})}{f^{\prime}(x_{1})}\)。

\(f(\frac{17}{11})=(\frac{17}{11})^{3}-\frac{17}{11}-1=\frac{4913}{1331}-\frac{17}{11}-1=\frac{4913 - 2057 - 1331}{1331}=\frac{1525}{1331}\)。

\(f^{\prime}(\frac{17}{11})=3\times(\frac{17}{11})^{2}-1=\frac{867}{121}-1=\frac{746}{121}\)。

则\(x_{2}=\frac{17}{11}-\frac{\frac{1525}{1331}}{\frac{746}{121}}=\frac{17}{11}-\frac{1525\times121}{1331\times746}\approx1.355\)。

可以继续进行迭代,直到满足精度要求为止。例如,如果要求精度达到\(\vert x_{n + 1}-x_{n}\vert<\varepsilon\)(\(\varepsilon\)为给定的精度值),通过不断迭代,就可以得到满足精度要求的方程近似解。

用C++求解方程 \(f(x) =x^{3}-x - 1 = 0\)

#include <iostream>

#include <cmath>

using namespace std;

// 定义要求解的方程

double equation(double x) {

return x * x * x - x - 1;

}

// 定义方程的导数

double derivative(double x) {

return 3 * x * x - 1;

}

// 切线法(牛顿迭代法):基于当前近似解处的函数值和导数值,按照迭代公式不断更新近似解,当相邻两次近似解的差值小于精度要求时停止迭代。

double newtonMethod(double initialGuess, double tolerance) {

double xn = initialGuess;

double xnPlus1;

do {

xnPlus1 = xn - equation(xn) / derivative(xn);

if (fabs(xnPlus1 - xn) < tolerance)

break;

xn = xnPlus1;

} while (true);

return xnPlus1;

}

可以使用以下方式调用切线法函数:

int main() {

double initialGuess = 2;  // 初始猜测值

double tolerance = 0.0001;  // 精度要求

double root = newtonMethod(initialGuess, tolerance);

cout << "切线法(牛顿迭代法)求得的近似根为: " << root << endl;

return 0;

}

高等数学

考研数学:用切线法求方程的近似解