Каков наилучший способ интерполяции для всех значений n с двумя массивами в c? - PullRequest
1 голос
/ 31 марта 2019

Я хочу интерполировать для любого значения n с информацией двух массивов. У меня есть основной файл, где омега и 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.

1 Ответ

1 голос
/ 31 марта 2019

Проблема, скорее всего, в этом бите:

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] читает снаружи в конце.

...