○ 線形補間

補間とは間を補うという意味がありますが、 数学では、数字と数字の間の値の近似値を求める事を指します
線形補間では、数字と数字の間が直線的であると考えて、近似値を算出します

■教科書によると

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

▼元になっている数列と実行結果をエクセルでグラフを作成して確認してみます



線形補間が行われ、グラフの要素数が違うのに同一のグラフを描いていることが確認できます。




▼縦方向の線形補間


横方向の線形補間は上でやりましたが、こんな感じでした。



縦方向の線形補間はひっくり返すだけです。



ただ、縦横を組み合わせると2次元で線形補間できるっていうのがミソです。






▲トップページ > プログラミングの実験