○ 線形補間
補間とは間を補うという意味がありますが、
数学では、数字と数字の間の値の近似値を求める事を指します
線形補間では、数字と数字の間が直線的であると考えて、近似値を算出します
■教科書によると
2点(xi,yi),(xi+1,yi+1)がわかっているとき、xi≦x≦xi+1の任意の点xに対するf(x)の近似値を
2点の直線で結んだxの1次関数として求める。
線形補間の式は以下のとうり
y=yi + (yi+1-yi)(x-xi)/(xi+1-xi)
■以下のような数列で、xが15の場合のyの値を求めてみます

1000+(500-1000)*(15-10)/(20-10)=750
xが15の場合のyの値は750付近の値であると算出されます
▼上記数列からxの近似値を算出するプログラムを作成してみます
#include <stdio.h>
//線形補間の公式 y=yi + (yi+1-yi)(x-xi)/(xi+1-xi)
#define INTERP(xi,xi1,yi,yi1,x) (yi + ((( yi1 - yi ) * ( x - xi )) / ( xi1 - xi )))
//数列
const int ar[]={
/* x */ 10, 20, 30, 40, 50, 60,
/* y */ 1000, 500, 100, 300, 600, 300
};
//数列の横の長さ
const int ar_w=(sizeof(ar)/sizeof(ar[0]))/2;
//線形補間 x:補間する値 ar:数列 w:数列の横の長さ
int interp1dim(const int x,const int*ar,const int w){
int i;
//xの値が範囲外の場合はxが最大最小値の値を返す
if(x<=ar[0]){
return ar[w];
}else if(x>=ar[w-1]){
return ar[w*2-1];
}
for(i=1;i<w;i++){
if(ar[i]>=x) break;
}
// y=yi + (yi+1-yi)(x-xi)/(xi+1-xi) を行い値を返す
return INTERP(ar[i-1],ar[i],ar[i+w-1],ar[i+w],x);
}
int main(){
int i,j;
for(i=10;i<=60;i++){
j=interp1dim(i,ar,ar_w);
printf("%d\t%d\n",i,j);
}
return 0;
}
▼実行結果
10 1000
11 950
12 900
13 850
14 800
15 750
16 700
17 650
18 600
19 550
20 500
21 460
22 420
23 380
24 340
25 300
26 260
27 220
28 180
29 140
30 100
31 120
32 140
33 160
34 180
35 200
36 220
37 240
38 260
39 280
40 300
41 330
42 360
43 390
44 420
45 450
46 480
47 510
48 540
49 570
50 600
51 570
52 540
53 510
54 480
55 450
56 420
57 390
58 360
59 330
60 300
▼元になっている数列と実行結果をエクセルでグラフを作成して確認してみます

線形補間が行われ、グラフの要素数が違うのに同一のグラフを描いていることが確認できます。
▲トップページ
>
プログラミングの実験