Thomas(Tridia)

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

#include <stdio.h>

#include <stdlib.h>

#define nd 20

int n;

double l[nd],d[nd],r[nd],x[nd],b[nd];

void Tridia()

{


        int i;

        double factor;

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

        {

                factor=l[i]/d[i-1];

                d[i]=d[i]-factor*r[i-1];

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

        }

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

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

        {

                x[i]=(b[i]-r[i]*x[i+1])/d[i];

        }

}

int main() {

        int i;

        printf("방정식 수n:");

        scanf("%d",&n);

        printf("계수행렬l(i) d(i) r(i)를 입력하시오\n");

        printf("l(i) i=1,...,n:");

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

        printf("d(i) i=1,...,n:");

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

        printf("r(i) i=1,...,n:");

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

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

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

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

        Tridia();

                printf("해는 다음과 같다. \n");

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

        {

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

                printf("\n");

        }

}




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

Jacobi  (0) 2015.12.21
GaussN  (0) 2015.12.21
Least(최소 제곱법)  (0) 2015.12.21
LUCrout (LU분해,해 구하기, 역행렬 구하기)  (0) 2015.12.21
Newton Raphson Method  (0) 2015.12.21
Posted by 知彼知己百戰不殆
,

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define nd 20

double A[nd][nd],b[nd],L[nd][nd],U[nd][nd],b2[nd],x[nd],E[nd],xR[nd];

int n;

void LuCrout();

void LuCrout_Sol();

void Reverse();


void LUCrout() {

        int i,j,k;

        double sum;

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

                L[i][1]=A[i][1];

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

                U[1][j]=A[1][j]/L[1][1];

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

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

                        sum=0;

                        for(k=1;k<=j-1;k++) sum=sum+L[i][k]*U[k][j];

                        L[i][j]=A[i][j]-sum;

                }

                U[j][j]=1;

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

                        sum=0.0;

                        for(k=1;k<=j-1;k++) sum=sum+L[j][k]*U[k][i];

                        U[j][i]=(A[j][i]-sum)/L[j][j];

                }

        }

}//end of LuCrout


void LuCrout_Sol() {

        int i,j;

        double sum;

        printf("해를 입력해주세요:");

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

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

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

                sum=0;

                for(j=1;j<=i-1;j++)

                        sum=sum+L[i][j]*b2[j];

                b2[i]=(b[i]-sum)/L[i][i];

                printf("b^[%d]:%lf\n",i,b2[i]);

        }

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

                x[i]=b2[i];

        printf("\n");

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

                sum=0;

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

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

                        //printf("sum:%lf\n",sum);

                }

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

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

        }


}//end of LuCrout_Sol


void Reverse() {

        int i,j,a;

        double sum;

for(a=0;a<n;a++){

        printf("역행렬을 구합니다. 단위 행렬을 입력해주세요:");

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

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

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

        }


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

                sum=0;

                for(j=1;j<=i-1;j++)

                        sum=sum+L[i][j]*b2[j];

                b2[i]=(E[i]-sum)/L[i][i];

                printf("b^[%d]:%lf\n",i,b2[i]);

        }

        printf("\n");


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

                sum=0;

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

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

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

        }

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

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

}

}// end of Reverse


int main() {

        int i,j;

        double sum;

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

        scanf("%d",&n);

        printf("게수행렬A(i,j)을 입려가시오\n");

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

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

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

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

                }

        }

        LUCrout();

        printf("\n [L] \n");

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

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

                        printf("%f\t",L[i][j]);

                printf("\n");

        }

        printf("\n [U] \n");

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

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

                        printf("%f\t",U[i][j]);

                printf("\n");

        }


        LuCrout_Sol();

        //Reverse();


}//end of main


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

Jacobi  (0) 2015.12.21
GaussN  (0) 2015.12.21
Least(최소 제곱법)  (0) 2015.12.21
Thomas(Tridia)  (0) 2015.12.21
Newton Raphson Method  (0) 2015.12.21
Posted by 知彼知己百戰不殆
,

Newton Raphson Method

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

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define e 2.7182818284590452354

#define th 0.0001


double f(double num1) {

        double num2;

        num2=pow(num1,3)-num1-1.344;

        return num2;

} //definition of f(x)


double f2(double num1) {

        double num2;

        num2=3*pow(num1,2)-1;

        return num2;

} //differential of f(x)


int main() {

        double x0,x1,n1,n2;

        int i;

        printf("Input first number:");

        scanf("%lf",&x0);

for(i=0;i<=999;i++){

                x1=x0-f(x0)/f2(x0);

                printf("\nx1 value is %lf\n",x1);

                n1=f(x0);

                printf("f(x0) value is %lf\n",n1);

                n2=f2(x0);

                x0=x1;

                //printf("f2(x0) value is %lf\n",n2);

                if (fabs(n1) <= th){

                        printf("\n%lf is root\n",x0);

                        printf("x:%lf \t f(x):%lf\n",x0,n1);

                        break;

                }

                else if ((fabs(n2) <= th) && (i=999)){

                        printf("no root value\n");

                        printf("x:%lf \t f(x):%lf\n",x0,n1);

                }

        }

        printf("첫 x일 때 나오는 f(x)는 근이 아님\n x1에 해당하는 f(x)는 f(x2)임

\n x2에 해당하는 f(x)는 f(x3)~~~ 이런 식으로 됨\n");

} //end of main

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

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