當前位置:編程學習大全網 - 編程語言 - 用c語言求壹個四元二次方程解的個數

用c語言求壹個四元二次方程解的個數

提取公因式後 本題其實是壹個壹元三次方程

根據 三次方程新解法——盛金公式解題法 見/view/1382952.htm#4

編程如下

#include <stdlib.h>

#include <iostream.h>

#include <fstream.h>

#include <cmath>

#include <math.h>

#include <stdio.h>

#include <malloc.h>

#include <string.h>

#define JINGDU double

#define MYSQRT(x) (JINGDU)sqrt((x))

#define ZERO 10e-6

#define MYSIN(x) (JINGDU)sin((x))

#define MYCOS(x) (JINGDU)cos((x))

#define ARCSIN(x) (JINGDU)asin((x))

#define ARCCOS(x) (JINGDU)acos((x))

JINGDU sqr3(JINGDU x)

{

if(x<0) {x=-x;return -(JINGDU)pow(x,1.0/3);}

else return (JINGDU)pow(x,1.0/3);

}

void x3fun(JINGDU a,JINGDU b,JINGDU c,JINGDU d)

{

JINGDU A=b*b-3*a*c,B=b*c-9*a*d,C=c*c-3*b*d,delta=B*B-4*A*C; //A=b^2-3ac;B=bc-9ad;C=c^2-3bd 總判別式:Δ=B^2-4AC。

JINGDU X1,X2,X3;

if(!A&&!B)//當A=B=0時,方程有壹個三重實根

{

if(a)X1=X2=X3=-b/(3*a);

if(b)X1=X2=X3=-c/b;

if(c)X1=X2=X3=-d/c; //X1=X2=X3=-b/(3a)=-c/b=-3d/c

printf("%8f%8f%8f\n",X1,X2,X3);

JINGDU x=X1;

printf("%f",a*x*x*x+b*x*x+c*x+d);

return;

}

if(delta<ZERO&&delta>-ZERO)//當Δ=B^2-4AC=0時,方程有三個實根,其中有壹個兩重根;

{

JINGDU K=B/A;

X1=-b/a+K;

X2=X3=-K/2; //X1=-b/a+K;X2=X3=-K/2

printf("%8f%8f%8f\n",X1,X2,X3);

JINGDU x=X1;

printf("%f",a*x*x*x+b*x*x+c*x+d);

return;

}

if(delta>ZERO)//當Δ=B^2-4AC>0時,方程有壹個實根和壹對***軛虛根

{

JINGDU Y1=A*b+3*a*(-B+MYSQRT(B*B-4*A*C))/2;

JINGDU Y2=A*b+3*a*(-B-MYSQRT(B*B-4*A*C))/2;//Y1,Y2=Ab+3a(-B±(B^2-4AC)^(1/2))/2

X1=(-b-sqr3(Y1)-sqr3(Y2))/(3*a); //X1=(-b-(Y1)^(1/3)-(Y2)^(1/3))/(3a);

JINGDU real=(-2*b+sqr3(Y1)+sqr3(Y2))/(6*a);//X2,X3=(-2b+(Y1)^(1/3)+(Y2)^(1/3))/(6a)

JINGDU complex=MYSQRT(3)*(sqr3(Y1)-sqr3(Y2))/(6*a);//±3^(1/2)((Y1)^(1/3)-(Y2)^(1/3))i/(6a)

printf("%5f\t",X1);

printf("%f+%fi\t",real,complex);

printf("%f-%fi\t\n",real,complex);

JINGDU x=X1;

printf("%f",a*x*x*x+b*x*x+c*x+d);

return;

}

if(delta<ZERO)//當Δ=B^2-4AC<0時,方程有三個不相等的實根

{

JINGDU T=(2*A*b-3*a*B)/(JINGDU)pow(2*A,3/2);//T= (2Ab-3aB)/(2A^(3/2))

JINGDU xita=ARCCOS(T); //θ=arccosT

X1=(-b-MYSQRT(2*A)*MYCOS(xita/3))/(3*a);//X1=(-b-2A^(1/2)cos(θ/3))/(3a);

X2=(-b+MYSQRT(A)*(MYCOS(xita/3)+MYSQRT(3)*MYSIN(xita/3)))/(3*a);

X3=(-b+MYSQRT(A)*(MYCOS(xita/3)-MYSQRT(3)*MYSIN(xita/3)))/(3*a);

printf("%8f%8f%8f\n",X1,X2,X3);

JINGDU x=X1;

printf("%f",a*x*x*x+b*x*x+c*x+d);

return;

}

JINGDU x=X1;

printf("%f",a*x*x*x+b*x*x+c*x+d);

}

int main(int argc, char* argv[])

{

//myfilesum();

JINGDU a,b,c,d;

cin>>a>>b>>c>>d;

x3fun(a,b,c,d);

return 0;

}

  • 上一篇:sas編程用什麽軟件?
  • 下一篇:關於單片機的問題
  • copyright 2024編程學習大全網