Jacobi

언어/Coding 2015. 12. 21. 01:02

/*

        jacobi

        imax 반복횟수

        b[i] 상수행렬

        a[i][j] 계수행렬

        residual 잔차 잔여

*/


#include <stdio.h>

#include <math.h>

#define nd 20


double x[nd], x0[nd], a[nd][nd], b[nd];


int imax = 1000, n, iter;

double epsilon = 0.00001, resavg;


void jacobi();


int main() {

        int i, j;


        printf("방정식 수");

        scanf("%d", &n);

        printf("계수행렬 a(i,j) 을 입력하시오");

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

        {

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

                        printf("a(%d,j) ", i);

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

                }

        }

        printf("상수행렬 b[i]를 입력하시오 \n");

        printf("b[i] i=1,,,n=");

        for (i = 1; i <= n; i = i + 1) scanf("%lf", &b[i]);

        printf("가정값 x0[i] 입력하시오 \n");

 printf("x0[i] i=1,,,n=");

        for (i = 1; i <= n; i = i + 1) scanf("%lf", &x0[i]);


        printf("\n INPUT DATA 출력");

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

        {

                printf("\n");

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

                {

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

                }

                printf("%10.5f", b[i]);

        }

        printf("\n");

        jacobi();


        printf("\n 계산결과 출력");

        printf("\n iter = %d, 평균 residual = %f", iter, resavg);

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

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

        }

}


void jacobi() {

        double ahat[nd][nd], bhat[nd], res[nd];

        double sum, ressum;

        int i, j;

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

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

                        ahat[i][j] = a[i][j] / a[i][i];

                }

                bhat[i] = b[i] / a[i][i];

                ahat[i][i] = 0;

        }


        for (iter = 1; iter <= imax; ++iter) {

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

                        x[i] = bhat[i];

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

                                x[i] = x[i] - ahat[i][j] * x0[j];

                        }

                }

                ressum = 0;

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

                        sum = x[i] - bhat[i];

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

                                sum = sum + ahat[i][j] * x[j];

                        }

                        res[i] = fabs(sum);

                        ressum = ressum + res[i];

                }

                resavg = ressum / n;

                if (resavg < epsilon) {

                        goto END;

                }

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

                        x0[i] = x[i];

                }


        }

        printf("\n 수렴하지 않는다");

END:;

}


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

Lagrange  (0) 2015.12.22
Gauss Seidel  (0) 2015.12.21
GaussN  (0) 2015.12.21
Least(최소 제곱법)  (0) 2015.12.21
Thomas(Tridia)  (0) 2015.12.21
Posted by 知彼知己百戰不殆
,

GaussN

언어/Coding 2015. 12. 21. 01:00

#include <stdio.h>

#include <math.h>

#define nd 20

double x[nd], a[nd][nd], b[nd];

int n,i,j,k;

void eliminate();

void substitute();


void eliminate(){

        double factor;

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

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

                        factor=a[i][k]/a[k][k];

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

                                        a[i][j]=a[i][j]-factor*a[k][j];

                                }

                                b[i]=b[i]-factor*b[k];

                }

        }

}//end of eliminate


void substitute(){

        double sum;

        x[n]=b[n]/a[n][n];

                for(i=n-1;i>=1;i=i-1){

                        sum=0;

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

                                sum=sum+a[i][j]*x[j];

                        }

                        x[i]=(b[i]-sum)/a[i][i];

                }

}//end of substitute



int main() {

        printf("\n방정식 수 n=");

        scanf("%d", &n);

        printf("계수행렬 A(i,j)을 입력하시오\n");

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

        {

                printf("A(%d,j) j=1,..n=",i);

                for(j=1;j<=n;j=j+1) scanf("%lf",&a[i][j]);

        }

        printf("상수행렬 b(i)를 입력하시오\n");

                printf("b(i) i=1,,,n=");

        for(i=1;i<=n;i=i+1) scanf("%lf",&b[i]);

        printf("\n Input data 출력");

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

        {

                printf("\n");

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

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

                }

        printf("%10.5f",b[i]);

        }

        printf("\n");

        eliminate();

        substitute();

        printf("\n 계산결과 출력");

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

        {

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

        }

        printf("\n");

}// end of main


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

Gauss Seidel  (0) 2015.12.21
Jacobi  (0) 2015.12.21
Least(최소 제곱법)  (0) 2015.12.21
Thomas(Tridia)  (0) 2015.12.21
LUCrout (LU분해,해 구하기, 역행렬 구하기)  (0) 2015.12.21
Posted by 知彼知己百戰不殆
,

/* 여러개의 실험 데이터를 가장 잘 만족시키는 Y=a*x^b 구하는 코드 */


#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define e 2.718281

#define nd 20

double x[nd],y[nd],sumx,sumy,sumxy,sumx2;

int n;


void bang(double *a0, double *a1)

{

        int i;

        sumxy = 0;

        sumx = 0;

        sumx2 = 0;

        sumy = 0;

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

                sumxy=x[i]*y[i]+sumxy;

                sumx=x[i]+sumx;

                sumy=y[i]+sumy;

                sumx2=x[i]*x[i]+sumx2;

        }


        *a1=((n*sumxy)-(sumx*sumy))/((n*sumx2)-(sumx*sumx));

        *a0=(sumy/n)-(*a1*sumx)/n;

        printf("a1값:%lf\t a0값:%lf\n",*a1,*a0);


}//end of bang


int main()

{

        int i;

        double a0=0,a1=0,a=0,f=0,x1=0,x2=0;

        printf("데이터의 수:");         scanf("%d",&n);

        printf("X(i) 입력:");

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

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

        printf("Y(i) 입력:");

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

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

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

                x[i]=log(x[i]+1);

                y[i]=log(y[i]);

        }

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

                printf("바뀐 x[%d]:%lf\t y[%d]:%lf\n",i,x[i],i,y[i]);

        bang(&a0,&a1);

        printf("구하려는 x 값을 입력:");        scanf("%lf",&x1);

        a=pow(e,a0);

        f=a/pow((x1+1),-a1);

        printf("x가 %lf일때 구하려는 y값:%lf\n",x1,f);

        printf("구하려는 x2값을 입력:");        scanf("%lf",&x2);

        f=a/pow((x2+1),-a1);

        printf("x가 %lf일때 구하려는 y값:%lf\n",x2,f);


}//end of main

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

Jacobi  (0) 2015.12.21
GaussN  (0) 2015.12.21
Thomas(Tridia)  (0) 2015.12.21
LUCrout (LU분해,해 구하기, 역행렬 구하기)  (0) 2015.12.21
Newton Raphson Method  (0) 2015.12.21
Posted by 知彼知己百戰不殆
,