• Showing Page History #17169

PackageLoc : 3D幾何・代数操作パッケージ

Processing専用ではなく単独でも使えるコンパクトな幾何・代数クラス群。以下のクラスが利用可能

  • Loc : 3Dベクトルモデル     ー 三次元幾何演算が可能(Wrj4P5に必要)
  • Vec : 任意長の行ベクトルモデル ー 一般ベクトル演算、および高次方程式の求根が可能
  • Mat : 任意サイズの行列モデル  ー 一般行列演算、および一次連立方程式の求解が可能
  • EqSys: 非線形連立方程式モデル  ー 一般非線形連立方程式(系)の求解が可能(抽象クラス)
  • Vfunc: 非線形ベクトル関数モデル ー 一般パラメタ付きベクトル関数の求解・求極点・観測に基づくパラメタ同定が可能(抽象クラス)

Vec,Mat, EqSys, Vfuncのためのテストコードはこちら

Loc :位置(x, y, z)を表す非常に軽いクラス

だけど、位置あるいはベクトルに関する演算は豊富。 ハイパーカードの「見える」オブジェクトはプロパティーlocを必ず持っていたもんだ。 実態は「X座標値,Y座標値」が書かれた文字列なんだけど、the first item of loc of cursorでマウスカーソルのX座標を取り出せた。 なもんで、P5でもlocを使いたくて自前で用意したのがLoc。

  • Javaには類似のクラスがあったらしいが、Locって名前じゃなかったので、調べないで着手してしまった。

で、軽いクラスの割には豊富な操作が可能。覚えておいて損は無い。(はず)

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の例題】ロジスティック曲線パラメータ同定