C++解一个一元怎么因式分解三次方程程

#include&iostream&
#include&cmath&
#include&iomanip&
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=
&span style="white-space:pre"& &/span& nrange[0]=
&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 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 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 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 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"&&
&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&&"您数的参数有误!!!"&&
&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 style="white-space:pre"&
&/span& cout&&"无法求解!!!"&&
&span style="white-space:pre"&
&/span& return 1;
&span style="white-space:pre"&
&span style="white-space:pre"&
&/span& else
&span style="white-space:pre"&
&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只有一个实数解!!!"&&
&span style="white-space:pre"&
&/span& cout&&"x1="&&result[0]&&
&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有两个虚数解!!!"&&
&span style="white-space:pre"&
&/span& cout&&"x2="&&result[1]&&"+"&&result[2]&&"i"&&
&span style="white-space:pre"&
&/span& cout&&"x3="&&result[1]&&"-"&&result[2]&&"i"&&
&span style="white-space:pre"&
&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 style="white-space:pre"&
&/span& cout&&"有三个实数解!!!"&&
&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]&&
&span style="white-space:pre"&
&/span& cout&&setprecision(6)&&"x2="&&result[1]&&
&span style="white-space:pre"&
&/span& cout&&setprecision(6)&&"x3="&&result[2]&&
&span style="white-space:pre"&
&span style="white-space:pre"&
&/span& else//极大值和极小值处函数值符号相同,则肯定只有有一个实数解,两个虚数解
&span style="white-space:pre"&
&span style="white-space:pre"&
&/span& cout&&"只有一个实数解!!!"&&
&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]&&
&span style="white-space:pre"&
&/span& Imagequation(result[0],&param[0],&param[1],&result[1],&result[2]);
&span style="white-space:pre"&
&/span& cout&&"有两个虚数解!!!"&&
&span style="white-space:pre"&
&/span& cout&&"x2="&&result[1]&&"+"&&result[2]&&"i"&&
&span style="white-space:pre"&
&/span& cout&&"x3="&&result[1]&&"-"&&result[2]&&"i"&&
&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;
c++解一元三次方程
求解一元三次方程组转自:http://blog.csdn.net/u/article/details/float f(float w_f, float x_f, fl...
一元三次方程求解c++实现
class CubicRealPolynomial
static Number computeDiscriminan...
求解一元三次方程--c++
#include//调用了fabs、pow函数
double f(int,int,int,int,doubl...
算法训练 一元三次方程求解 蓝桥杯
  有形如:ax3+bx2+cx+d=0
这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间)...
用盛金公式求解一元三次方程
解一元三次方程一般用盛金公式求解,算法高效且求出来的解精确。
百度百科关于盛金公式有如下解释:
  Shengjin's Formulas
  一元三次方程aX^3+bX^...
蓝桥杯一元三次方程求解
  有形如:ax3+bx2+cx+d=0
