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

C++빌더 Q&A
C++Builder Programming Q&A
[46988] Re:Re:Re:Re: 수정-라그랑쥐 보간법
장성호 [nasilso] 3423 읽음    2006-11-06 16:16
먼저 충분히 검증되지 않는 방법이므로 신뢰성에 대해 책임지지 않습니다.

별거 아닌데 이렇게 쓰려니 민망하기도 합니다.


[수정-라그랑쥐보간법]
이 방법의 목적은 첫번째 데이타 주변과 마지막 데이타 주변에 진동이 크게 발생하는것을 막기 위한것입니다.
원리는 기본적으로 라그랑쥐보간법하되 
먼저 선형보간법을 적용하여  데이타를  몇개 추가한 후에 라그랑쥐보간법을 적용하는 방법입니다.

데이타가 X,Y에 대한 데이타가 (X[0],Y[0])  ~~  (X[N],Y[N]) 까지 N+1개 있다고 가정할경우
(X[0],Y[0]) 주변과 (X[N],Y[N]) 주변에
선형보간법을 적용하여 몇개(2~9개)의  데이타를 추가합니다.

방법은 간단합니다.
(X[0],Y[0]) 와  (X[1],Y[1]) 사이( Xk<X[0] && Xk<X[1] ) 에 두점을 지나는 직선(선형보간법)에서 데이타를 몇개를 추가합니다.(Insert)

마찬가지로 끝점주변에서도
(X[N-1],Y[N-1]) 와  (X[N],Y[N]) 사이( Xk<X[N-1] && Xk<X[N] ) 에 두점을 지나는 직선(선형보간법)에서 데이타를 몇개를 추가합니다.(Insert)


데이타를 추가(Insert)하기위해서 기존의 데이타를 뒤로 미는것은 당연하구요


그런다음 라그랑쥐보간법을 적용하여 미지의 Xn값에 대한 Yn값을 찾아냅니다.

double fX[100],fY[100];// 입력데이타 저장 변수
int iPtCnt; //입력한 데이타 갯수
//------------------------------------------------
void InputData()
{
     //데이타를 입력하는 부붑입니다.
    //... 알아서 코딩하세요
    //아래는 그냥 샘플 데이타 입니다.
  for(int i=0;i<13;i++)
  {
     fX[i]=i*10;
     fY[i]=100+(i*i*i*i)/(1+i+i);
  }
  iPtCnt=13;
  
}
//------------------------------------------------
void ResetData()
{

    //조건 1. k=1 ~ k=n 까지 X[k-1]< X[k] 의 조건을 만족해야 한다.
    //        다시 말해 X값은  동일한 값이 없어야 하면 점점 커져야 한다.


    // 맨 첫번째 데이타와 두번째 Data의 사이에 선형보간법으로 2개의 Data를 첫번재 Data에 가까운 쪽으로 넣는다.....
    // 그러기 위해 0번째 Data와
    double fXUnit=(fX[1]-fX[0])/10.0;
    double fXn,fYn;
    //iPtCnt -- 데이타 갯수
    for(int i=(iPtCnt-1);i>0;i--)   //0 번지에 data를 제외한 나머지 데이타를 2칸씩 뒤로 민다.
    {
        fX[i+2]=fX[i];
        fY[i+2]=fY[i];
    }

    iPtCnt+=2;
    //----------------------------------
    fXn=fXUnit;
    fX[1]=fXn;
    fY[1]=((fY[3] - fY[0])/(fX[3]-fX[0])) * fXn + fY[0] - ((fY[3] - fY[0])/(fX[3]-fX[0])) * fX[0] ; //   (X[0],Y[0]) 와 (X[3],[Y[3])두점을 지나는 직선 f(x)함수에 X값으로 fXn을 대입
    //----------------------------------
    fXn=fXUnit*2;
    fX[2]=fXn;
    fY[2]=((fY[3] - fY[0])/(fX[3]-fX[0])) * fXn + fY[0] - ((fY[3] - fY[0])/(fX[3]-fX[0])) * fX[0] ; //   (X[0],Y[0]) 와 (X[3],[Y[3])두점을 지나는 직선 f(x)함수에 X값으로 fXn을 대입

    //----------------------------------
    //맨마지막  data를  뒤로 2칸 민다.
    fX[iPtCnt+1]=fX[iPtCnt-1];
    fY[iPtCnt+1]=fY[iPtCnt-1];

    fXn=fX[iPtCnt+1]-fXUnit*2;
    fX[iPtCnt-1]=fXn;
    fY[iPtCnt-1]=((fY[iPtCnt+1] - fY[iPtCnt-2])/(fX[iPtCnt+1]-fX[iPtCnt-2])) * fXn + fY[iPtCnt-2] - ((fY[iPtCnt+1] - fY[iPtCnt-2])/(fX[iPtCnt+1]-fX[iPtCnt-2])) * fX[iPtCnt-2] ;
    //----------------------------------
    fXn=fX[iPtCnt+1]-fXUnit;
    fX[iPtCnt]=fXn;
    fY[iPtCnt]=((fY[iPtCnt+1] - fY[iPtCnt-2])/(fX[iPtCnt+1]-fX[iPtCnt-2])) * fXn + fY[iPtCnt-2] - ((fY[iPtCnt+1] - fY[iPtCnt-2])/(fX[iPtCnt+1]-fX[iPtCnt-2])) * fX[iPtCnt-2] ;;
    //----------------------------------
    iPtCnt+=2;
}
//-------------------------------------------------------------------------------------------
double __fastcall lagrange(double x[],double y[],int n,double t)
{
    int i,j;
    double s,p;

    s = 0.0;
    for(i=0; i<n; i++)
    {
      p=y[i];
      for(j=0;j<n;j++)
      {
           if(i != j)
           {
                p=p*(t-x[j])/(x[i]-x[j]);
           }
      }
      s=s+p;
    }
    return s;
}

