Я реализовал эту линейную интерполяцию самостоятельно (часть написана на испанском языке, извините).Функция с именем encuentraValorMasProximo просто находит ближайшее значение (elementoMasProximo) и индекс (indiceEnVector) к другому (xx [i]) в массиве (xD).
void interp1(int *x, int x_tam, double *y, int *xx, int xx_tam, double *yy)
{
double *dx, *dy, *slope, *intercept, *elementoMasProximo, *xD;
int i, *indiceEnVector;
dx=(double *)calloc(x_tam-1,sizeof(double));
dy=(double *)calloc(x_tam-1,sizeof(double));
slope=(double *)calloc(x_tam-1,sizeof(double));
intercept=(double *)calloc(x_tam-1,sizeof(double));
indiceEnVector=(int *) malloc(sizeof(int));
elementoMasProximo=(double *) malloc(sizeof(double));
xD=(double *)calloc(x_tam,sizeof(double));
for(i=0;i<x_tam;i++){
xD[i]=x[i];
}
for(i = 0; i < x_tam; i++){
if(i<x_tam-1){
dx[i] = x[i + 1] - x[i];
dy[i] = y[i + 1] - y[i];
slope[i] = dy[i] / dx[i];
intercept[i] = y[i] - x[i] * slope[i];
}else{
dx[i]=dx[i-1];
dy[i]=dy[i-1];
slope[i]=slope[i-1];
intercept[i]=intercept[i-1];
}
}
for (i = 0; i < xx_tam; i++) {
encuentraValorMasProximo(xx[i], xD, x_tam, x_tam, elementoMasProximo, indiceEnVector);
yy[i]=slope[*indiceEnVector] * xx[i] + intercept[*indiceEnVector];
}
}
test Функция может быть:
void main(){
int x_tam, xx_tam, i;
double *yy;
int x[]={3,6,9};
double y[]={6,12,18};
int xx[]={1,2,3,4,5,6,7,8,9,10};
x_tam=3;
xx_tam=10;
yy=(double *) calloc(xx_tam,sizeof(double));
interp1(x, x_tam, y, xx, xx_tam, yy);
for(i=0;i<xx_tam;i++){
printf("%d\t%f\n",xx[i],yy[i]);
}
}
И ее результат :
1 2.000000
2 4.000000
3 6,000000
4 8,000000
5 10,000000
6 12,000000
7 14,000000
8 16,000000
9 18,000000
10 20,000000