这样的一个一元三次方程。给出该方程中各项的系数(a,b,c,d
均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且...
【Openjudge:Noi】7891:一元三次方程求解 c++
【Openjudge:Noi】7891:一元三次方程求解
总时间限制:
有形如:ax3+bx2+cx+d=0
这样的一...
一元三次方程的分治解法
f(x)=ax^3+bx^2+cx+d
分析:设三个根为 x0,x1,x2 有
f(x)=a(x-x0)(x-x1)(x-x2...
没有更多推荐了,C++初级问题急求解!求一元三次方程实根,输出总是1.#INF00 怎么搞的?!_百度知道
C++初级问题急求解!求一元三次方程实根,输出总是1.#INF00 怎么搞的?!
不知道错在哪了。高手帮帮忙啊~#include&stdio.h&#include&math.h&voidmain(){floata,b,c,d,e,f,g,k,t,y1,y2,z1,z2,p,q,i,x1,x2,x3;e=b*b-3*a*c;f=b*c-9*a*d;g=c*c-3*b*d;t=f*f-4*e*g...
不知道错在哪了。高手帮帮忙啊~#include &stdio.h&#include &math.h&void main(){ float a,b,c,d,e,f,g,k,t,y1,y2,z1,z2,p,q,i,x1,x2,x3; e=b*b-3*a*c; f=b*c-9*a*d; g=c*c-3*b*d; t=f*f-4*e*g; i=c*c-4*b*d; e=k*k*k; q=(2*b*e-3*a*f)/(2*k*k); p=(acos(q))/3; y1=(b*e+(3*a*(-f+sqrt(t))))/2; y2=(b*e+(3*a*(-f-sqrt(t))))/2; y1=z1*z1*z1; y2=z2*z2*z2; printf(&Please enter a,b,c,d\n&); scanf(&%f,%f,%f,%f&,&a,&b,&c,&d); printf(&The equation &); if (a=0) {
{x1=(-c+sqrt(i))/(2*b);
x2=(-c-sqrt(i))/(2*b);
printf(&has two real roots:%f and %f\n&,x1,x2);
else if (i=0)
printf(&has a real root:%f\n&,-c/(2*b));
printf(&has no real root&); } else if (e=f=0)
printf(&has a real root:%f\n&,-c/b); else if (t&0)
printf(&has a real root:%f\n&,(-b-z1-z2)/(3*a)); else if (t=0)
printf(&has two real roots:%f and %f\n&,(-b/a)+(f/e),-f/(2*e)); else {x1=(-b-2*k*k*cos(p))/(3*a);
x2=(-b+k*(cos(p)+sqrt(3)*sin(p)))/(3*a);
x3=(-b+k*(cos(p)-sqrt(3)*sin(p)))/(3*a);
printf(&has three real roots:%f and %f and %f\n&,x1,x2,x3); }}
答题抽奖
首次认真答题后
即可获得3次抽奖机会,100%中奖。
采纳数:392
获赞数:1551
有几个问题,改了一下,加了详细的注释,能输出结果:#include &stdio.h&#include &math.h&void main(){ double a=0,b=0,c=0,d=0,e=0,f=0,g=0,k=0,t=0,y1=0,y2=0,z1=0,z2=0,p=0,q=0,i=0,x1=0,x2=0,x3=0;//double改为float,并初始化 printf(&Please enter a,b,c,d\n&);//把输出操作移到计算之前 scanf(&%lf,%lf,%lf,%lf&,&a,&b,&c,&d);//把%f改为%lf,用于输入double数据 e=b*b-3*a*c; f=b*c-9*a*d; g=c*c-3*b*d; t=f*f-4*e*g; i=c*c-4*b*d; e=k*k*k; q=(2*b*e-3*a*f)/(2*k*k); p=(acos(q))/3; y1=(b*e+(3*a*(-f+sqrt(t))))/2; y2=(b*e+(3*a*(-f-sqrt(t))))/2; y1=z1*z1*z1; y2=z2*z2*z2;//
printf(&Please enter a,b,c,d\n&);//去掉这2行,已经移到前面了//
scanf(&%f,%f,%f,%f&,&a,&b,&c,&d); printf(&The equation &); if (a==0)//=改为==,下面还有几个相同的操作,这是你出问题的主要原因 {
x1=(-c+sqrt(i))/(2*b);
x2=(-c-sqrt(i))/(2*b);
printf(&has two real roots:%f and %f\n&,x1,x2);
else if (i==0)//=改为==
printf(&has a real root:%f\n&,-c/(2*b));
printf(&has no real root&); } else if (e==f && e==0)//=改为==
printf(&has a real root:%f\n&,-c/b); else if (t&0)
printf(&has a real root:%f\n&,(-b-z1-z2)/(3*a)); else if (t==0)//=改为==
printf(&has two real roots:%f and %f\n&,(-b/a)+(f/e),-f/(2*e)); else {
x1=(-b-2*k*k*cos(p))/(3*a);
x2=(-b+k*(cos(p)+sqrt(3)*sin(p)))/(3*a);
x3=(-b+k*(cos(p)-sqrt(3)*sin(p)))/(3*a);
printf(&has three real roots:%f and %f and %f\n&,x1,x2,x3); }}
采纳数:19
获赞数:177
恕我直言,楼主程序写的真的挺不好看的~ 既然楼上有人解决问题了,我就不看了。但还是劝楼主优化自己的程序格式,对以后的发展有好处的
为你推荐:
其他类似问题
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。请教牛顿迭代法的C++的实现程序
[问题点数:200分,结帖人tyuiouio]
本版专家分:1493
结帖率 97.37%
CSDN今日推荐
本版专家分:6435
本版专家分:2308
本版专家分:5545
2010年5月 扩充话题大版内专家分月排行榜第一
2010年7月 扩充话题大版内专家分月排行榜第三
本版专家分:1126
本版专家分:429
本版专家分:536
本版专家分:1254
本版专家分:1493
本版专家分:11
本版专家分:817
本版专家分:5284
本版专家分:2016
匿名用户不能发表回复!
其他相关推荐&>&一元三次方程求解器
一元三次方程求解器
上传大小:128KB
一元三次方程求解器,非常好用。和大家分享一下
综合评分:0
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有0条
yanguilaiwuwei
综合评分:
积分/C币:1
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
一元三次方程求解器
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
一元三次方程求解器转自百度百科
公式法(卡尔丹公式)
(如右图所示)
若用A、B换元后,公式可简记为:
x1=A^(1/3)+B^(1/3);
x2=A^(1/3)&+B^(1/3)&^2;
x3=A^(1/3)&^2+B^(1/3)&。
一元三次方程求根公式判别法
当△=(q/2)^2+(p/3)^3&0时,有一个实根和一对个共轭;
当△=(q/2)^2+(p/3)^3=0时,有三个实根,其中两个相等;
当△=(q/2)^2+(p/3)^3&0时,有三个不相等的。
一元三次方程求根公式推导
ax^3+bx^2+cx+d=0(a&0)
为了方便,约去a得到
x^3+kx^2+mx+n=0
令x=y-k/3 ,
代入方程(y-k/3)^3+k(y-k/3)^2+m(y-k/3)+n=0 ,
(y-k/3)^3中的y^2项系数是-k ,
k(y-k/3)^2中的y^2项系数是k ,
所以相加后y^2抵消 ,
得到y^3+py+q=0,
其中p=-k^2/3+m ,
q=(2(k/3)^3)-(km/3)+n。
方程x^3+px+q=0的三个根为:
x1=[-q/2+((q/2)^2+(p/3)^3)^(1/2)]^(1/3)+[-q/2-((q/2)^2+(p/3)^3)^(1/2)]^(1/3);
x2=w[-q/2+((q/2)^2+(p/3)^3)^(1/2)]^(1/3)+w^2[-q/2-((q/2)^2+(p/3)^3)^(1/2)]^(1/3);
x3=w^2[-q/2+((q/2)^2+(p/3)^3)^(1/2)]^(1/3)+w[-q/2-((q/2)^2+(p/3)^3)^(1/2)]^(1/3),
其中w=(-1+i&3)/2。
&推导过程:
1、方程x^3=1的解为x1=1,x2=-1/2+i&3/2=&,x3=-1/2-i&3/2=&^2 ;
2、方程x^3=A的解为x1=A^(1/3),x2=A^(1/3)&,x3=A^(1/3)&^2 ,
3、一般三次方程ax^3+bx^2+cx+d=0(a&0),两边同时除以a,可变成x^3+sx^2+tx+u=0的形式。
再令x=y-s/3,代入可消去次高项,变成x^3+px+q=0的形式。
设x=u+v是方程x^3+px+q=0的解,代入整理得:
(u+v)(3uv+p)+u^3+v^3+q=0 ①,
如果u和v满足uv=-p/3,u^3+v^3=-q则①成立,
由一元二次方程u^3和V^3是方程y^2+qy-(p/3)^3=0的两个根。
解之得,y=-q/2&((q/2)^2+(p/3)^3)^(1/2),
不妨设A=-q/2-((q/2)^2+(p/3)^3)^(1/2),B=-q/2+((q/2)^2+(p/3)^3)^(1/2),
则u^3=A;v^3=B ,
u= A^(1/3)或者A^(1/3)&或者A^(1/3)&^2 ;
v= B^(1/3)或者B^(1/3)&或者B^(1/3)&^2 ,
但是考虑到uv=-p/3,所以u、v只有三组解:
u1= A^(1/3),v1= B^(1/3);
u2=A^(1/3)&,v2=B^(1/3)&^2;
u3=A^(1/3)&^2,v3=B^(1/3)&,
方程x^3+px+q=0的三个根也出来了,即
x1=u1+v1=A^(1/3)+B^(1/3);
x2=A^(1/3)&+B^(1/3)&^2;
x3=A^(1/3)&^2+B^(1/3)&。
关于三次方程的韦达定理
设原方程为ax^3+b^2+cx+d=0;
由代数基本定理加上数学归纳法可推出其能分解成a(x-x1)(x-x2)(x-x3)的形式(x1,x2,x3&复数域)
所以可以推出
x1x2x3=-(d/a)
x1x2+x2x3+x1x3=c/a
x1+x2+x3=-b/a
这就是三次方程时的韦达定理
阅读(...) 评论()

我要回帖

更多关于 如何解一元三次方程 的文章

 

随机推荐