#include <stdio.h>
#include <math.h>
void getEigenValue(double a[][3], double eigen[3]) {
double b,c,d,f,g,h;
double i,j,k,l,m,n, sign, eq1, eq2, eq3;
double p,q,r,s,t,u,x1,x2,x3;
b=a[0][0]+a[1][1]+a[2][2];
b=-b;
c=a[0][0]*(a[1][1]+a[2][2])+a[1][1]*a[2][2];
c=c-a[1][2]*a[2][1]-a[0][1]*a[1][0]-a[0][2]*a[2][0];
d=a[0][0]*(a[1][1]*a[2][2]-a[1][2]*a[2][1])
+a[2][0]*(a[0][1]*a[1][2]-a[1][1]*a[0][2])
+a[1][0]*(a[0][2]*a[2][1]-a[2][2]*a[0][1]);
d=-d;
f=(3.0*c-b*b)/3.0;
g=(2.0*b*b*b-9.0*b*c+27.0*d)/27.0;
h=g*g/4.0+f*f*f/27.0;
printf("b=%g c=%g d=%g\n", b, c, d);
//printf("f=%g g=%g h=%g\n", f, g, h);
if(h>0) {
r=-g/2.0+sqrt(h);
if(r<0) { r=-r; sign=-1.0; } else sign=1.0;
s=sign*pow(r, 1.0/3.0);
t=-g/2.0-sqrt(h);
if(t<0) { t=-t; sign=-1.0; } else sign=1.0;
u=sign*pow(t, 1.0/3.0);
x1=(s+u)-b/3.0;
eigen[0]=x1; eigen[1]=0.0; eigen[2]=0.0;
}
else if(h==0) {
if(d<0) { d=-d; sign=-1.0; } sign=1.0;
x1=-1.0*sign*pow(d, 1.0/3.0);
eigen[0]=x1; eigen[1]=0.0; eigen[2]=0.0;
}
else {
i=g*g/4.0-h;
i=sqrt(i);
j=pow(i, 1.0/3.0);
k=-g/(2.0*i);
k=acos(k);
l=-j;
m=cos(k/3.0);
n=sqrt(3.0)*sin(k/3.0);
p=-b/3.0;
x1=2*j*m+p;
x2=l*(m+n)+p;
x3=l*(m-n)+p;
eq1=x1*x1*x1+b*x1*x1+c*x1+d;
eq2=x2*x2*x2+b*x2*x2+c*x2+d;
eq3=x3*x3*x3+b*x3*x3+c*x3+d;
if(fabs(eq1)<0.00000000001) eq1=0.0;
if(fabs(eq2)<0.00000000001) eq2=0.0;
if(fabs(eq3)<0.00000000001) eq3=0.0;
//printf("i=%g j=%g k=%g l=%g m=%g\n", i, j, k, l, m);
printf("x1=%.14f \teq1=%g\n", x1, eq1);
printf("x2=%.14f \teq2=%g\n", x2, eq2);
printf("x3=%.14f \teq3=%g\n", x3, eq3);
eigen[0]=x1; eigen[1]=x2; eigen[2]=x3;
}
}
int main() {
double a[3][3]={{-2,2,3},{-1,1,3},{2,0,-1}};
double eigen[3];
getEigenValue(a, eigen);
printf("eigen values are %.14f %.14f %.14f",
eigen[0], eigen[1], eigen[2]);
return 0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
타일클리어 (0) | 2012.09.18 |
---|---|
파일에서 읽어서 단순 연결리스트 만들기 (0) | 2012.09.16 |
printf() 출력 결과에 대해서 어셈블리어 관련시켜 설명 부탁드립니다. (0) | 2012.08.23 |
4칙 연산 - 간단한 계산기 (0) | 2012.08.23 |
4원 1차 연립방정식 - 2개의 식 (0) | 2012.08.23 |