c++解一元二次方程<二分>

//写代码能缓解焦虑症

c++解一元二次多项式:

数据输入:

1.数值解的精度

2.单调求解区间:键入区间的左、右端点

3.非线性方程:用c++函数实现,把f(x)数学关系式写在c++函数中

数据存储:

1.单调求解区间:const double eps=0.00001;

2.单调求解区间:定义变量double L,R;分别表示区间的左右端点;

3.非线性方程:定义函数double fx(double x);

4.定义计算过程中所需的其他变量,如区间中点,各点函数值等.

数据处理:

求解非线性方法的数值解法。

数据输出:

 

二分法求解:

(1).迭代法计算算法;

计算单调求解区间[L,R]的中点:M=(L+R)/2;

(2)判断M是否满足收敛条件,即是否是方程的解;

  若是,则保存该解(x=M),算法退出

  否则,判断解在左区间[L,M)还是在右区间(L,M]:

  解在左区间的判断条件:f(M)*f(L)>0,同号

  解在右区间的判断条件:f(M)*f(L)<0.异号

  丢弃左区间L←M,端点移动到M点

  丢弃左区间L→M,端点移动到M点

(3).返回,进行下一轮迭代计算

(4).数据输出

  方程的解x及函数值f(x).函数值用于检验方程是否等于零(包括误差)

 

代码:

#include<iostream>
#include<cmath>
using namespace std;
//方程
double fx(double x)
{
    return x*x - x - 2;
}

void main()
{
    //定义
    const double eps = 1.e-5;//精度
    double L, M, R;//区间  中点
    double fL, fM;//区间左端点和中点的函数值
    int Count = 0;//迭代次数 
    cout << "单调区间左端点";
    cin >> L;
    cout << "单调区间右端点";
    cin >> R;
    cout << "f(L)=" << fx(L) << ",f(R)=" << fx(R) << endl;
    if (fx(L)*fx(R)>0)//有解区间;函数两端异号
    {
        cout << "非有解区间:\n";
        system("pause");

    }
    while (fabs(R - L)>eps)//收敛性判断:精度控制
    {
        cout << ++Count << "";
        M = (L + R) / 2;
        fL = fx(L);
        fM = fx(M);
        //解在左区间
        if (fL*fM<0)
        {
            R = M;//右端点移位
        }
        else if (fL*fM>0)
        {
            L = M;//左端点移位
        }
        else
        {
            break;
        }
        cout << L << "," << R << endl;

    }
    cout << "方程的解:" << "x=" << M << "\n函数值:" << fx(M) << endl;
    getchar();

}

 

posted on 2018-06-12 16:08  冲天香阵透长安  阅读(356)  评论(0)    收藏  举报

导航