C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[930] [요청자료] 주어진 점들을 지나는 다항식 보간법
Nibble [gameover] 9289 읽음    2009-11-11 12:00
bool __fastcall interpol(double* y2, double* x2, int n2, const double* y1, const double* x1, int n1){
    double* coeff = (double*)malloc(sizeof(double) * n1);
    if (coeff){
        int i, j, k;
        double* table = (double*)malloc(sizeof(double) * n1);
        if (table){
            memcpy(table, y1, sizeof(double) * n1);
            coeff[0] = table[0];
            for(k = 1; k < n1; k++){
                for(i = 0; i < n1 - k; i++) table[i] = (table[i + 1] - table[i]) / (x1[i + k] - x1[i]);
                coeff[k] = table[0];
            }
            free(table);
            for(k = 0; k < n2; k++){
                y2[k] = coeff[0];
                for(j = 1; j < n1; j++){
                    double term = coeff[j];
                    for(int i = 0; i < j; i++) term *= (x2[k] - x1[i]);
                    y2[k] += term;
                }
            }
            free(coeff);
            return true;
        }
        free(coeff);
    }
    return false;
}


너무나 유명한 뉴튼표현법을 이용한 다항식 보간 예제입니다.
파라메터로 주어질 점들을 신뢰할 수 있거나, 신뢰할 수 밖에 없을 때만 사용될 수 있습니다.
가령, 샘플 값이 noisy하지만 많은 샘플 값들을 얻을 수 없을때 처럼 말이죠.

noise 특성은 샘플수의 제곱근 분의 1 만큼 감소하게 됩니다. 즉, 4개의 샘플을 얻을 수 있다면
노이즈는 1/2 로 줄어들게 되죠. 무슨 말인고 하니, 예를들어 삼각대로 고정시킨 카메라를 통해
정적인 영상을 얻어들일 때, 실제 영상으로 부터 CCD 카메라 센서로 들어온 노이즈 대역폭이 +- 9
정도였다면, 연속스틸샷을 9장 얻어 각 점들의 9장 평균으로 각 점들을 보상하면 노이즈 대역폭은
1/3 로 줄게 되어 +- 3이 된다는 것이죠.

만약 많은 샘플을 얻을 수 있다면, 다항식 보간법은 유효하지 않습니다.
6차 이상의 다항식은 신뢰할 수 없고,
다항식 특성상 중심으로 부터 가장자리로 갈 수록 펄스가 커지는 특성을 가질 수 있거든요.
고로, 샘플수가 많은 경우엔, 최소제곱법이나 회귀추정을 이용하는 쪽이 바람직하다고 봅니다.

각설하고, 위 함수는 target, source 의 파라메터 순서를 따릅니다.
3점으로 부터 1000개의 보간값을 얻고자 한다면,
이런식으로 호출하시면 됩니다.

double x1[3] = {100, 300, 500};
double y1[3] = {100, 500, 600}; // 주어진 3개의 점들

double x2[1000];
double y2[1000]; // 보간할 점들
for(int x = 0; x < 1000; x++) x2[x] = x; // 보간할 점들의 x위치를 지정

interpol(y2, x2, 1000, y1, x1, 3);
용맨소녀 [doyongid]   2009-11-11 15:05 X
여러가지 자료들을 올려주셔서 감사합니다. 테스트 해볼께요..^^
Nibble [gameover]   2009-11-11 15:24 X
어차피 할당이 안되는 경우는 드물것이라 생각되지만, 메모리 누수가 우려되는 부분이 있어서 수정해 두었습니다.
3점을 이용해 근사하는 대개의 경우 두 번째로 올려드린 파라볼릭을 잘 이용하시는게 가장 효과적일 것 같습니다.

+ -

관련 글 리스트
930 [요청자료] 주어진 점들을 지나는 다항식 보간법 Nibble 9289 2009/11/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.