
C语言一元三次方程求根!
小妹写了一个程序,其中需要求一元三次方程,于是写了个函数。但是这个函数解出来的解就是不对,不知道为什么。我是用盛金公式求解的,我只需要实根。为了把三个根都传出来,我用了数...
小妹写了一个程序,其中需要求一元三次方程,于是写了个函数。但是这个函数解出来的解就是不对,不知道为什么。我是用盛金公式求解的,我只需要实根。为了把三个根 都传出来,我用了数组。求高手看下程序,帮我找下原因。或者有正确的求根程序可以给我个,我比较下。
int root(double a,double b,double c,double d,double z[])
{
double A,B,C,L,T,rad,K,Y1,Y2;
A=pow(b,2)-3*a*c;
B=b*c-9*a*d;
C=pow(c,2)-3*b*d;
printf("A,B,C=%f,%f,%f.\n",A,B,C);
L=B*B-4*A*C;
printf("Δ=%f.\n",L);
if(A==0&&B==0)
{
z[0]=z[1]=z[2]=-c/d;
return 3;
}
if(L>0)
{
Y1=A*b+3*a*(-B+pow(L,(1/2)))/2;
Y2=A*b+3*a*(-B-pow(L,(1/2)))/2;
z[0]=(-b-pow(Y1,(1/3))-pow(Y2,(1/3)))/(3*a);
return 1;
}
else if(L==0)
{
K=B/A;
z[0]=-b/a+K;z[1]=z[2]=-K/2;
return 3;
}
else
{
printf("A=%f.",A);
T=(2*A*b-3*a*B)/(2*pow(A,1.5));
rad=acos(T);
printf("T=%f,rad=%f\n",T,rad);
z[0]=(-b+pow(A,0.5)*cos(rad/3))/3/a;
printf("z0=%f!\n",z[0]); /*检查方程的根正确与否*/
z[1]=(-b+pow(A,(1/2))*(cos(rad/3)+pow(3,(1/2))*sin(rad/3)))/(3*a);
z[2]=(-b+pow(A,(1/2))*(cos(rad/3)-pow(3,(1/2))*sin(rad/3)))/(3*a);
return 3;
}
}
1、已知一个错误,最后一种情况z[0]=(-b-pow(A,0.5)*cos(rad/3))/3/a;不是+!
2、那个弦截法用了 呵呵 但是迭代次数太多~ 想搞个简便的。
3、最新发现,pow(x,y)不能算y为小数的东西!! 展开
int root(double a,double b,double c,double d,double z[])
{
double A,B,C,L,T,rad,K,Y1,Y2;
A=pow(b,2)-3*a*c;
B=b*c-9*a*d;
C=pow(c,2)-3*b*d;
printf("A,B,C=%f,%f,%f.\n",A,B,C);
L=B*B-4*A*C;
printf("Δ=%f.\n",L);
if(A==0&&B==0)
{
z[0]=z[1]=z[2]=-c/d;
return 3;
}
if(L>0)
{
Y1=A*b+3*a*(-B+pow(L,(1/2)))/2;
Y2=A*b+3*a*(-B-pow(L,(1/2)))/2;
z[0]=(-b-pow(Y1,(1/3))-pow(Y2,(1/3)))/(3*a);
return 1;
}
else if(L==0)
{
K=B/A;
z[0]=-b/a+K;z[1]=z[2]=-K/2;
return 3;
}
else
{
printf("A=%f.",A);
T=(2*A*b-3*a*B)/(2*pow(A,1.5));
rad=acos(T);
printf("T=%f,rad=%f\n",T,rad);
z[0]=(-b+pow(A,0.5)*cos(rad/3))/3/a;
printf("z0=%f!\n",z[0]); /*检查方程的根正确与否*/
z[1]=(-b+pow(A,(1/2))*(cos(rad/3)+pow(3,(1/2))*sin(rad/3)))/(3*a);
z[2]=(-b+pow(A,(1/2))*(cos(rad/3)-pow(3,(1/2))*sin(rad/3)))/(3*a);
return 3;
}
}
1、已知一个错误,最后一种情况z[0]=(-b-pow(A,0.5)*cos(rad/3))/3/a;不是+!
2、那个弦截法用了 呵呵 但是迭代次数太多~ 想搞个简便的。
3、最新发现,pow(x,y)不能算y为小数的东西!! 展开
推荐于2016-12-01
展开全部
z[0]=z[1]=z[2]=-c/d;
这个是除以b吧
这个是除以b吧
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
先展开式子:5x3+4x2-x-2=0然后凑5x2(x+1)+x(x+1)-2(x+1)=0。所以要不x+1=0或者是5x2+x-2=0接着你自己会算了吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
试下弦截法
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
可以试试 牛顿切线法,二分法,不过都是求近似值,都很简单
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询