数值计算讨论组

欢迎来到数值计算讨论组。 本论坛旨在增强师生交流的时效性,主要讨论数值计算相关问题,包括初等数值分析、矩阵计算、非线性方程(组)数值解法、微分方程数值解法等方面的内容。


    [非]简单迭代法算例

    分享

    Admin
    Admin

    帖子数 : 46
    注册日期 : 10-05-13

    [非]简单迭代法算例

    帖子 由 Admin 于 周六 五月 15, 2010 3:45 pm

    /* 实验二 非线性方程实根的简单迭代法与牛顿切线法
    一、目的与要求:掌握解非线性方程实根的简单迭代法与牛顿切线法的上机编程运算.
    二、实验内容
    问题1.用迭代法求方程x^5-x-0.5=0的正根,精确到1e-5 .
    问题2. 求方程x^3-x-1=0在x=1.5附近的一个根.
    问题3. 求方程x^3-2^x-5=0的最小正根.
    问题4. 求方程2^x-lgx=7的最大根.
    问题5. 对方程x*exp(x)-1=0构造收敛的简单迭代格式求其根,要求精度1e-6.

    问题6. 用牛顿切线法求x=exp(-x)在x=0.5附近的根.
    问题7.用牛顿切线法求方程x^3-x-1=0在x=1.5附近的一个根
    */


    // 简单迭代法-问题5
    // 问题5中的x*exp(x)-1在[0,+infinite)单调增,且在[0,1]区间的两个端点处函数值异号,故方程必在(0,1)内有根,
    // 使用简单迭代法求解的话,只需要构造与原方程等价的新方程and确定初始点即可。考虑到简单迭代法的收敛条件,新方程可为:exp(-x)=x,初始点选择0.
    // 此处可以验证新方程f(x)=exp(-x)属于[0,1],当x属于[0,1]时
    #include <iostream>
    #include <cmath>
    #include <iomanip>
    using namespace std;

    int main()
    {
    int k;
    double x,xk,err;
    double f(double x);

    k = 0;
    x = 0.0;
    err = 1.0;
    while (err >= 0.000001)
    {
    xk = f(x);
    err = fabs(xk - x);
    x = xk;
    k = k + 1;
    }

    cout << "K-th iteration: " << k << endl; // 迭代次数
    cout << "err= " << setprecision(12) << err << endl; // 迭代序列最后两项之间的差
    cout << "x= " << setprecision(12) << x << endl; // 方程的解
    cout << "f(x)= " << setprecision(12) << f(x) << endl; // 方程中的函数f(x)在解x点的值
    return 0;
    }

    double f(double x)
    {
    return (exp(-x));
    }

      目前的日期/时间是周二 七月 17, 2018 7:50 am