【发布时间】:2018-07-15 19:12:42
【问题描述】:
我正在尝试使用一种称为内维尔方法的特定方法来实现一种称为拉格朗日插值的插值方法。
我的问题是函数返回 0,我不确定为什么。
这是一种递归方法,在给定输入的情况下,它最终应该返回对输出的估计值。
值 P_0,1,2,...,n-1,n 调用 P_1,2,...,n-1,n 和 P_0,1,2,...n-1。 P_1,2,...,n-1,n 调用 P_2,...,n-1,n 和 P_1,2,...,n-1。当它下降到 P_0、P_1、... 或 P_n 时,它正在调用 f(x_0)、f(x_1)、... 或 f(x_n),因为它是内插数据的一部分,所以事先已知。
在展示递归函数的代码之前,我应该提一下插值数据是一个二维数组,第一列是输入值 (x),第二列是输出值 (y)。它只是一个随机排序的二维数组,其中 x 和 y 都相等。
我还创建了一个函数,该函数在给定开始和结束索引的情况下获取数组的一部分,并作为另一个二维数组返回。这是为了辅助插值功能。
如下图:
int **index_array(int **array, int beg, int stop)
{
int i, **new_array, new_array_length;
new_array_length = stop - beg + 1;
new_array = malloc(sizeof(int *) * (new_array_length));
for (i = 0; i < new_array_length; i++)
{
new_array[i] = malloc(sizeof(int)*2);
}
for (i = 0; i < new_array_length; i++)
{
new_array[i][0] = array[beg + i][0];
new_array[i][1] = array[beg + i][1];
}
return new_array;
}
这是插值函数:
int Lagrange_Neville(int **array, int n, int x)
{
int i;
if (n == 1)
{
return array[0][1];
}
return 1/(array[n-1][0] - array[0][0]) * ((x - array[0][0])*Lagrange_Neville(index_array(array, 1, n-1), n-1, x)-(x-array[n-1][0])*Lagrange_Neville(index_array(array, 0, n-2), n-1, x));
}
我的主要():
int main(void)
{
srand(time(NULL));
int **array, **new_array, n, beg, end, x;
n = 10;
beg = 5;
end = n-1;
x = 5;
array = createArray(n);
printf("First array:\n");
print_array(array, n);
new_array = index_array(array, beg, end);
printf("New array from indices %d to %d of the old array:\n", beg, end);
print_array(new_array, end-beg+1);
printf("Output of lagrange interpolating estimated at x = %d\n", x);
printf("%d\n", Lagrange_Neville(array, n, x));
return 0;
}
我的输出:
First array:
2 2
5 5
7 7
9 9
12 12
13 13
16 16
17 17
20 20
21 21
New array from indices 5 to 9 of the old array:
13 13
16 16
17 17
20 20
21 21
Output of lagrange interpolating estimated at x = 5
0
感谢您的帮助。
【问题讨论】:
-
您对所有内容都使用整数,因此您的结果可能被四舍五入到 0
标签: c arrays algorithm recursion interpolation