求解三次方程.cpp

  1. #include <iostream.h>     
  2. #include <math.h>     
  3. void init(double &a,double &b,double &c,double &d,double &x)     
  4. {     
  5.     do     
  6.     {     
  7.         cout<<“请输入一元三次方程ax^3+bx^2+cx+d=0的各项系数a,b,c,d:”;     
  8.         cin>>a>>b>>c>>d;     
  9.         if (a==0) cout<<“三次项系数不能为0!\n”;     
  10.     } while (a==0);     
  11.     cout<<“您要求解的方程为:”<<a<<“x^3+”<<b<<“x^2+”<<c<<“x+”<<d<<“=0\n”;     
  12.     if (a<0)     
  13.     {     
  14.         a=-a;     
  15.         b=-b;     
  16.         c=-c;     
  17.         d=-d;     
  18.     }     
  19.     cout<<“请输入一个初始值,将在其附近寻根:”;     
  20.     cin>>x;     
  21. }     
  22. double calc(double a,double b,double c,double d,double x)     
  23. {     
  24.     return (a*x*x*x+b*x*x+c*x+d);     
  25. }     
  26. void waya(double a,double b,double c,double d,double x)     
  27. {     
  28.     double max,min;     
  29.     double t;     
  30.     t=calc(a,b,c,d,x);     
  31.     max=x;min=x;     
  32.     if (t<0)      
  33.     {     
  34.         do {     
  35.             max++;     
  36.         } while (calc(a,b,c,d,max)<0);     
  37.         if (calc(a,b,c,d,max)==0)     
  38.         {     
  39.             x=max;     
  40.             t=0;     
  41.         }     
  42.     }     
  43.     if (t>0)      
  44.     {     
  45.         do {     
  46.             min–;     
  47.         } while (calc(a,b,c,d,min)>0);     
  48.         if (calc(a,b,c,d,min)==0)     
  49.         {     
  50.             x=min;     
  51.             t=0;     
  52.         }     
  53.     }     
  54.     while (t!=0&&max-min>1e-10)     
  55.     {     
  56.         if (calc(a,b,c,d,max)*t<0) min=x;     
  57.         else max=x;     
  58.         x=(max+min)/2;     
  59.         t=calc(a,b,c,d,x);     
  60.     }     
  61.     cout<<“原方程的根为:x=”<<x;     
  62. }     
  63. void wayb(double a,double b,double c,double d,double x)     
  64. {     
  65.     double max,min,pre;     
  66.     double t;     
  67.         t=calc(a,b,c,d,x);     
  68.     max=x;min=x;pre=1e10;     
  69.     if (t<0)      
  70.     {     
  71.         do {     
  72.             max++;     
  73.         } while (calc(a,b,c,d,max)<0);     
  74.         if (calc(a,b,c,d,max)==0)     
  75.         {     
  76.             x=max;     
  77.             t=0;     
  78.         }     
  79.     }     
  80.     if (t>0)      
  81.     {     
  82.         do {     
  83.             min–;     
  84.         } while (calc(a,b,c,d,min)>0);     
  85.         if (calc(a,b,c,d,min)==0)     
  86.         {     
  87.             x=min;     
  88.             t=0;     
  89.         }     
  90.     }     
  91.     while (t!=0&&fabs(pre-x)>1e-10)     
  92.     {     
  93.         pre=x;     
  94.         if (calc(a,b,c,d,max)*t<0) min=x;     
  95.         else max=x;     
  96.         x=min-(max-min)/(calc(a,b,c,d,max)-calc(a,b,c,d,min))*calc(a,b,c,d,min);     
  97.         t=calc(a,b,c,d,x);     
  98.     }     
  99.     cout<<“原方程的根为:x=”<<x;     
  100. }     
  101. void wayc(double a,double b,double c,double d,double x)     
  102. {     
  103.     while (calc(0,a*3,b*2,c,x)==0) x++;     
  104.     double px,dx;     
  105.     px=x-calc(a,b,c,d,x)/calc(0,a*3,b*2,c,x);     
  106.     dx=px>x?px-x:x-px;     
  107.     while (dx>1e-10)     
  108.     {     
  109.         x=px;     
  110.         while (calc(0,a*3,b*2,c,x)==0) x++;     
  111.         px=x-calc(a,b,c,d,x)/calc(0,a*3,b*2,c,x);     
  112.         dx=px>x?px-x:x-px;     
  113.     }     
  114.     cout<<“原方程的根为:x=”<<x;     
  115. }     
  116. void menus()     
  117. {     
  118.     int choice;     
  119.     double a,b,c,d,x;     
  120.     init(a,b,c,d,x);     
  121.     do     
  122.     {     
  123.         cout<<“方法一:二分逼近\n方法二:弦截法\n方法三:牛顿迭代法\n”;     
  124.         cout<<“请选择一种方法:(1——3)”;     
  125.         cin>>choice;     
  126.     } while (choice<1||choice>3);     
  127.     switch (choice)     
  128.     {     
  129.     case 1:waya(a,b,c,d,x);break;     
  130.     case 2:wayb(a,b,c,d,x);break;     
  131.     case 3:wayc(a,b,c,d,x);break;     
  132.     }     
  133. }     
  134. void main()     
  135. {     
  136.     char conti;     
  137.     cout<<“*用多种方法求解三次方程\n*”;     
  138.     do     
  139.     {     
  140.         menus();     
  141.         cout<<“继续吗?(y/n)”;     
  142.         cin>>conti;     
  143.     } while (conti!=‘n’&&conti!=‘N’);     
  144. }       
 
 
 
 
 

Leave a Reply

Your email address will not be published.