簡體   English   中英

用 c 中的兩個數組對 n 的所有值進行插值的最佳方法是什么?

[英]What is the best way to interpolate for all values of n, with two arrays in c?

我想用兩個數組的信息對 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 = 8 時oo[i + 1]在末尾向外讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM