我正在尝试使用一种名为Neville方法的特定方法来实现一种称为拉格朗日插值的插值方法。
我的问题是函数返回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),它们是预先已知的,因为它是内插数据的一部分。
在我展示递归函数的代码之前,我应该提到插值数据是2d数组,第一列是输入值(x),第二列是输出值(y)。它只是一个随机排序的2d数组,x和y都相等。
我还创建了一个函数,它在给定开始和结束索引的情况下抓取数组的一部分,并返回另一个2d数组。这有助于插值功能。
如下所示:
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 :(得分:3)
零来自函数返回的第一项:
1/(array[n-1][0] - array[0][0])
您使用大于1的数字执行1的整数除法。由于数学结果小于1,并且由于数字的小数部分被截断,因此最终得到0。
你需要在这里做至少一个操作数double
来进行浮点运算。您也应该从函数中返回double
。
double Lagrange_Neville(int **array, int n, int x)
{
int i;
if (n == 1)
{
return array[0][1];
}
// v---- constant of type double
return 1.0/(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));
}
答案 1 :(得分:2)
跳出来的第一件事是你的Lagrange_Neville()
函数被声明为返回int
,并且你在这里使用整数除法:
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));
因为array
被声明为包含整数,并且1显然是一个整数,所以你将在第一个除法中获得整数结果,这可能会给出0。你可以改变除法给出float
使用1.0
作为分子代替1
的{{1}}结果,但由于该函数返回int
,您仍然会得到答案“{1}}转换为那种类型,这可能不是你想要的。尝试声明该函数,以便它返回一个浮点类型。