c - 用 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。
解决方案
问题很可能是这一点:
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]
处读取在结束处外部。
推荐阅读
- wifi - 如何使用cfg80211->start_ap?
- c# - 如何延迟服务窗口中的 OnStop 方法?
- angular - primeNg 日历无法禁用数组中的日期或突出显示当前日期
- svg - SVG 文本的 x 和 y 值,以百分比 + 像素表示
- javascript - TypeError: $ .find 不是函数
- c++ - 为什么静态成员方法不能在 C++ 中访问其非静态方法?
- identityserver4 - identityserver4 保存设备 ip?
- c# - 如何使用 TextBox 对 Listbox 中的所有数字求和?
- python - 用 JSON 中的字符串列表替换单词中的多个相等字符串
- python - 将变量和值传递给函数(通配符?)