//-------------------------------------------------------------------------------------------
void __fastcall TForm1::BtnCalcClick(TObject *Sender)
{
    InputData();
    ResetData();
    double fXn=StrToFloat(Edit1->Text);
    double fYn=lagrange(X,Y,iPtCnt,fXn);   
}


사랑니 님이 쓰신 글 :
: 장성호님 먼저 라그랑쥐로 문제시 되는걸 제가 해도 마찬가지로 나오더군요
: tn
: 그래서 한동안 뉴턴 보간법으로도 해봐도 마찬가지였는데요
:
: 그래서 답변을 못했다는...ㅎㅎ
:
: 편법으로 하신 방법을 구체적으로 알고싶은데요
:
: 괜찬으시면 메일 부탁드립니다 ^^
:
: 그럼
:
: k_mani@hanmail.net
:
:
: 장성호 님이 쓰신 글 :
: : 먼저 감사합니다.
: :
: : 자료를 찾아보니 "N차의 다항식에는 극대점과 극소점이  N-1개 존재하고, 점들을 모두 지난다는 조건을 만족시킬 때 그래프에 진동이 발생하게 된다" 라는 문구를 발견했습니다.
: :
: : 라그랑쥐 뿐만 아니라 뉴턴보간법으로 해도 마찬가지로 진동이 발생했구요
: :
: : 3차 스플라인 보간법으로 하니까.. 진동이 크게 발생하지 않는데..
: :
: : 제 코딩이 잘못했는지 이상하게 모든 점에서 미분가능의 조건을 만족하지 못하였습니다.
: :
: : 그래서 편법으로...
: : 데이타를  시작점  X0 , X1사이와  끝점 Xn-1 , Xn 사이에 1차 선형보간법으로 데이타를 추정하여
: : 2~3개씩 추가하였습니다.
: : 그런후에 라그랑쥐 보건법을 적용하니 진동이 거의 발생하지 않았습니다.
: :
: : ...
: : ...
: :
: : 그리고 최소자승법은 ... 모든점을 지나는 조건을 만족하지는 않는걸로  알고있습니다.
: :
: :
: : 보간식 님이 쓰신 글
: : : 제가 해 봐도 그런네요... Lagrange ...
: : : 아마도 데이터 개수가 많아서 그런것 같습니다.... 차수가 너무 커져서 그런가....?????
: : : 하여튼 원인이 궁금하네요.
: : :
: : : 그럼 최소자승법을 사용해 보세요...아마 바로 구해질겁니다...(1차식만 적용해도)
: : : 소스는 인터넷에 검색하면 많이 나올겁니다...
: : :
: : :
: : : 장성호 님이 쓰신 글 :
: : : : 장성호입니다.
: : : :
: : : : X , Y   2 차원좌표계에 그래프를 그리는데요...
: : : :
: : : : 그래프 함수 공식 f(x) 은 없습니다.
: : : :
: : : : 단  x,y Point좌표는 여러개 주어집니다.
: : : :
: : : : 그  point정보를 가지고  각 point들을 지나는 곡선을 그려야 합니다.
: : : :
: : : : 뭐 좋은 방법없을까요?
: : : :
: : : : 오늘 인터넷에서 lagrange-보간법 예제를 찾아서 적용해 봤는데
: : : :
: : : : 곡선의 시작과 끝부분이 좀 이상하더라구요

+ -

관련 글 리스트
46897 보간법? X , Y 2 차원좌표계에 그래프를 그리는데... 장성호 1923 2006/10/27
46979     Re:보간법? X , Y 2 차원좌표계에 그래프를 그리는데... 보간식 1783 2006/11/06
46982         Re:Re:보간법? X , Y 2 차원좌표계에 그래프를 그리는데... 장성호 2239 2006/11/06
46985             Re:Re:Re:보간법? X , Y 2 차원좌표계에 그래프를 그리는데... 사랑니 2133 2006/11/06
46988                 Re:Re:Re:Re: 수정-라그랑쥐 보간법 장성호 3423 2006/11/06
46984             Re:Re:Re:보간법? X , Y 2 차원좌표계에 그래프를 그리는데... 보간다항식 2301 2006/11/06
46898     Re:보간법? X , Y 2 차원좌표계에 그래프를 그리는데... 사랑니 2552 2006/10/27
46901         Re:Re: 라그랑쥐 보간법 --- 그런데.... 장성호 2603 2006/10/27
46919             Re:Re:Re: 라그랑쥐 보간법 --- 그런데.... 유영인 Cuperido 3700 2006/10/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.