C++代码实现牛顿迭代法求非线性方程的解与一个数的立方根

 

牛顿迭代法

牛顿迭代法解非线性方程,是把非线性方程 f(x) = 0 线性化的一种近似方法。把 f(x) 在点 x_{0}  的某邻域范围内展开成泰勒级 \tiny {\color{Magenta} f(x) = f(x_{0}) + f'(x_{0})(x-x_{0}) + f''(x_{0})(x-x_{0})^2/2! + ... + f^{(n)}(x_{0})(x-x_{0})^{n}/n! + R_{n}(x)}
取其线性部分(即泰勒展开的前两项),并令其等于0,即\tiny {\color{Red} f(x_{0}) + f'(x_{0})(x-x_{0}) = 0}
以此作为非线性方程\tiny f(x) = 0的近似方程,若\tiny f'(x) \neq0,则其解为\tiny {\color{Red} x_{1} = x_{0} - f(x_{0}) /f'(x_{0})}, 这样,得到牛顿迭代法的一个迭代关系式:\tiny x_{n+1} = x_{n} - f(x_{n}) / f'(x_{n})

已经证明,如果是连续的,并且待求的零点是孤立的,那么在零点周围存在一个区域,只要初始值位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

牛顿法解决非线性方程的解

假设我们求解的方程为:\tiny f(x) = (x-1)^3,则\tiny f'(x) = 3(x-1)^2 = 3x^2 - 6x + 3

可知  \tiny x =x - \frac{f(x)}{f'(x)} = x - \frac{(x-1)^3}{3x^2-6x+3} = \frac{2x - \frac{3}{x}+\frac{1}{x^2}}{3} +1

#include<iostream>
#include<math.h>

using namespace std;


float fun(float x)
{
    if (fabs(x*x*x - 3*x*x + 3*x - 1) < 0.000001)
        return x;
    else
        {
            return fun((2 * x  - 3 /x + 1 /(x*x)) / 3 + 1);
        }
}
int main()
{
    float a = 2.0;//随机预测方程的值
    cout <<"计算出的方程的根为:"<< fun(a) << endl;
}

输出结果为: 

若想知道经过多少次的迭代才能计算出方程的根,可输入跌代次数即可。 

#include <iostream>
#include <cmath>
using namespace std;

double fun1(double x)
{
    return 1*x*x*x-3*x*x+3*x-1; //原函数fun1=(x-1)^3
}

double fun2(double x)
{
    return 3*x*x-6*x+3; //原函数的导数fun2
}

int main()
{
    double f1,f2,x,d;
    int count = 0;  //统计迭代的次数
    x = 100;    //随机赋予的方程的解
    do {
        f1 = fun1(x);   //方程的值 
        f2 = fun2(x);   //方程的导数 
        d = f1/f2; 
        x -= d; //更新方程的值 
        count ++;
        cout<<"第"<<count<<"次迭代方程的值为: "<<fun1(x);
        cout<<"     当前的近似根为: "<<x<<endl;
    } while(fabs(d) > 1e-5);
    cout<<"总迭代次数:"<<count<<endl;
    cout<<"最终的近似根为:"<<x;
    return 0;
}

输出结果如下:

牛顿法求解一个数的立方根

首先:不妨设 \tiny f(x) = x^3 - y , \tiny x是求解的立方根的值,\tiny y 即为 我们实际要求的立方根。

其次:根据牛顿迭代法\tiny x_{n+1} = x_{n} - f(x_{n}) / f'(x_{n}) ,得到 \tiny f'(x) = 3x^2,则  \tiny x = \frac{x^3-y}{3x^2}=\frac{2x+\frac{y}{x^2}}{3}.

#include<iostream>
#include<math.h>

using namespace std;


float fun(float x, float y)
{
    if (fabs(x*x*x - y) < 0.000001)
        return x;
    else
        {
            return fun((2 * x + y / x / x ) / 3, y);
        }
}
int main()
{
    float a, b;
    cin >> a >> b;//a为猜测的立方根,b为实际所要求的立方根。
    cout << fun(a, b) << endl;
}

代码运行结果为:

猜你喜欢

转载自blog.csdn.net/qq_28632639/article/details/78892828