4次方程的求根公式是什么?

Happy_Wawe 2002-11-19 09:35:27
4次方程的求根公式是什么?
...全文
899 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
horris 2002-11-20
  • 打赏
  • 举报
回复
下面是我做过的C++源程序,是按照上述书中的算法,我记得根据我那个方程式的具体特点做了些小改动,具体的忘了,但应该对你有帮助。代码注释里面提到式子、变量名请见书。

// se2() -- se4() 求 2 -- 4 次方程的互异实根
// 方程系数在zpr数组中, 解三,四次方程时zpr[0]必须为1
// 方程的根在zlc数组中, 函数返回值为互异实根的个数
// 采用的算法由下列参考算法简化改制而来
// 参考算法:第九章“求解多项式方程”,9.2节 -- 9.4节, p340 -- p350,
// 《C语言数值算法》,张圣华,海洋出版社,1993

int CXxxx::se2()
{
double b,c,d;

b = -zpr[1]/zpr[0]*0.5 ; // -b/(2a)
c = zpr[2]/zpr[0] ; // c/a
d = b*b-c ;
if ((d-0)>0.0)
{
if ((b-0)>0.0) b=zlc[1]=b+sqrt(d);
else b=zlc[1]=b-sqrt(d);
zlc[0]=c/b;
return(2);
}
else if ((d-0)==0.0)
{
zlc[0]=b;
return(1);
}
else return(0);
}
int CXxxx::se3()
{
double s,t,b,c,d;

s=zpr[1]/3; // =b1/3
t=s*zpr[1]; // =b1^2/3
b=(s*(t/1.5-zpr[2])+zpr[3])*0.5; // =q/2
t=(t-zpr[2])/3; // = -p
c=t*t*t; // = (-p)^3
d=b*b-c; // =(q/2)^2+p^3=S
if (d>=0.0)
{
d=pow(sqrt(d)+fabs(b),1.0/3.0); // =(|q/2|+S)^(1/3)
if (d!=0.0)
{ // 只有一个实根
if (b>0.0) b = -d ; // =v
else b=d; // =u
c=t/b; // =u或v
}
b += c ; // =u+v
c=zlc[1]= -0.5*b-s ;
zlc[0]=b-s;
if (d==0.0) return(2); else return(1);
}
else // 有三个互异实根
{
if (b==0.0) d=atan(1)/1.5; // q/2=0,d=PI/6=|fi|/3
else d=atan(sqrt(-d)/fabs(b))/3;// q/2!=0,d=|fi|/3
if (b<0.0) b=2*sqrt(t); // q/2<0,b=2*sqrt(-p)
else b= -2*sqrt(t); // q/2>=0,b= -2*sqrt(-p)
c=cos(d)*b; // =x1+b1/3
t = -sqrt(0.75)*sin(d)*b-0.5*c; // =x2+b1/3
zlc[0]=c-s;
zlc[1]=t-s;
zlc[2]= -t-c-s;
return(3);
}
}
int CXxxx::se4()
{
double a,b,c,d,e;
int i,j,k;

e=zpr[1]/4; // =p1/4;
b=e+e;
c=b*b;
d=0.75*c;
b=zpr[3]+b*(c-zpr[2]);
a=zpr[2]-d;
c=zpr[4]+e*(e*a-zpr[3]);
a -= d ; // a,b,c为式9-8中的系数a,b,c
zpr[1]=0.5*a;
zpr[2]=(zpr[1]*zpr[1]-c)*0.25;
zpr[3]=b*b/(-64.0); // zpr[0 -- 3] 为方程9-11的系数
if ((zpr[3]-0)<0.0)
{ // b!=0,则A!=0
j=se3();
for (k=0;k<j;k++) if ((zlc[k]-0)>0)
{ // 找到方程9-11的正实根
d=zlc[k]*4; // =A^2
a += d ;
if ( ( a>=0 && b>=0 ) || ( a<0 && b<0 ) ) zpr[1]=sqrt(d);
else zpr[1] = -sqrt(d);
b=0.5*(a+b/zpr[1]);
/* zpr[2]=c/b; // 由BB'=C
j=se2();
for (k=0;k<j;k++) zlc[2+k]=zlc[k];
zpr[1] *= -1;
zpr[2]=b;
k=se2();
for (i=0;i<j;i++) zlc[k+i]=zlc[2+i];
for (i=0;i<j+k;i++) zlc[i] -= e ;
return(j+k);*/
if (b>3.96e-12)
{
zpr[1] *= -1;
zpr[2]=b;
se2();
zlc[0] -= e ;
}
else
{
zpr[2]=c/b;
se2();
if (b<-2.153e-11)
zlc[0]=zlc[1]-e;
else
zlc[0] -= e ;
}
return(1);
}
}
if ((zpr[2]-0)<0.0)
{ // b=0,A!=0
b=sqrt(c);
d=b+b-a;
if ((d-0)<=0.0) zpr[1]=0;
else zpr[1]=sqrt(d);
}
else
{ // b=0,A=0
if ((zpr[1]-0)>0.0) b=2*sqrt(zpr[2])+zpr[1];
else b = -2*sqrt(zpr[2])+zpr[1];
if ((b-0)!=0.0) zpr[1]=0;
else
{ // p1=a=c=0,即a=b=c=0
zlc[0]= -e;
return(1);
}
}
zpr[2]=c/b;
j=se2();
for (k=0;k<j;k++) zlc[2+k]=zlc[k];
zpr[1] *= -1 ;
zpr[2] = b ;
k=se2();
for (i=0;i<j;i++) zlc[k+i]=zlc[2+i];
for (i=0;i<j+k;i++) zlc[i] -= e ;
return(j+k);
}
horris 2002-11-20
  • 打赏
  • 举报
