Algorithm学习笔记 --- 一元三次方程求解(二分法)

来源:互联网 发布:卡盟源码下载 编辑:程序博客网 时间:2024/06/05 15:25

有形如:ax3+bx2+cx+d=0  这样的一个一元三次方程。给出该方程中各项的系数(abcd  均为实数),并约定该方程存在三个不同实根(根的范围在-100100之间),且根与根之差的绝对值>=1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后2位。
提示:记方程f(x)=0,若存在2个数x1x2,且x1<x2f(x1)*f(x2)<0,则在(x1x2)之间一定有一个 根。

一个三次方程的各项系数

三个解

1   -5   -4   20

-2.00   2.00   5.00



分析:

此题用二分法求解:

代码:
#include<iostream>
#include<cmath>
using namespace std;
double x[3];
double a,b,c,d,u,v;
int i,t;
double f(double x)
 {
     double temp;
     temp=((a*x+b)*x+c)*x+d;
     return temp;
 }   
int main()
 { 
         while(cin>>a>>b>>c>>d)
      {
          t=-1;
          for(i=-100;i<=100;i++)
           {
               u=double(i);
               v=u+0.99999;
               if(fabs(f(u))<0.00001||f(u)*f(v)<=0)
                {
                    t++;
                    if(fabs(f(u))<0.00001)
                       x[t]=u;
                    else
                       {
                        while((u+0.001<v)&&fabs(f((u+v)/2))>=0.00001)  
                          
                           {
                               if(f(u)*f((u+v)/2)<0)
                                 v=(u+v)/2;
                               else
                                 u=(u+v)/2; 
                           }
                        x[t]=(u+v)/2;     
                       }      
                }   
           }   
      cout.setf(ios::fixed);
      cout.precision(2);
      cout<<x[0]<<" "<<x[1]<<" "<<x[2]<<endl;
      }
    
     return 0;
 }   
 

0 0
原创粉丝点击