'Everything'에 해당되는 글 228건

  1. 2015.12.22 Lagrange
  2. 2015.12.21 Gauss Seidel
  3. 2015.12.21 Jacobi
  4. 2015.12.21 GaussN
  5. 2015.12.21 Least(최소 제곱법)
  6. 2015.12.21 Thomas(Tridia)
  7. 2015.12.21 LUCrout (LU분해,해 구하기, 역행렬 구하기)
  8. 2015.12.21 Newton Raphson Method
  9. 2015.12.19 출력 버퍼를 비우는 fflush 함수
  10. 2015.12.19 문자열 단위 입출력 함수 (puts, gets)

Lagrange

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

#include <stdio.h>

#include <math.h>

#define nd 5

double xd[nd]={0,1,2,4,5};

double yd[nd]={0,16,48,88,0};

double Lagrange(double x);


int main() {

        double x=3.0,y;

        y=Lagrange(x);

        printf("\n x=%f : f(x)=%f\n",x,y);

 }

double Lagrange(double x)

{

        double p, sum;

        int n,i,j;

        n=nd-1;

        sum=0;

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

                p=1;

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

                        if(i!=j)

                        p=p*(x-xd[j])/(xd[i]-xd[j]);

                        printf("p값:%f\n",p);

                }

                sum=sum+p*yd[i];

        }

        return(sum);

}



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

거듭제곱  (0) 2015.12.22
역 거듭제곱  (0) 2015.12.22
Gauss Seidel  (0) 2015.12.21
Jacobi  (0) 2015.12.21
GaussN  (0) 2015.12.21
Posted by 知彼知己百戰不殆
,

Gauss Seidel

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

#include <stdio.h>

#include <math.h>

/* 대각 지배행렬이어야 성립하므로 방정식이 대각 지배 행렬에 안 맞을 경우 바꿔줘야 함  */

#define nd 20


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

int imax = 1000, n, iter;

double epsilon = 0.00001, resavg;

void Jacobi();


int main(){

        int i, j;


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

        scanf_s("%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(" 가정값 x0[i] 입력하시오 \n");

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

        for (i=1;i<=n;i=i+1)scanf("%lf", &x[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 = i + 1){

                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] * x[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;

                }

        }

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

        END:;

}



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

역 거듭제곱  (0) 2015.12.22
Lagrange  (0) 2015.12.22
Jacobi  (0) 2015.12.21
GaussN  (0) 2015.12.21
Least(최소 제곱법)  (0) 2015.12.21
Posted by 知彼知己百戰不殆
,

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 知彼知己百戰不殆
,

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 知彼知己百戰不殆
,

출력 버퍼의 비워짐 : 출력버퍼에 저장된 데이터가 버퍼를 떠나서 목적지로 이동됨

출력 버퍼가 비워지는 시기는 버퍼가 꽉 찼을 때 비워지는 버퍼도 있고, 하나의 문장이 완전히 입력되었을 때마다 비워지는 버퍼도 있다.

fflush(stdout);  // 표준 출력버퍼를 비우라는 명령

1
2
3
#include <stdio.h>
 
int fflush(FILE * stream);
cs

 

입력 버퍼의 비워짐 : 데이터의 소멸을 의미

가끔 입력 버퍼에 남아있는 불필요한 데이터의 소멸을 위해서 입력버퍼를 비워야 하는 경우가 종종 있다.

Posted by 知彼知己百戰不殆
,

scanf 함수는 공백이 포함된 형태의 문자열을 입력 받는데 제한이 있다. 그러나 puts, fputs는 제한이 없다

 

문자열 출력 함수 : puts, fputs

puts : 출력의 대상이 stdout으로 고정, 이 함수가 호출되면 문자열 출력 후 자동으로 개행(\n)이 이루어짐

fputs : 두 번째 인자를 통해서 출력의 대상을 결정 가능, 문자열 출력 후 자동으로 개행이 이루어지지 않음

1
2
3
4
#include <stdio.h>
 
int puts(const char * s);
int fputs(const char * s, FILE * stream);
cs

→ 성공 시 음수가 아닌 값을, 실패 시 EOF 반환

 

문자열 입력 함수 : gets, fgets

gets : stdin으로 부터 문자열을 입력 받음

fgets : 문자열을 입력 받을 곳을 설정 가능하며, size도 설정할 수 있다, 이 함수는 \n을 만날 때까지 문자열을 읽어 들이는데, \n을 제외시키거나 버리지 않고 문자열의 일부로 받아들인다. (우리가 입력 한 엔터 키의 정보까지도 문자열의 일부로 저장됨)

1
2
3
4
#include <stdio.h>
 
char * gets(char * s);
char * fgets(char * s, int n, FILE * stream);
cs

ex)

1
2
3
4
5
6
7
#include <stdio.h>
 
int main ()
{
   char str[7];
   gets(str);
}
cs

 

1
2
3
4
5
6
7
#include <stdio.h>
 
int main ()
{
   char str[7];
   fgets(str, sizeof(str), stdin);
}
cs

↑ 여기서 str배열 사이즈인 7값이 설정 돼 있지만 "123456789"의 문자열을 받게 될 경우 str배열에는 "123456"만 값이 저장된다. 이유는 문자열의 끝에 자동으로 널 문자가 추가되므로.

 

 

 

 

 

Posted by 知彼知己百戰不殆
,