回复
第九章“求解多项式方程”,9.2节 -- 9.4节, p340 -- p350,《C语言数值算法》,张圣华,海洋出版社,1993
司马青衫依旧 2002-11-20
  • 打赏
  • 举报
回复
上面几位老兄讲得对!
可以说大于等于4次的方程不存在求根公式, Riemann() 老兄说得很队。
我看过很早的一本高中代数书第三册(我学的时候只有上下两侧了),有详细的介绍高次方程的解法。应该说没有直接的求根公式了。解法大概就像 Riemann() 讲的一样,记不清楚了。
Heskey 2002-11-20
  • 打赏
  • 举报
回复
三次、四次方程都有精确的求根公式,可惜很复杂,我记不住。大概是这样的:
三次方程只能解
x^3 + px + q = 0 (1)
形式的,而
ax^3 + bx^2 + cx + d = 0 (2)
可由变量替换转化成(1)式的,也就可解了;
四次方程可由变量替换转成 (2) 的形式,也就有了确定的复数解。
zfive 2002-11-20
  • 打赏
  • 举报
回复
ThreeColor(三色) :
“* 代数方程理论已经证明:大于等于4次的方程不存在求根公式!*”


好象不对吧,阿贝尔证明的》=5次,而不是4

好象用求三次的就能求4次,关于三次方程求根公式你去google搜搜


Riemann 2002-11-20
  • 打赏
  • 举报
回复
请不要无解我的意思,我是说四次求根公式是存在的,其推导方法就像我上面所说的那样
Riemann 2002-11-19
  • 打赏
  • 举报
回复
对于四次方程a*x^4+b*x^3+c*x^2+d*x+e=0,先检查方程是否由零根,若无,方程两边同时除以x^2,然后作代换y=x+1/x,则方程可化为二次方程,以后的过程就很容易了。
Riemann 2002-11-19
  • 打赏
  • 举报
回复
to ThreeColor(三色):四次方程由求根公式。
三色 2002-11-19
  • 打赏
  • 举报
回复
代数方程理论已经证明:大于等于4次的方程不存在求根公式!
shw014 2002-11-19
  • 打赏
  • 举报
回复
http://www.fg.tp.edu.tw/~math/source/attractive.htm

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