c·c++/c 프로그래밍

Cramer공식을 이용한 연립방정식풀기

바로이순간 2013. 9. 13. 03:30

Cramer 공식을 이용한 연립 방정식 풀기 

5x+2y+2z=6

x+5y+z=11

2x-1y+6z=4


#include <stdio.h>

int main() {

    double a[3][3]={{5, 2, 2},{1, 5, 1},{2, -1, 6}};

    double inv[3][3], b[3]={6,11,4}, x[3], det, v;

    int i, j, k;


    det=a[0][0]*(a[1][1]*a[2][2]-a[2][1]*a[1][2])

       -a[0][1]*(a[1][0]*a[2][2]-a[1][2]*a[2][0])

       +a[0][2]*(a[1][0]*a[2][1]-a[1][1]*a[2][0]); 

    printf("Determinant = %g \n", det);

    inv[0][0]=(a[1][1]*a[2][2]-a[2][1]*a[1][2])/det;

    inv[1][0]=-(a[1][0]*a[2][2]-a[1][2]*a[2][0])/det;

    inv[2][0]=(a[1][0]*a[2][1]-a[2][0]*a[1][1])/det;

    inv[0][1]=-(a[0][1]*a[2][2]-a[0][2]*a[2][1])/det;

    inv[1][1]=(a[0][0]*a[2][2]-a[0][2]*a[2][0])/det;

    inv[2][1]=-(a[0][0]*a[2][1]-a[2][0]*a[0][1])/det;

    inv[0][2]=(a[0][1]*a[1][2]-a[0][2]*a[1][1])/det;

    inv[1][2]=-(a[0][0]*a[1][2]-a[1][0]*a[0][2])/det;

    inv[2][2]=(a[0][0]*a[1][1]-a[1][0]*a[0][1])/det;


    printf("\n a is : \n");

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

        for(j=0;j<3;j+=1) {

            printf("%12f", a[i][j]);

        }

        printf("\n");

    }


    printf("\n a_inverse is : \n");

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

        for(j=0;j<3;j+=1) {

            printf("%12f", inv[i][j]);

        }

        printf("\n");

    }


    printf("\n a x a_inverse is : \n");

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

        for(j=0;j<3;j+=1) {

            v=0;

            for(k=0;k<3;k+=1) {

                v+=a[i][k]*inv[k][j];

            }

            printf("%12f", v);

        }

        printf("\n");

    }

    

    printf("\n x  is : \n");

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

        x[i]=0;

        for(j=0;j<3;j+=1) {

            x[i]+=inv[i][j]*b[j];

        }

        printf("x[%d]=%g\n", i, x[i]);

    }


    return 0;

}