我想用两个数组的信息对 n 的任意值进行插值。我有一个主文件,其中在整个代码中使用了 omega 和 n,并且我有一个用于插值的头文件。 n 和 omega 在主文件中声明为 int n = 129;
和 double omega;
。我曾尝试像下面的代码那样进行数学插值,但当 n 的值与数组中的值不同时,它似乎会遇到麻烦。它似乎适用于 n=30、n=60、n=100 等,但不适用于 n=35、n=129 等。
有没有其他更好的插值方法?我不太擅长指针,所以我不确定我是否正确使用它们,或者是否需要它们..
我曾尝试在没有头文件的情况下为插值创建一个单独的项目,它似乎工作正常,所以我怀疑它与头文件有关,但我不完全确定。我正在使用 CodeBlocks。
#include "header.h"
void interpol(int n, double *omega){
int i;
int nn[9] = {0, 5, 10, 20, 30, 40, 60, 100, 500};
double oo[9] = {1.7, 1.78, 1.86, 1.92, 1.95, 1.96, 1.97, 1.98, 1.99};
for (i=0; i<9; i++)
{
if (n<nn[i])
{
*omega = oo[i-1] + ((oo[i+1]-oo[i-1])/(nn[i+1]-nn[i-1]))*(n-nn[i-1]);
break;
}
}
printf("\nomega = %lf \n", *omega);
}
我将添加一个主文件的简化版本,因为插值是在最开始的时候,其余的对于这种情况并不重要。在标题中是:
void interpol(int n, double *omega);
主要脚本:
#include "header.h"
int main(){
int n;
double omega;
n=129;
interpol(n, &omega);
printf("\nomega = %lf \n", omega);
return 0;
}
对于 n=129,预期值应为 1.98 左右,但结果为 2.6 左右。
最佳答案
问题很可能是这一点:
for (i=0; i<9; i++) {
if (n < nn[i]) {
omega = oo[i-1] + ((oo[i+1]-oo[i-1])/(nn[i+1]-nn[i-1]))*(n-nn[i-1]);
break;
}
}
在这里,您会遇到两端读取越界的危险。如果在 i = 0 处,则 oo[i - 1]
在开始端向外读取,在 i = 8 处,oo[i + 1]
在结束处向外读取。
关于c - 用 c 中的两个数组对 n 的所有值进行插值的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55440335/