- 円の中心と半径を推定する
前日の図は火星をちょいとばかり大きく描きすぎてしまった。軌道と同じスケールでは点
にしかならないので適当なそれらしい球を配置してつもりだったが火星と木星の半径を入れ違えてしまいました。まあご愛嬌ということで....。
さて計測器などで穴の真円度や円筒物体の置かれた中心位置、半径等を測定すると当然のごとく測定のバラツキが生じて値の推定をしなければならない場合があ
る。CATの分野は良く知らないがそれなりの手法があるだろうが最小二乗法という手法も有効な方法ではないだろうか?。最小二乗法は簡単に言うと測定値Yに対して当てはめる関数F(X)の形状を変えてなるべくぴったりと当てはまるF
(X)を決定しようというものです。端的にいえば(Y - F(X))^2
が最も小さくなるようにするというある意味では最適化計算に属するようなものです。という事で今
回はそのような実験をしてみた。手元には測定器などは無いので適当な円を作って人為的にバラツキを生成し、何となく円のように分布した点群を生成して
円 (x - a)^2 + (y - b)^2 = r^2 を当てはめて最もよく当てはまる中心(a,b)半径r を求めてみた。
#%
for ( t = 0; t < 2*pai; t = t + 0.01 ){
xx[i] = cos(t)+5+random(-.05, 0.05);
yy[i] = sin(t)+15+random(-.05, 0.05);
dmy[i] = 0;
put 1;
P[i] = [xx[i], yy[i]];
put 0;
i++;
}
num = i;
expr = "(xx[t]-u[0])^2 + (yy[t] - u[1])^2 - u[2]^2";
setlsqexprall( getstr(expr));
prm[0] = 1;
prm[1] = 1;
prm[2] = 3;
nlsqfit( num, "dmy", 3, "prm", 0.001);
endlsqexpr();
put 1;
modalcolor(0,0,255);
Arc = ([prm[0], prm[1]],[1,0],[0,1]), prm[2];
end; |
画像をクリックすると拡大表示されるはずです。
|