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;
}

代码运行结果为:

 

 

 

  • 11
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
第1章 矩阵运算1 1.1 实矩阵相乘1 1.2 复矩阵相乘4 1.3 一般实矩阵逆8 1.4 一般复矩阵逆13 1.5 对称正定矩阵的逆18 1.6 托伯利兹矩阵逆的特兰持方法21 1.7 一般行列式的值25 1.8 矩阵的秩29 1.9 对称正定矩阵的乔里斯基分与行列式值33 1.10 矩阵的三角分36 1.11 一般实矩阵的QR分41 1.12 一般实矩阵的奇异值分46 1.13 广义逆的奇异值分法61 第2章 矩阵特征值与特征向量的计算75 2.1 对称三对角阵的全部特征值与特征向量75 2.2 实对称矩阵全部特征值与特征向量的 豪斯荷尔德变换法80 2.3 赫申伯格矩阵全部特征值的QR方法88 2.4 一般实矩阵的全部特征值95 2.5 实对称矩阵特征值与特征向量的雅可比法102 2.6 实对称矩阵特征值与特征向量的雅可比过关法109 第3章 线性代方程组的115 3.1 实系方程组的全选主元高斯消去法115 3.2 实系方程组的全选主元高斯\|约当消去法119 3.3 复系方程组的全选主元高斯消去法124 3.4 复系方程组的全选主元高斯\|约当消去法129 3.5 三对角线方程组的追赶法135 3.6 一般带型方程组139 3.7 对称方程组的分法146 3.8 对称正定方程组的平方根法151 3.9 托伯利兹方程组的列文逊方法155 3.10 高斯\|赛德尔迭代法161 3.11 对称正定方程组的共轭梯度法165 3.12 线性最小二乘问题的豪斯荷尔德变换法169 3.13 线性最小二乘问题的广义逆法175 3.14 病态方程组189 第4章 非线性方程方程组的195 4.1 非线性方程实根的对分法195 4.2 非线性方程一个实根的牛顿法198 4.3 非线性方程一个实根的埃特金迭代法201 4.4 非线性方程一个实根的试位法204 4.5 非线性方程一个实根的连分式法206 4.6 实系方程全部根的QR方法211 4.7 实系方程全部根的牛顿下山法216 4.8 复系方程全部根的牛顿下山法225 4.9 非线性方程组一组实根的梯度法233 4.10 非线性方程组一组实根的拟牛顿法238 4.11 非线性方程组最小二乘的广义逆法246 4.12 非线性方程一个实根的蒙特卡洛法262 4.13 实函或复函方程一个复根的蒙特卡洛法265 4.14 非线性方程组一组实根的蒙特卡洛法269 第5章 插值与逼近274 5.1 Lagrange插值274 5.2 连分式插值277 5.3 埃尔米特插值281 5.4 埃特金逐步插值284 5.5 光滑插值288 5.6 第一种边界条件的三次样条函插值、微商与积分294 5.7 第二种边界条件的三次样条函插值、微商与积分301 5.8 第三种边界条件的三次样条函插值、微商与积分307 5.9 二元Lagrange插值314 5.10 最小二乘曲线拟合319 5.11 切比雪夫曲线拟合326 5.12 最佳一致逼近的里米兹方法332 5.13 矩形域的最小二乘曲面拟合337 第6章 值积分348 6.1 变步长梯形积法348 6.2 变步长辛卜生积法351 6.3 自适应梯形积法353 6.4 龙贝格积法356 6.5 计算一维积分的连分式法359 6.6 高振荡函积法363 6.7 勒让德-高斯积法368 6.8 拉盖尔-高斯积法371 6.9 埃尔米特-高斯积法374 6.10 切比雪夫积法376 6.11 计算一维积分的蒙特卡洛法379 6.12 变步长辛卜生二重积分法382 6.13 计算多重积分的高斯方法386 6.14 计算二重积分的连分式法391 6.15 计算多重积分的蒙特卡洛法395 第7章 常微分方程组的399 7.1 定步长欧拉方法399 7.2 变步长欧拉方法404 7.3 维梯方法409 7.4 定步长龙格-库塔方法414 7.5 变步长龙格-库塔方法419 7.6 变步长基尔方法424 7.7 变步长默森方法430 7.8 连分式法436 7.9 双边法444 7.10 阿当姆斯预报校正法450 7.11 哈明方法456 7.12 特雷纳方法463 7.13 积分刚性方程组的吉尔方法470 7.14 二阶微分方程边值问题的法487 第8章 据处理494 8.1 随机样本分析494 8.2 一元线性回归分析499 8.3 多元线性回归分析503 8.4 逐步回归分析510 8.5 半对据相关521 8.6 对据相关525第9章 极值问题的529 9.1 一维极值连分式法529 9.2 n维极值连分式法532 9.3 不等式约束线性规划问题538 9.4 n维极值的单形调优法545 9.5 约束条件下n维极值的复形调优法552 第10章 复、多项式与特殊函的计算562 10.1 复运算562 10.2 实系多项式的计算569 10.3 复系多项式的计算574 10.4 特殊函的计算581
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值