すみません編集させていただきました(測量最小二乗法について)

 投稿者:kikiriri  投稿日:2009年 1月29日(木)18時12分33秒
  測量網平均 最小二乗法について、
情報待つ、
 

Re: 測量最小二乗法について

 投稿者:山中和義  投稿日:2009年 1月30日(金)15時06分48秒
  > No.254[元記事へ]

kikiririさんへのお返事です。


Full BASICの場合、行列が計算できるので、他の言語よりは簡単に計算できると思います。
ただ、2項演算までですから、展開しながらこつこつ計算する必要があります。

また、表計算の方がGUIを含めて実用化し易いかもしれません。


上記サイトの例題(PDFファイル内)のサンプルコーディング
!最小2乗法による測量網平均(条件方程式法)

!H型
!  A  C
! 1↓ 5 ↓3
!  P → Q
! 2↑  ↑4
!  B  D

!既知点
LET C=4 !数

DATA 25.645 !A点の標高(m)
DATA 24.666 !B点
DATA 25.024 !C点
DATA 25.699 !D点
DIM Z(C)
MAT READ Z

!観測値
LET P=5 !数

DATA -6.225, 0.44 !路線1 高低差(m)、路線長(km)
DATA -5.245, 0.25 !路線2
DATA  0.278, 0.33 !路線3
DATA -0.399, 0.26 !路線4
DATA  5.879, 0.44 !路線5

DIM X(P),G(P,P) !観測値、コアファクタ
MAT G=ZER
FOR i=1 TO P
   READ X(i),G(i,i)
NEXT i
MAT PRINT X;
MAT PRINT G;


!未知数
LET Px=2 !求点PとQ


!------------------------------

!自由度R ※条件方程式の数
LET R=P-Px


!条件方程式 UV=t
DIM U(R,P)
DATA 1,-1,0,0,0 !点Pについて HA+h1~=HB+h2~ より、(h1+v1)-(h2+v2)=HB-HA ∴v1-v2=-(h1+HA)+(h2+HB)
DATA 0,0,1,-1,0 !点Qについて HC+h3~=HD+h4~
DATA 1,0,0,-1,1 !点Pと点Qについて HA+h1~+h5~=HD+h4~
MAT READ U

DIM t(R,1)
FOR i=1 TO R
   LET s=0
   FOR j=1 TO P
      IF j>C THEN LET Zj=0 ELSE LET Zj=Z(j)
      LET s=s-(X(j)+Zj)*U(i,j)
   NEXT j
   LET t(i,1)=s
NEXT i
!!!LET t(1,1)=-X(1)+X(2)-Z(1)+Z(2) !0.001
!!!LET t(2,1)=-X(3)+X(4)-Z(3)+Z(4) !-0.002
!!!LET t(3,1)=-X(1)+X(4)-X(5)-Z(1)+Z(4) !0.001
MAT PRINT t;


!------------------------------

!相関式 NK=t、N=UG(Ut)より、K=(Ni)tを求める
DIM Ut(P,R)
MAT Ut=TRN(U)
DIM TMP(P,R) !G(Ut) ※次でも使う
MAT TMP=G*Ut
DIM N(R,R)
MAT N=U*TMP
MAT PRINT N;

DIM invN(R,R)
MAT invN=INV(N)
DIM K(R,1)
MAT K=invN*t

MAT PRINT K;


!補正値の計算(mm) V=G(Ut)K
DIM V(P,1)
MAT V=TMP*K

MAT PRINT V;


!最確値 X~=X+V
FOR i=1 TO P
   PRINT "路線";STR$(i);"=";X(i)+V(i,1)
NEXT i
PRINT "点P";Z(1)+(X(1)+V(1,1)); Z(2)+(X(2)+V(2,1)) !有効桁数 ##.###
PRINT "点Q";Z(3)+(X(3)+V(3,1)); Z(4)+(X(4)+V(4,1))




!精度の計算(mm^2) σ^2=(Kt)NK/r
DIM s2(1,1),Kt(1,R)
MAT Kt=TRN(K)
MAT s2=Kt*t !NK=t
LET sigma2=s2(1,1)/R

PRINT "σ^2=";sigma2


!分散行列(mm^2) σ^2*Gx、Gx=G-G(Ut)(Ni)UG
DIM Gx(P,P)
MAT Gx=TMP*invN !G(Ut)(Ni)
MAT Gx=Gx*U
MAT Gx=Gx*G
MAT Gx=G-Gx
MAT Gx=sigma2*Gx

MAT PRINT Gx;


END
 

戻る