用c中的两个数组对n的所有值进行插值的最佳方法是什么?

时间:2019-03-31 11:14:18

标签: c arrays header interpolation linear-interpolation

我想用两个数组的信息对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 ish,但应为2.6 ish。

1 个答案:

答案 0 :(得分:1)

问题很可能就是这样:

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]在末尾读取外部。