내 구현 잘못 다항식 :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;
}
죄송합니다! 나는 그것을 게시하는 동안 그것을 섞었다! 그러나 코드의 1 - x 버전이 맞았으므로 문제가 남아 있습니다. –