'Everything'에 해당되는 글 224건

  1. 2015.12.22 Romberg법
  2. 2015.12.22 할선법
  3. 2015.12.22 가상 위치법
  4. 2015.12.22 simpson 1/3 공식
  5. 2015.12.22 거듭제곱
  6. 2015.12.22 역 거듭제곱
  7. 2015.12.22 Lagrange
  8. 2015.12.21 Gauss Seidel
  9. 2015.12.21 Jacobi
  10. 2015.12.21 GaussN

Romberg법

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

#include <stdio.h>

#include <stdlib.h>

#define _USE_MATH_DEFINES

#include <math.h>

#define f(x) log10(1+x)*sin(10*x) //함수 나중에 바꿔줘야 함

double T[20],R[20][20],h[20],a,b;

int n;


int main() {

        double sum;

        int i,k,j;

        printf("구간 값 a(적분 밑에 있는 값):");        scanf("%lf",&a);

        //printf("구간 값 b:"); //scanf("%lf",&b);

        b=2*M_PI;

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

        printf("구하고자 하는 R(n,n)에서의 n : ");      scanf("%d",&n);


        h[1]=b-a;

        printf("h[1]:%lf\n",h[1]);

        printf("f(b):%lf\n",f(b));

        printf("log(1+2PI):%lf\n",log(1+b));

        T[1]=h[1]/2*(f(a)+f(b));

        printf("T[1]:%lf\n",T[1]);

        R[1][1]=T[1];

        printf("R[1][1]:%lf\n",R[1][1]);

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

        {

                h[i]=h[i-1]*0.5;

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

                sum=0;

                for(k=1;k<=pow(2,i-2);k++)

                {

                        sum=sum+f(a+(2*k-1)*h[i]);

                }

                T[i]=0.5*T[i-1]+h[i]*sum;

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

R[i][1]=T[i];

                //printf("R[%d][1]:%lf\n",i,R[i][1]);

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

                {

                        R[i][j]=((pow(4,j-1)*R[i][j-1])-R[i-1][j-1])/(pow(4,j-1)-1);

                        //printf("first:%lf\n",pow(4,j-1)*R[i][j-1]);

                        //printf("second:%lf\n",R[i-1][j-1]);

                        //printf("pow(4,j-1):%lf\n",pow(4,j-1)-1);

                        //printf("R[%d][%d]:%lf\n",i,j,R[i][j]);

                }

                //printf("h[3]:%lf\t R[3][1]:%lf\n",h[3],R[3][1]);

        }

        printf("R11:%lf\n",R[1][1]);

        printf("R31:%lf\t R21:%lf\n",R[3][1],R[2][1]);

        printf("R32:%lf \t R22:%lf\n",R[3][2],R[2][2]);

        printf("n값에서의 R[n][n]:%lf\n",R[n][n]);

}



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

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

할선법

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

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define e 2.71

double f(double num1) {

 double num2;

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

 return num2;

} //definition of f(x)


int main() {

 double x0, x1,xc,n1,n2,n3;

 printf("x0값 입력:");

 scanf("%lf", &x0);

 printf("\n\n x1값 입력:");

 scanf("%lf", &x1);


 for (int i = 0; i < 6; i++) {

  n1 = f(x1)*(x0 - x1);

  printf("n1값:%lf\n", n1);

  n2 = f(x0) - f(x1);

  printf("n2값:%lf\n", n2);

  n3 = n1 / n2;

  xc = x1 - n3;

  printf("\nXc의 값은: %lf\n", xc);

  printf("f(Xc)의 값은: %lf\n",f(xc));

  x0 = x1;

  //printf("Xc의 값:%lf", xc);

  x1 = xc;

 }

}



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

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

가상 위치법

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

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

#define e 2.71

double f(double num1) {

 double num2;

 num2=pow(e, -num1) - num1;

 return num2;

} //definition of f(x)

int main() {

 double a, b, c,n1,n2,n3;

 for (;;) {

  printf("\n\n a값 입력:");

  scanf("%lf", &a);

  printf("\n b값 입력:");

  scanf("%lf", &b);

  n1 = f(b)*(a - b);

  printf("n1값:%lf\n",n1);

  n2 = f(a) - f(b);

  printf("n2값:%lf\n", n2);

  n3 = n1 / n2;

  printf("n3값:%lf\n", n3);

  c = b - n3;

  printf("\n c값은:%lf", c);

 }

}

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

Romberg법  (0) 2015.12.22
할선법  (0) 2015.12.22
simpson 1/3 공식  (0) 2015.12.22
거듭제곱  (0) 2015.12.22
역 거듭제곱  (0) 2015.12.22
Posted by 知彼知己百戰不殆
,

simpson 1/3 공식

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

#include <stdio.h>

#include <math.h>

#include <string.h>

float f(float x)

{

    return 4*pow(x,3)-6*pow(x,2)+4;   // 이 함수 부분을 바꿔줘야 함

}

int main()

{

    int i,n;

    float x0,xn,h,y[20],so,se,ans,x[20];

    printf("\n Enter values of x0,xn,h: ");

    scanf("%f%f%f",&x0,&xn,&h);

    n=(xn-x0)/h;

    if(n%2==1)

    {

        n=n+1;

    }

    h=(xn-x0)/n;

    printf("\n Refined value of n and h are:%d %f\n",n,h);

    printf("\n Y values: \n");

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

    {

        x[i]=x0+i*h;

        y[i]=f(x[i]);

        printf("\n %f\n",y[i]);

    }

    so=0;

    se=0;

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

    {

        if(i%2==1)

        {

            so=so+y[i];

        }

        else

        {

            se=se+y[i];

        }


    }

    ans=h/3*(y[0]+y[n]+4*so+2*se);

    printf("\n Final integration is %f\n",ans);


}



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

할선법  (0) 2015.12.22
가상 위치법  (0) 2015.12.22
거듭제곱  (0) 2015.12.22
역 거듭제곱  (0) 2015.12.22
Lagrange  (0) 2015.12.22
Posted by 知彼知己百戰不殆
,

거듭제곱

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

역 거듭제곱

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

/*LU분해 후 역행렬을 구하고 난뒤 최대 고유값을 구한다*/

#include <stdio.h>

#include <stdlib.h>

#include <math.h>

double A[10][10],x0[10],sum[10],xR[10],B[10][10],c[10][10],L[10][10],U[10][10],b2[10],E[10],x[10],B[10][10];

int n;

void LUCrout();

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 Reverse() {

        int i,j,a;

        double sum;

        printf("역행렬을 구합니다\n");

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

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

        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("\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]);

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

                B[i][a]=x[i];

}

}// end of Reverse


int main(){


        int i,j,k,repeat,v;

        float ramda,temp,temp2,x1,deter;

        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]);

                }

        }

        LUCrout();

        Reverse();

        printf("역행렬(B): \n");

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

        {

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

                {

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

                }

                printf("\n");

        }

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

        {

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

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

        }

        v=1;

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

        {

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

                {

                        sum[j]=0;

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

                        {


sum[j]=sum[j]+B[j][k]*x0[k]; // Y = sum, A역행렬=B

                        }

                        //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 Lamda2:%f\t Lamda:%f\t x(1):%f\t x(2):%f\t x(3):%f\n",v,ramda,1/ramda,x0[1],x0[2],x0[3]);

                v++;

        }//end of repeat

}//end of main



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

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

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