1. 程式人生 > >C++求解一元三次方程

C++求解一元三次方程

#include<iostream>
#include<cmath>
#include<iomanip>
using namespace std;
double fx(double nparam[3],double x)
{
 <span style="white-space:pre">	</span> return pow(x,3)+nparam[0]*pow(x,2)+nparam[1]*x+nparam[2];
}
int oneresult(double nparam[3],double nrange[2],double via,int position)
{
 <span style="white-space:pre">	</span> double i=via;
 <span style="white-space:pre">	</span> nrange[0]=via;
 <span style="white-space:pre">	</span> if(position==0)
 <span style="white-space:pre">	</span> {
 <span style="white-space:pre">		</span> while(fx(nparam,i)*fx(nparam,via)>0)
 <span style="white-space:pre">		</span> {
 <span style="white-space:pre">			</span> if(i>-10)
 <span style="white-space:pre">				</span> i=i-0.1;
 <span style="white-space:pre">			</span> else
 <span style="white-space:pre">				</span> i=i-1;
 <span style="white-space:pre">			</span> if(i<-100)
 <span style="white-space:pre">				</span> return 1;
 <span style="white-space:pre">		</span> }
 <span style="white-space:pre">		</span> nrange[1]=i;
 <span style="white-space:pre">	</span> }
 <span style="white-space:pre">	</span> else
 <span style="white-space:pre">	</span> {
 <span style="white-space:pre">		</span> while(fx(nparam,i)*fx(nparam,via)>0)
 <span style="white-space:pre">		</span> {
 <span style="white-space:pre">			</span> if(i<10)
 <span style="white-space:pre">				</span> i=i+0.1;
 <span style="white-space:pre">			</span> else
 <span style="white-space:pre">				</span> i=i+1;
 <span style="white-space:pre">			</span> if(i>100)
 <span style="white-space:pre">				</span> return 1;
 <span style="white-space:pre">		</span> }
 <span style="white-space:pre">		</span> nrange[1]=i;
 <span style="white-space:pre">	</span> }
 <span style="white-space:pre">	</span> return 0;
}
double dichotomy(double nparam[3],double x1,double x2)
{
 <span style="white-space:pre">	</span> double x0;
 <span style="white-space:pre">	</span> double x3;
 <span style="white-space:pre">	</span> while(x0=(x1+x2)/2,(x3=fabs(fx(nparam,x0)))>1e-5)
 <span style="white-space:pre">	</span> {
 <span style="white-space:pre">		</span> if(fx(nparam,x0)*fx(nparam,x2)>0)
 <span style="white-space:pre">			</span> x2=x0;
 <span style="white-space:pre">		</span> else
 <span style="white-space:pre">			</span> x1=x0;
 <span style="white-space:pre">	</span> }
 <span style="white-space:pre">		</span> return x0;
}
int Imagequation(double x1,double *p1,double *p2,double *r,double *i)//根據求出來的一個跟,利用待定係數法分解因式,求出兩個虛數解
{
 <span style="white-space:pre">	</span> *p1+=x1;
 <span style="white-space:pre">	</span> *p2+=x1*(*p1);
 <span style="white-space:pre">	</span> *r=-(*p1)/2;
 <span style="white-space:pre">	</span> *i=sqrt(4*(*p2)-pow(*p1,2))/2;
 <span style="white-space:pre">	</span> return 1;




}
int main()
{
 <span style="white-space:pre">	</span> double param[3];
 <span style="white-space:pre">	</span> double dparam[3];
 <span style="white-space:pre">	</span> double range[2];
 <span style="white-space:pre">	</span> double result[3];
 <span style="white-space:pre">	</span> double x1,x2;
 <span style="white-space:pre">	</span> double a,b,c,d;
 <span style="white-space:pre">	</span> int i=0;
 <span style="white-space:pre">	</span> cout<<"請輸入一元三次方程的四個引數A,B,C,D"<<endl;
 <span style="white-space:pre">	</span> cin>>a>>b>>c>>d;
 <span style="white-space:pre">	</span> if(a==0)
 <span style="white-space:pre">	</span> {
 <span style="white-space:pre">		</span> cout<<"您數的引數有誤!!!"<<endl;
 <span style="white-space:pre">		</span> return 1;
 <span style="white-space:pre">	</span> }
 <span style="white-space:pre">	</span> param[0]=b/a;
 <span style="white-space:pre">	</span> param[1]=c/a;
 <span style="white-space:pre">	</span> param[2]=d/a;
 <span style="white-space:pre">	</span> dparam[0]=3;
 <span style="white-space:pre">	</span> dparam[1]=2*param[0];
 <span style="white-space:pre">	</span> dparam[2]=param[1];
 <span style="white-space:pre">	</span> if(dparam[1]*dparam[1]-4*dparam[2]*dparam[0]<0)//單調遞增的,只有一個實數解
 <span style="white-space:pre">	</span> {
 <span style="white-space:pre">		</span> if(1==oneresult(param,range,0,1)&&1==oneresult(param,range,0,0))
 <span style="white-space:pre">		</span> {
 <span style="white-space:pre">			</span> cout<<"無法求解!!!"<<endl;
 <span style="white-space:pre">			</span> return 1;
 <span style="white-space:pre">		</span> }
 <span style="white-space:pre">		</span> else
 <span style="white-space:pre">		</span> {
 <span style="white-space:pre">			</span> if(1==oneresult(param,range,0,1))
 <span style="white-space:pre">				</span> oneresult(param,range,0,0);
 <span style="white-space:pre">			</span> result[0]=dichotomy(param,range[0],range[1]);
 <span style="white-space:pre">			</span> cout<<"xx只有一個實數解!!!"<<endl;
 <span style="white-space:pre">			</span> cout<<"x1="<<result[0]<<endl;
 <span style="white-space:pre">			</span> Imagequation(result[0],&param[0],&param[1],&result[1],&result[2]);
 <span style="white-space:pre">			</span> cout<<"xx有兩個虛數解!!!"<<endl;
 <span style="white-space:pre">			</span> cout<<"x2="<<result[1]<<"+"<<result[2]<<"i"<<endl;
 <span style="white-space:pre">			</span> cout<<"x3="<<result[1]<<"-"<<result[2]<<"i"<<endl;
 <span style="white-space:pre">		</span> }
 <span style="white-space:pre">	</span> }
 <span style="white-space:pre">	</span> else
 <span style="white-space:pre">	</span> {
 <span style="white-space:pre">		</span> x1=(-dparam[1]+sqrt(dparam[1]*dparam[1]-4*dparam[2]*dparam[0]))/(2*dparam[0]);
 <span style="white-space:pre">		</span> x2=(-dparam[1]-sqrt(dparam[1]*dparam[1]-4*dparam[2]*dparam[0]))/(2*dparam[0]);
 <span style="white-space:pre">		</span> if(fx(param,x2)*fx(param,x1)<=0)//極大值和極小值處函式值符號相反,則肯定有三個實數解
 <span style="white-space:pre">		</span> {
 <span style="white-space:pre">			</span> cout<<"有三個實數解!!!"<<endl;
 <span style="white-space:pre">			</span> oneresult(param,range,x2,0);
 <span style="white-space:pre">			</span> result[0]=dichotomy(param,range[0],range[1]);
 <span style="white-space:pre">			</span> oneresult(param,range,x1,1);
 <span style="white-space:pre">			</span> result[1]=dichotomy(param,range[0],range[1]);
 <span style="white-space:pre">			</span> result[2]=dichotomy(param,x2,x1);
 <span style="white-space:pre">			</span> cout.setf(ios::fixed);
 <span style="white-space:pre">			</span> cout<<setprecision(6)<<"x1="<<result[0]<<endl;
 <span style="white-space:pre">			</span> cout<<setprecision(6)<<"x2="<<result[1]<<endl;
 <span style="white-space:pre">			</span> cout<<setprecision(6)<<"x3="<<result[2]<<endl;
 <span style="white-space:pre">		</span> }
 <span style="white-space:pre">		</span> else//極大值和極小值處函式值符號相同,則肯定只有有一個實數解,兩個虛數解
 <span style="white-space:pre">		</span> {
 <span style="white-space:pre">			</span> cout<<"只有一個實數解!!!"<<endl;
 <span style="white-space:pre">			</span> oneresult(param,range,x1,1);
 <span style="white-space:pre">			</span> result[0]=dichotomy(param,range[0],range[1]);
 <span style="white-space:pre">			</span> cout.setf(ios::fixed);
 <span style="white-space:pre">			</span> cout<<setprecision(6)<<"x1="<<result[0]<<endl;
 <span style="white-space:pre">			</span> Imagequation(result[0],&param[0],&param[1],&result[1],&result[2]);
 <span style="white-space:pre">			</span> cout<<"有兩個虛數解!!!"<<endl;
 <span style="white-space:pre">			</span> cout<<"x2="<<result[1]<<"+"<<result[2]<<"i"<<endl;
 <span style="white-space:pre">			</span> cout<<"x3="<<result[1]<<"-"<<result[2]<<"i"<<endl;
 <span style="white-space:pre">		</span> } <span style="white-space:pre">	</span> 
 <span style="white-space:pre">	</span> }
 <span style="white-space:pre">	</span> return 0;
}