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

问题描述

我想用两个数组的信息对 n 的任何值进行插值。我有一个主文件,其中在整个代码中使用了 omega 和 n,并且我有一个用于插值的头文件。n 和 omega 在主文件中声明为int n = 129;double omega;。我试图像下面的代码一样进行数学插值,但是当 n 的值与数组中的值不同时,它似乎会遇到麻烦。它似乎适用于 n=30、n=60、n=100 等,但不适用于 n=35、n=129 等。

还有其他更好的插值方法吗?我对指针不是很好,所以我不确定我是否正确使用它们,或者是否需要它们..

我试图为没有头文件的插值创建一个单独的项目,它似乎工作正常,所以我怀疑它与头文件有关,但我不完全确定。我正在使用代码块。

#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。

标签: carraysheaderinterpolationlinear-interpolation

解决方案


问题很可能是这一点:

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 = 8oo[i + 1]处读取在结束处外部。


推荐阅读