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

标签 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 左右,但结果为 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/

相关文章:

c - 如何使用 DOT 运算符初始化结构类型的数组

C++98 如何在 header 中初始化静态结构数组

javascript - 如何停止我的尾随线导致对象因数组大小而减慢

c++ - 为什么我不能在头文件中定义全局函数?

c - 如何在 C 函数中返回 int[N]*

c++ - 改进 malloc() 算法的下一步是什么?

使用 libcurl 进行自定义 SSL 证书验证

python - 快速查找二维数组中的多个最大值

c - 删除 TCP、IP 和以太网 header 后,从数据包中获取 HTTP header

c++ - 具有结构 vector 的类,其中包含相同的类