C++求解一元三次方程

本文详细介绍了如何使用二分法和待定系数法解决一元三次方程的求根问题,并通过实例展示了求解过程。包括对参数的输入验证、实数解的查找、虚数解的计算及输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值