C++求解一元三次方程
阿新 • • 發佈:2019-02-14
#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],¶m[0],¶m[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],¶m[0],¶m[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; }