2012-11-14 2 views
0

내 구현 잘못 다항식 :Laguerre 보간 알고리즘은, 뭔가 내가 다음 Laguerre에 대한 원을 계수를 찾을 수 있겠</p> <p>...이 난 직후 낭비 시간을 포기하고 돌아 오는 일주일 동안 고민 한 문제가

P0(x) = 1 

P1(x) = 1 - x 

Pn(x) = ((2n - 1 - x)/n) * P(n-1) - ((n - 1)/n) * P(n-2) 

내가 어떤 이유로 내가 얻을 원을 계수가 너무 큰 것 때문에 오류가 내 구현에있다 생각합니다. 코드의

a1 = -190.234 
a2 = -295.833 
a3 = 378.283 
a4 = -939.537 
a5 = 774.861 
a6 = -400.612 

설명 (아래) : 이것은이 프로그램이 생성하는 출력 당신은 내가 배열을 선언 어디 부분에 약간 아래로 코드를 스크롤하면 당신은 주어진 X의의를 찾을 수 있습니다,

및 그래.

함수 다항식은 특정 x에 대해 상기 다항식의 값으로 어레이를 채운다. 이것은 재귀 함수입니다. 출력 값을 확인했기 때문에 효과가 있다고 생각합니다.

gauss 함수는 출력 배열에서 가우시안 제거를 수행하여 계수를 찾습니다. 나는 이것이 문제가 시작되는 곳이라고 생각한다. 이 코드에 실수가 있거나 아마도 결과를 매우 좋아하는 방식이 나쁘다면 궁금합니다. 나는 그런 그들을 확인하는 것을 시도하고있다 :

-190.234 * 1.5^5 - 295.833 * 1.5^4 ... - 400.612 = -3017,817625 =/= 2 

코드 : 명시된 바와 같이

#include "stdafx.h" 
#include <conio.h> 
#include <iostream> 
#include <iomanip> 
#include <math.h> 

using namespace std; 

double polynomial(int i, int j, double **tab) 
{ 
    double n = i; 
    double **array = tab; 
    double x = array[j][0]; 

    if (i == 0) { 
     return 1; 
    } else if (i == 1) { 
     return 1 - x; 
    } else { 
     double minusone = polynomial(i - 1, j, array); 
     double minustwo = polynomial(i - 2, j, array); 
     double result = (((2.0 * n) - 1 - x)/n) * minusone - ((n - 1.0)/n) * minustwo; 
     return result; 
    } 
} 

int gauss(int n, double tab[6][7], double results[7]) 
{ 
    double multiplier, divider; 

    for (int m = 0; m <= n; m++) 
    { 
     for (int i = m + 1; i <= n; i++) 
     { 
      multiplier = tab[i][m]; 
      divider = tab[m][m]; 

      if (divider == 0) { 
       return 1; 
      } 

      for (int j = m; j <= n; j++) 
      { 
       if (i == n) { 
        break; 
       } 

       tab[i][j] = (tab[m][j] * multiplier/divider) - tab[i][j]; 
      } 

      for (int j = m; j <= n; j++) { 
       tab[i - 1][j] = tab[i - 1][j]/divider; 
      } 
     } 
    } 

    double s = 0; 
    results[n - 1] = tab[n - 1][n]; 
    int y = 0; 
    for (int i = n-2; i >= 0; i--) 
    { 
     s = 0; 
     y++; 
     for (int x = 0; x < n; x++) 
     { 
      s = s + (tab[i][n - 1 - x] * results[n-(x + 1)]); 

      if (y == x + 1) { 
       break; 
      } 
     } 
     results[i] = tab[i][n] - s; 
    } 

} 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int num; 
    double **array; 

    array = new double*[5]; 
    for (int i = 0; i <= 5; i++) 
    { 
     array[i] = new double[2]; 
    } 
         //i   0  1  2  3  4  5 
    array[0][0] = 1.5; //xi   1.5 2  2.5  3.5  3.8  4.1 
    array[0][1] = 2; //yi   2  5  -1  0.5  3  7 
    array[1][0] = 2; 
    array[1][1] = 5; 
    array[2][0] = 2.5; 
    array[2][1] = -1; 
    array[3][0] = 3.5; 
    array[3][1] = 0.5; 
    array[4][0] = 3.8; 
    array[4][1] = 3; 
    array[5][0] = 4.1; 
    array[5][1] = 7; 

    double W[6][7]; //n + 1 

    for (int i = 0; i <= 5; i++) 
    { 
     for (int j = 0; j <= 5; j++) 
     { 
      W[i][j] = polynomial(j, i, array); 
     } 
     W[i][6] = array[i][1]; 
    } 

    for (int i = 0; i <= 5; i++) 
    { 
     for (int j = 0; j <= 6; j++) 
     { 
      cout << W[i][j] << "\t"; 
     } 
     cout << endl; 
    } 

    double results[6]; 
    gauss(6, W, results); 

    for (int i = 0; i < 6; i++) { 
     cout << "a" << i + 1 << " = " << results[i] << endl; 
    } 

    _getch(); 
    return 0; 
} 

답변

0

P1(x) = x - 1의 정의는 구현되지 않습니다. 계산에 1 - x이 있습니다.

나는 더 이상 보지 않았다.

+0

죄송합니다! 나는 그것을 게시하는 동안 그것을 섞었다! 그러나 코드의 1 - x 버전이 맞았으므로 문제가 남아 있습니다. –

2

재귀 다항식 생성에 대한 당신의 해석은 수정이 필요하거나 나에게 너무 영리하다고 생각합니다.

주어진 P [0] [5] = {1,0,0,0,0, ...}; P [1] [5] = {1, -1,0,0,0, ...};
P [2]는 * P [0] + 컨볼 루션 (P [1], {c, d})입니다. P [N]에서 == * P ((N - - 1)/N) C = (2N - - 1)/N이고, D =이 일반화 될 수 1/N

A =는
[n-2] + conv (P [n-1], {c, d}); 모든 단계에서 (C + d * x)와 다항식 곱셈이 포함되며, 1을 (1만큼만) 씩 증가시키고 P [n-1]에 스칼라 a를 곱한 값을 더합니다.

다음 보간 인자 x는 범위 [0..1]에 있습니다.

(회선 당신이 운이 좋게 쉽게 다항식 곱셈을 구현해야한다는 의미 ...)

   [a,b,c,d] 
       * [e,f] 
     ------------------ 
      af,bf,cf,df + 
     ae,be,ce,de, 0 + 
-------------------------- 
(= coefficients of the final polynomial) 
+0

이 솔루션은 현명하게 보입니다. 그러나 주어진 작업은 숙제이며이 방법은 허용되지 않습니다. 그러나 시도해 볼 수도 있습니다. 만약 내가 아무 것도 알아 내지 못하면 –

+0

laguerro-gauss * interpolation *의 수학이 100 : 1을 능가한다. 이것은 내가 방황하는 라구 에로 다항식입니다. –