PackageLoc : 3D幾何・代数操作パッケージ
Processing専用ではなく単独でも使えるコンパクトな幾何・代数クラス群。以下のクラスが利用可能
- Loc : 3Dベクトルモデル ー 三次元位置/ベクトル演算が可能(Wrj4P5に必要)
- Rod : 3D直線モデル ー 三次元直線に関する演算が可能
- Tag : 3D平面モデル ー 三次元平面に関する演算が可能
- Ship : 3D空間モデル ー 三次元立体に関する演算が可能(まだ)
- Vec : 任意長の行ベクトルモデル ー 一般ベクトル演算、および高次方程式の求根が可能
- Mat : 任意サイズの行列モデル ー 一般行列演算、および一次連立方程式の求解が可能
- EqSys: 非線形連立方程式モデル ー 一般非線形連立方程式(系)の求解が可能(抽象クラス)
- Vfunc: 非線形ベクトル関数モデル ー 一般パラメタ付きベクトル関数の求解・求極点・観測に基づくパラメタ同定が可能(抽象クラス)
Vec,Mat, EqSys, Vfuncのためのテストコードはこちら
Rod のための テストコードはこちら
Loc :3次元空間の位置(x, y, z)を表す非常に軽いクラス
だけど、位置あるいはベクトルに関する演算は豊富。
ハイパーカードの「見える」オブジェクトはプロパティーlocを必ず持っていたもんだ。
実態は「X座標値,Y座標値」が書かれた文字列なんだけど、the first item of loc of cursorでマウスカーソルのX座標を取り出せた。
なもんで、P5でもlocを使いたくて自前で用意したのがLoc。
- Javaには類似のクラスがあったらしいが、Locって名前じゃなかったので、調べないで着手してしまった。
で、軽いクラスの割には豊富な操作が可能。覚えておいて損は無い。(はず)
Rod :3次元空間の直線のモデル
位置ベクトルのモデルであるLocに比べると操作のバリエーションは少ないけど、各々の内容は遥かに濃い。とりあえず下記のようなイメージ
- at(t)=tにある位置 :(直線の)方向ベクトルを長さtだけ延長したところにある点
- stern()=艢(とも) :基点の位置
- fore()=前方(ぜんぽう):長さ1の単位ベクトル
- bow() =舳先(へさき) :(直線の)方向ベクトルを現在の長さ(length)だけ延長したところにある点
- length()=全長 ;この【線分】の長さ
つぎの三っつのメソッドはre-chestnut君による解の公式の成果。(多謝)
- Rod nearest(Rod to) // thisとtoのあいだの最短線分、長さが0なら交差している
- float dist(Rod to) // 二つの直線間の距離(3次元空間上での最近接距離)
- boolean crossing(Rod to) // 直線toと交差するか?(最近接距離がゼロか?)
Tag :3次元空間の平面のモデル
Rodに幅(横方向)を付けたモデル。増えたのは
- at(t,s)=(t,s)にある位置 :二つの方向ベクトルをそれぞれt倍、s倍だけ延長したところにある点
- keel()=竜骨(りゅうこつ) :この平面の前後を規定する直線、Rod
- starBoard()=右舷(うげん):右端の位置
- star()=右(みぎ) :右方向への方向ベクトル
- width()=全幅(ぜんぷく) :この【部分平面】の幅
- normal()=法線(ほうせん):この平面の法線ベクトル
Ship :3次元空間の空間/方形/姿勢のモデル
Tagに高さ(上方向)を付けたモデル。増えたのは
- at(t,s)=(t,s,u)にある位置 :三つの方向ベクトルをそれぞれt倍、s倍、u倍だけ延長したところにある点
- sea()=水面(水面) :この立体の水平面を規定する平面、Tag
- bridgeTop()=艦橋(かんきょう:艦橋上端の位置
- up()=上方(じょうほう) :上方向への方向ベクトル
- height()=全高(ぜんこう) :この【部分空間】の高さ
Vec :任意長の行ベクトルモデル
良くあるベクトル演算は一通りそろっている。(Loc->Vec, Vec->Locの変換にはこのクラスを用いる。)
さらに、高次方程式
f(x) = c0xn + c1xn-1 + c2xn-2 + .... + cn-1x1 = b
の全ての複素根、あるいは全ての実根のみをDurand-Kerner-Aberth(DKA)法で求める事が出来る。
Mat :任意サイズの行列モデル
良くある線形代数(行列)演算は一通りそろっている。
添字の基数は0。すなわち
elem(0, 0) : 左上の行列要素(double)
elem(row, col) : 左上から(row+1)番目の行、(col+1)番目の列の要素
さらに、LU分解を用いた多元線形連立方程式
F(x) = { {cij} } * { Xj } = { bj }
を解く事が出来る
- [注意!]
LU分解結果は下記メソッドでキャッシュされ、再利用される。
solve(), isSingular(), det(), inverse()
elemRef()で返される参照を通して内部で保持している行列が変更されてもキャッシュされているLU分解結果はクリアされない。(できない) この場合、上のメソッドを使用する前に、LUDecompose() を明示的に呼び出す必要がある。
EqSys:一般非線形連立方程式(系)モデルの概要
求解が可能な一般非線形連立方程式、
F : Rn -> Rm
で構成される方程式系 F(x) = 0 の抽象モデル、利用するには、EqSysから継承して、抽象メソッド
- valueAt(x) :ベクトルxにおける関数の値を評価する
- jacobAt(x) :ベクトルxにおける関数のグラディエント(Jacobian)を評価する
の実装が必要。
陽にグラディエント(Jacobian)を評価できない(=微分不可能な)関数の場合、
- jacobAt(x) : diffAt(x, d)を返す。
- diffAt(i, x, d) :必要なら、オーバーライドして、{{Fi(x+dj)-Fi(x)}/dj}を定義する
ように実装する。
- 現在のところ利用可能な求解法はニュートン法とSimplex法
VFunc:パラメータ付きベクトル関数モデルの概要
求解、求極点、パラメタ推定が出来るパラメータ付きのベクトル関数
F : Rn ・ Rm -> R
の抽象モデル、利用するには、Vfuncから継承して、抽象メソッド
- valueAt(x, p) :ベクトルxにおける関数の値を評価する
- gradAt(x, p) :ベクトルxによる関数のグラディエントを評価する(pは所与)
- gradParamAt(x, p):ベクトルpによる関数のグラディエントを評価する(xは所与)
の実装が必要。
陽にグラディエントを評価できない(=微分不可能な)関数の場合、
- gradAt(x, p) :diffAt(x,d,p) を返す
- diffAt(x, p, d) :必要なら、オーバーライドして、{ {F(xi+di:p)-F(xi:p)}/di }を評価する
- gradParamAt(x, p) :diffParamAt(x, d, p)を返す
- diffParamAt(x, d, p) :必要なら、オーバーライドして、{ {F(x:pi+di)-F(x:pi)}/di }を評価する
のように実装する。
現在のところは、
- func(x;p)=0 のニュートン法/シンプレックス法による求解
- func(x;p) のニュートン法/シンプレックス法による極点探索
- 残差平方和 ssr(obs,samples)のニュートン法/シンプレックス法によるパラメータ極点探索(最小二乗法)
のみ
【Vfuncの例題】ロジスティック曲線パラメータ同定