数值计算讨论组

Would you like to react to this message? Create an account in a few clicks or log in to continue.
数值计算讨论组

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


    [非]二分法算例

    avatar
    Admin
    Admin


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

    [非]二分法算例 Empty [非]二分法算例

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

    这个程序很简单,不加注释都可以看明白
    Code:
    // test.cpp
    /*
    实验一 非线性方程实根的二分法
    一、目的与要求: 掌握解非线性方程实根的二分法的上机编程运算.
    二、实验内容
    问题1. 用区间二分法求方程x^3-x-1=0在[1,2]的近似根,准确到1e-3,并求若近似根准确到1e-3至少要二分多少次?
    问题2. 用区间二分法求方程x^3-2x^2-4x-7=0 在[3,4]内的根,精确到1e-3.
    */

    // 下面的程序仅解决问题2
    #include <iostream>
    #include <iomanip>
    #include <cmath>
    using namespace std;

    int main()
    {
    double a,b,x,err;
    double f(double x);
    int sgn(double x);
    int temp, k = 0;

    a = 3.0;
    b = 4.0;
    err = b-a;

    while (err >= 0.001)
    {
    x = (b+a)/2.0;
    temp = sgn(f(x));
    if (temp == 0)
    break;
    else if (temp == sgn(f(a)))
    a = x;
    else
    b = x;

    k++;
    err = err/2.0;
    }
    x = (b+a)/2.0;

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

    // f(x)
    double f(double x)
    {
    return (pow(x,3.0) - 2.0*pow(x,2.0) - 4.0*x - 7.0);
    }
    //符号函数
    int sgn(double x)
    {
    if (x > 0) return (1);
    if (x < 0) return (-1);
    return (0);
    }

      目前的日期/时间是周三 五月 15, 2024 4:38 am