フリーページ
できました。
9×9の実対称行列の対角化するプログラム完成。
まぁどうなんでしょうね。あんまうまくいってないかもですが今のところOKOKです。
9*9なのでヤコビ法を用いりました。まぁ意外に時間かかりましたね。だいたい俺はプログラムつくんの得意じゃネーんだよ。でも意外に好きだったりする。俺も成長したな。昔はC言語なんて言語ってつくことから毛嫌いしてたのに。
ってことで
こぴぺ
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define pai 3.14159265
void main (void){
int i,j,g,k;
double a[9][9],b[9][9],S,B,e;
a[0][0]=1; a[0][1]=0; a[0][2]=0; a[0][3]=0; a[0][4]=0; a[0][5]=0; a[0][6]=0; a[0][7]=0; a[0][8]=0;
a[1][0]=0; a[1][1]=0; a[1][2]=1; a[1][3]=0; a[1][4]=0; a[1][5]=0; a[1][6]=0; a[1][7]=0; a[1][8]=0;
a[2][0]=0; a[2][1]=1; a[2][2]=0; a[2][3]=0; a[2][4]=0; a[2][5]=0; a[2][6]=0; a[2][7]=0; a[2][8]=0;
a[3][0]=0; a[3][1]=0; a[3][2]=0; a[3][3]=-1; a[3][4]=1; a[3][5]=0; a[3][6]=0; a[3][7]=0; a[3][8]=0;
a[4][0]=0; a[4][1]=0; a[4][2]=0; a[4][3]=1; a[4][4]=0; a[4][5]=1; a[4][6]=0; a[4][7]=0; a[4][8]=0;
a[5][0]=0; a[5][1]=0; a[5][2]=0; a[5][3]=0; a[5][4]=1; a[5][5]=-1; a[5][6]=0; a[5][7]=0; a[5][8]=0;
a[6][0]=0; a[6][1]=0; a[6][2]=0; a[6][3]=0; a[6][4]=0; a[6][5]=0; a[6][6]=0; a[6][7]=1; a[6][8]=0;
a[7][0]=0; a[7][1]=0; a[7][2]=0; a[7][3]=0; a[7][4]=0; a[7][5]=0; a[7][6]=1; a[7][7]=0; a[7][8]=0;
a[8][0]=0; a[8][1]=0; a[8][2]=0; a[8][3]=0; a[8][4]=0; a[8][5]=0; a[8][6]=0; a[8][7]=0; a[8][8]=1;
e=0.0002;
for(i=0;i<9;i++){
for(j=0;j<9;j++)
printf("%.3f ",a[i][j]);
printf("\n");}
printf("\n");
do{
B=0;
for(i=0;i<9;i++)
for(j=i+1;j<9;j++)
if(fabs(a[i][j])>B)
{g=i;k=j;B=fabs(a[i][j]);}
if(B>e)
{
S=atan(2*a[g][k]/(a[g][g]-a[k][k]));
b[g][g]=0.5*(a[g][g]+a[k][k])+0.5*(a[g][g]-a[k][k])*cos(S)+a[g][k]*sin(S);
b[k][k]=0.5*(a[g][g]+a[k][k])-0.5*(a[g][g]-a[k][k])*cos(S)-a[g][k]*sin(S);
b[g][k]=0;b[k][g]=0;
for(i=0;i<9;i++)
if(i!=g&&i!=k){
b[g][i]=a[g][i]*cos(S/2)+a[k][i]*sin(S/2);}
for(i=0;i<9;i++)
if(i!=k&&i!=g){
b[k][i]=a[k][i]*cos(S/2)-a[g][i]*sin(S/2);}
for(i=0;i<9;i++){
a[g][i]=b[g][i];
a[i][g]=b[g][i];
a[k][i]=b[k][i];
a[i][k]=b[k][i];
}
}
}while(B>e);
for(i=0;i<9;i++)
printf("%4.3f %4.3f %4.3f %4.3f %4.3f %4.3f %4.3f %4.3f %4.3f\n",a[i][0],a[i][1],a[i][2],a[i][3],a[i][4],a[i][5],a[i][6],a[i][7],a[i][8]);
}
上のa[0][0]~a[8][8]の値を変えれば好きな実対称行列を対角化出来ます。
よ~~~しこれを利用してスピン1のダイマー系の物理をやるぞ!!
PR
カレンダー
キーワードサーチ
コメント新着