'C언어를 이용한 전산물리학' 책을 보고 수치해석적 미분 중 2점 공식(2-point formula) 예제소스를 따라 작성하고 cygwin(윈도우에서 작동하는 리눅스 에뮬레이터)의 gcc로 컴파일, 실행해 보다.

gcc diff2point.c -o diff2pE && ./diff2pE
diff2point.c를 컴파일하고 바로 실행하는 cygwin상의 gcc 명령

제대로 작동되어 diff_2point.txt란 파일이 생성되고 999줄의 실행 결과가 담겼다...만 뭔 내용인지 잘 모르겠다. 테일러 전개를 이용해 미분의 근사치 값을 얻어내는 방식인듯 하나 공식을 제대로 이해하진 못했다. 거의 타이핑 연습만 한 격. --;

5점 공식 역시 같은 방식으로 작성, 실행 성공.

5점 공식의 함수를 2*(x)*(x)+(x)+35로 바꾸고(즉, 2X^2 + X+ 35) MAX_STEP을 200에서 100으로, 30, 10으로 변경시켜 보니 과연 빠르게 수렴한다는걸 어느정도 알듯하다. 원래 미분값은 1일 때 5가되는데(4X+1) 10단계에서도 4.399986의 값이 나온다. 600단계에선 4.989624 값이 나온다.
2점 공식의 경우 1000단계에서 4.993439, 100단계에서 4.940033, 10단계에서 4.399986이 나온다. 5점 공식과 똑같다. 함수가 단순해서 그런걸까?

14/10/22 수

// 2점 공식 미분으로 계산, 계산값들을 텍스트 파일에 저장하는 프로그램.
#include <stdio.h>

// 구간 [0,1]에서 함수 f(x)=x^2의 미분을 MAX_STEP 개수 만큼의 
// 그물코 위치(mesh points)에서 미분을 계산 
#define MAX_STEP 1000
#define dx (1.0/(float)MAX_STEP)
#define f(x) ((x)*(x)) //미분할 함수는 x^2

main(void){
     FILE *fpt; //결과 출력용 파일 포인터
     int i;
     float x[MAX_STEP]; //x좌표값
     float fx[MAX_STEP]; //f(x)값
     float dfx[MAX_STEP]; //df(x)/dx값

     //결과 출력할 파일 열기
     fpt = fopen("diff_2point.txt","w");

     //f(x) 초기화
     for(i=0; i < MAX_STEP; i++){
          x[i] = dx * i;
          fx[i] = f(x[i]);
     }

     //2-point formula에의해 f(x) 미분
     for (i = 0; i < MAX_STEP-1; ++i){
          dfx[i] = (fx[i+1]-fx[i]) / dx;
          fprintf(fpt, "%f %f %f \n", x[i], fx[i], dfx[i]);
     }

     fclose(fpt); //파일 닫기
}

결과 중 마지막 10줄=========================

0.988000 0.976144 1.977086
0.989000 0.978121 1.978993
0.990000 0.980100 1.980960
0.991000 0.982081 1.982987
0.992000 0.984064 1.984954
0.993000 0.986049 1.987100
0.994000 0.988036 1.988947
0.995000 0.990025 1.990974
0.996000 0.992016 1.993001
0.997000 0.994009 1.995087
0.998000 0.996004 1.996994

// 5점 공식 미분으로 계산, 계산값들을 텍스트 파일에 저장하는 프로그램.
#include

// 구간 [0,1]에서 함수 f(x)=x^2의 미분을 MAX_STEP 개수 만큼의 
// 그물코 위치(mesh points)에서 미분을 계산 
#define MAX_STEP 200
#define dx (1.0/(float)MAX_STEP)
#define f(x) ((x)*(x)) //미분할 함수는 x^2

main(void){
     FILE *fpt; //결과 출력용 파일 포인터
     int i;
     float x[MAX_STEP]; //x좌표값
     float fx[MAX_STEP]; //f(x)값
     float dfx[MAX_STEP]; //df(x)/dx값

     //결과 출력할 파일 열기
     fpt = fopen("diff_5point.txt","w");

     //f(x) 초기화
     for(i=0; i < MAX_STEP; i++){
          x[i] = dx * i;
          fx[i] = f(x[i]);
     }

     //2-point formula에의해 dfx[0] 계산
     dfx[0]=(fx[1]-fx[0])/dx;
     //3-point formula에의해 dfx[1] 계산
     dfx[1]=(fx[2]-fx[0])/(2.0 * dx);
     //5-point formula에의해 f(x)를 미분
     for (i = 2; i < MAX_STEP-2; i+=1){
          dfx[i] = (8*(fx[i+1]-fx[i-1])-(fx[i+2]-fx[i-2])) / (12.0*dx);
     }
     //3-point formula에의해 dfx[MAX_STEP-2] 계산
     dfx[MAX_STEP-2] = (fx[MAX_STEP-1]-fx[MAX_STEP-3]) / (2.0*dx);
     //2-point formula에의해 dfx[MAX_STEP-1] 계산
     dfx[MAX_STEP-1] = (fx[MAX_STEP-1]-fx[MAX_STEP-2]) / dx;
     //f(x) 미분값 파일에 출력
     for (i = 0; i < MAX_STEP; i+=1){
          fprintf(fpt, "%f %f %f \n", x[i], fx[i], dfx[i]);
     }

     fclose(fpt);
}

결과 중 마지막 10줄=========================

0.945000 0.893025 1.889998
0.950000 0.902500 1.899999
0.955000 0.912025 1.910002
0.960000 0.921600 1.919995
0.965000 0.931225 1.930004
0.970000 0.940900 1.940015
0.975000 0.950625 1.950001
0.980000 0.960400 1.959996
0.985000 0.970225 1.970000
0.990000 0.980100 1.979995
0.995000 0.990025 1.984990