거듭제곱

언어/Coding 2015. 12. 22. 02:48

/* 거듭제곱법 알고리즘

   행렬의 최대 고유값과 그 때의 고유벡터를 거듭제곱으로 구할 때 사용 */


#include <stdio.h>

#include <stdlib.h>

#include <math.h>

double A[10][10],x0[10],sum[10],xR[10];

/* void trace(){

        int i;

        for(i=1;i<=3;i++)

                xR[i]=x0[i];

} */


int main()

{

        int i,j,n,k,repeat,v;

        float ramda,temp,temp2,x1;

        printf("몇 행렬: ");

        scanf("%d",&n);

        printf("반복 횟수 입력:");

        scanf("%d",&repeat);

        printf("기본 행렬을 입력해 주세요:\n");

        for(i=1;i<=n;i++) //행 입력

        {

                for(j=1;j<=n;j++) //열 입력

                {

                        printf("A[%d][%d]:",i,j);

                        scanf("%lf",&A[i][j]);

                }

        }

//      printf("A[2][1]: %f\n",A[2][1]);  //단순 값 확인용도

        for(i=1;i<=n;i++)

        {

                printf("초기 x(0)을 입력해 주세요: ");

                scanf("%lf",&x0[i]);

        }

v=1;

        for(i=1;i<=repeat;i++) //수렴기준 대신에 반복 횟수로 카운트

        {

                //A*x(0)을 계산

                for(j=1;j<=n;j++)

                {

                        sum[j]=0;

                        for(k=1;k<=n;k++)

                        {

                                sum[j]=sum[j]+A[j][k]*x0[k]; // Y = sum

                        }

                        //printf("Y값 계산:%f\n",sum[j]);

                }

                temp = 0;

                temp2 = 0;

                for(j=1;j<=n;j++)

                {

                        temp=x0[j]*sum[j]+temp; // temp는 lamda구하기 위한 임시 변수

                        //printf("x0[%d]=%f, temp:%f\t",j,x0[j], temp);

                        temp2=x0[j]*x0[j]+temp2;

                        //printf("temp2:%f\n",temp2);

                        ramda=temp/temp2;

                }

                //printf("Lamda:%f\n",ramda);

                x1=0;

                for(j=1;j<=n;j++)

                        x1=pow(sum[j],2)+x1;

                x1=sqrt(x1);

                //printf("x(1):%f\n",x1);

                for(j=1;j<=n;j++)

                        x0[j]=sum[j]/x1;

                printf("반복횟수:%d\t Lamda:%f\t x(1):%f\t x(2):%f\t x(3):%f\n",v,ramda,x0[1],x0[2],x0[3]);

v++;

}//end of repeat

}//end of main



'언어 > Coding' 카테고리의 다른 글

가상 위치법  (0) 2015.12.22
simpson 1/3 공식  (0) 2015.12.22
역 거듭제곱  (0) 2015.12.22
Lagrange  (0) 2015.12.22
Gauss Seidel  (0) 2015.12.21
Posted by 知彼知己百戰不殆
,