師匠の散歩

JavaScriptをちょこっと

連立方程式の逆関数を求める

連立方程式の逆関数を書き出しました。公式というほどのものでく、WEB検索でさくっと出てこなかったので自分で書いてみました。

発端は、測地系変換に掲載したこの情報です。

\( \begin{aligned} y_w =& y_j - 0.00010695 y_j + 0.000017464 x_j + 0.0046017 \\ x_w =& x_j - 0.000046038 y_j - 0.000083043 x_j + 0.010040 \\ ※& wy:世界測地系 緯度、wx:世界測地系 経度、jy:日本測地系 緯度、jx:日本測地系 経度 \\ \\ これを&もとに、次の式で逆方向の変換ができます。\\ \\ y_j =& 1.000106961 y_w - 0.000017467 x_w - 0.004602017 \\ x_j =& 1.000083049 x_w + 0.000046047 y_w - 0.010041046 \\ ※& wy:世界測地系 緯度、wx:世界測地系 経度、jy:日本測地系 緯度、jx:日本測地系 経度 \end{aligned} \)

  じゃらんWebサービス/チュートリアル

    wy = jy - jy * 0.00010695 + jx * 0.000017464 + 0.0046017
    wx = jx - jy * 0.000046038 - jx * 0.000083043 + 0.010040
    ※ wy:世界測地系 緯度、wx:世界測地系 経度、jy:日本測地系 緯度、jx:日本測地系 経度

これをもとに、次の式で逆方向の変換ができます。

    jy = wy * 1.000106961 - wx * 0.000017467 - 0.004602017
    jx = wx * 1.000083049 + wy * 0.000046047 - 0.010041046
    ※ wy:世界測地系 緯度、wx:世界測地系 経度、jy:日本測地系 緯度、jx:日本測地系 経度

WEBで「こうだ!」と書いてあるものを疑って、自分で解を求めるのが師匠のポリシーだったのにサボっておりました。

でもって、確認した結果を掲載します。

関数

せっかくなので、途中の計算式も書き出しました。配列戻しを使いたかったので、VBAではなくjavascriptで記述しました。

// このようにa〜fが既知の連立方程式を
// X = a x + b y + c
// Y = d x + e y + f
// このような形に変形するときのA〜Fを求める
// x = A X + B Y + C
// y = D X + E Y + F
// 式を求めるのが目的なので 禁則処理(ゼロの割り算)は無視しました

// X = a * x + b * y + c                                                   ・・・(1)
// Y = d * x + e * y + f                                                   ・・・(2)
// b * y = X - a * x - c 
// y = (X - a * x - c) / b                                                 ・・・(3)
// Y = d * x + e *(X - a * x - c) / b + f
// Y = d * x + e / b * X - a * e * x / b - a * c / b + f
// (d - a * e / b) * x = Y - e * / b * X + a * c / b - f
// k = 1 / (d - a * e / b)                                                       ・・・(4)
// x = -e * k / b * X + k * Y + (a * c / b - f) * k                        ・・・(5)
// Y = d * ( -e * k / b * X + k * Y + (a * c / b - f) * k + e * y + f
// e * y = d * e k / b * X  + (1 - d * k) * Y -(a * c / b - f) * d * k + f
// y = d * k / b + (1 - d * k) / e * Y + ((a * c / b - f) * d * k - f) / e ・・・(6)

function arcFunction(){
  var a = 1- 0.000083043;
  var b = - 0.000046038 ;
  var c = 0.010040;
  var d = 0.000017464;
  var e = 1 - 0.00010695;
  var f = 0.0046017;

  var k = 1 /(d-a*e/b);
  return [-e*k/b , k , (a*c/b-f)*k , d*k/b , (1-d*k)/e , ((a*c/b-f)*d*k-f)/e]; // 配列戻し
}

検算

自分で計算して参考文献が正しいことを納得しました。参考値とCとFの数値が微妙に異なりますが、元の係数の有効桁が7なのでどちらも正しいと考えて良いでしょう。


A =
B =
C =
D =
E =
F =
じゃらんWebサービス/チュートリアル
jx = wx * 1.000083049 + wy * 0.000046047 - 0.010041046
jy = - wx * 0.000017467 + wy * 1.000106961 - 0.004602017

Topに戻る // 一覧に戻る
Copyright(C) Grandmaster since 2010最終更新:2016/12/3