%comment $OpenXM: OpenXM/src/asir-contrib/packages/doc/n_wishartd/n_wishartd-ja.texi,v 1.4 2017/08/31 06:31:45 takayama Exp $ %comment --- おまじない --- \input texinfo-ja @iftex @catcode`@#=6 @def@fref#1{@xrefX[#1,,@code{#1},,,]} @def@b#1{{@bf #1}} @catcode`@#=@other @end iftex @overfullrule=0pt @documentlanguage ja @c -*-texinfo-*- @comment %**start of header @comment --- おまじない終り --- @comment --- GNU info ファイルの名前 --- @setfilename asir-contrib-n_wishartd @comment --- タイトル --- @settitle n_wishartd @comment %**end of header @comment %@setchapternewpage odd @comment --- おまじない --- @ifinfo @macro fref{name} @ref{\name\,,@code{\name\}} @end macro @end ifinfo @iftex @comment @finalout @end iftex @titlepage @comment --- おまじない終り --- @comment --- タイトル, バージョン, 著者名, 著作権表示 --- @title n_wishartd @subtitle n_wishartd User's Manual @subtitle Edition 1.0 @subtitle Aug 2016 @author by Masayuki Noro @page @vskip 0pt plus 1filll Copyright @copyright{} Masayuki Noro 2016. All rights reserved. @end titlepage @comment --- おまじない --- @synindex vr fn @comment --- おまじない終り --- @comment --- @node は GNU info, HTML 用 --- @comment --- @node の引数は node-name, next, previous, up --- @node Top,, (dir), (dir) @comment --- @menu は GNU info, HTML 用 --- @comment --- chapter 名を正確に並べる --- @menu * matrix 1F1 の対角領域上への制限パッケージ n_wishartd.rr :: * Index:: @end menu @comment --- chapter の開始 --- @comment --- 親 chapter 名を正確に --- @node matrix 1F1 の対角領域上への制限パッケージ n_wishartd.rr ,,, Top @chapter matrix 1F1 の対角領域上への制限パッケージ n_wishartd.rr @comment --- section 名を正確に並べる --- @menu * matrix 1F1 の対角領域上への制限:: * 制限した関数の数値計算:: * 部分分数係数の微分作用素:: * Runge-Kutta 法の試験的実装:: @end menu このマニュアルでは, asir-contrib パッケージに収録されている, matrix 1F1 が対角領域上で満たす微分方程式系を計算するパッケージ @samp{n_wishartd.rr} について解説する. このパッケージを使うには, まず @samp{n_wishartd.rr} をロードする. @example [...] load("n_wishartd.rr"); @end example @noindent このパッケージの函数を呼び出すには, 全て @code{n_wishartd.} を先頭につける. @comment --- section の開始 --- @comment --- 書体指定について --- @comment --- @code{} はタイプライタ体表示 --- @comment --- @var{} は斜字体表示 --- @comment --- @b{} はボールド表示 --- @comment --- @samp{} はファイル名などの表示 --- @node matrix 1F1 の対角領域上への制限,,, matrix 1F1 の対角領域上への制限パッケージ n_wishartd.rr @section matrix 1F1 の対角領域上への制限 @menu * n_wishartd.diagpf:: * n_wishartd.message:: @end menu @node n_wishartd.n_wishartd.diagpf,,, matrix 1F1 の対角領域上への制限 @subsection @code{n_wishartd.diagpf} @findex n_wishartd.diagpf @table @t @item n_wishartd.diagpf(@var{m},@var{blocks}) @var{m}変数の 1F1 が満たす方程式を, @var{blocks} で指定される 対角領域上に制限した微分方程式系を計算する. @end table @table @var @item return @var{[E1,E2,...]} なるリスト, 各 @var{Ei} は 部分分数を係数とする微分作用素で, 制限した 1F1を零化する. @item m 自然数 @item vars @var{[[s1,e1],[s2,e2],...]} なるリスト. @item options 下の説明参照. @end table @itemize @bullet @item @var{m}変数の 1F1 が満たす方程式を, @var{blocks} で指定される 対角領域上に制限した微分方程式系を計算する. @item @var{blocks} の各成分 @var{[s,e]} は @var{ys=y(s+1)=...=ye} を意味する. このブロックを代表する変数は @var{ye} である. @item @var{blocks} には全ての変数が現れるように指定する. 特に, 一つの変数からなる ブロックは @var{[s,s]} と指定する. @item この関数が常に成功することは証明されていないが, 現在のところ, 各変数ブロックサイズが 36 以下なら成功することは証明されている. @item 出力される微分作用素のフォーマットに関しては @ref{部分分数を係数とする微分作用素} を 参照. @end itemize @example [2649] Z=n_wishartd.diagpf(5,[[1,3],[4,5]]); [ [[[[-1,[]]],(1)*<<0,0,0,0,3,0>>], [[[-2,[[y1-y4,1]]],[-2,[[y4,1]]]],(1)*<<0,1,0,0,1,0>>], [[[9/2,[[y1-y4,1]]],[-3*c+11/2,[[y4,1]]],[3,[]]],(1)*<<0,0,0,0,2,0>>], ... [[[-6*a,[[y1-y4,1],[y4,1]]],[(4*c-10)*a,[[y4,2]]],[-4*a,[[y4,1]]]], (1)*<<0,0,0,0,0,0>>]], [[[[-1,[]]],(1)*<<0,4,0,0,0,0>>], [[[-6,[[y1-y4,1]]],[-6*c+10,[[y1,1]]],[6,[]]],(1)*<<0,3,0,0,0,0>>], [[[5,[[y1-y4,1]]],[-5,[[y1,1]]]],(1)*<<0,2,0,0,1,0>>], ... [[[21*a,[[y1-y4,2],[y1,1]]],[(36*c-87)*a,[[y1-y4,1],[y1,2]]], [-36*a,[[y1-y4,1],[y1,1]]],[(18*c^2-84*c+96)*a,[[y1,3]]], [-9*a^2+(-36*c+87)*a,[[y1,2]]],[18*a,[[y1,1]]]],(1)*<<0,0,0,0,0,0>>]] ] @end example @node n_wishartd.message,,, matrix 1F1 の対角領域上への制限 @subsection @code{n_wishartd.message} @findex n_wishartd.message @table @t @item n_wishartd.message(@var{onoff}) 計算中のメッセージ出力をon/off する. @end table @table @var @item onoff @var{onoff=1} のときメッセージを出力し, @var{onoff=0} のときしない. @end table @itemize @bullet @item 計算中のメッセージ出力を on/off する. デフォルトは off である. @end itemize @node 制限した関数の計算,,, matrix 1F1 の対角領域上への制限パッケージ n_wishartd.rr @section 制限した関数の計算 @menu * n_wishartd.prob_by_hgm:: * n_wishartd.prob_by_ps:: * n_wishartd.ps:: @end menu @node n_wishartd.prob_by_hgm,,, 制限した関数の計算 @subsection @code{n_wishartd.prob_by_hgm} @findex n_wishartd.prob_by_hgm @table @t @item n_wishartd.prob_by_hgm(@var{m},@var{n},@var{[p1,p2,...]},@var{[s1,s2,...]},@var{t}[|@var{options}]) HGM により重複固有値を持つ共分散行列に対する Wishart 行列の最大固有値の 分布関数の値を計算する. @end table @table @var @item return @item m 変数の個数 @item n 自由度 @item [p1,p2,...] 重複固有値の個数のリスト @item [s1,s2,...] 各重複固有値 @end table @itemize @bullet @item 固有値 @var{si} を @var{pi} 個もつ対角行列を共分散行列とする Wishart 行 列の最大固有値 @var{l1}の分布関数の値 @var{Pr[l1j} を満たし, さらに因子は ある一定の順序で整列される. @item @var{f} を上のようなべき積とし, @var{c} を定数とするとき, 単項式にあた る @var{c/f} は @var{[c,f]} で表現される. @var{f=[]} の場合, 分母が 1 であることを意味する. @item 最後に, @var{c1/f1+...+ck/fk} は @var{[[c1,f1],...,[ck,fk]]} と表現され る. ここでも, 各項はある一定の順序で整列される. @item 部分分数を通分して簡約した結果, 0 になることもあることに注意する. @end itemize @node 部分分数係数の微分作用素の表現,,, 部分分数係数の微分作用素 @subsection 部分分数係数の微分作用素の表現 前節の部分分数を用いて, それらを係数とする微分作用素が表現できる. @var{f1,...,fk} を部分分数の表現, @var{d1,...,dk} を分散表現単項式 (現 在設定されている項順序で @var{d1>...>dk}) とするとき, 微分作用素 @var{f1*d1+...+fk*dk} が@var{[f1,d1],...[fk,dk]]}で表現される. @node 部分分数係数の微分作用素の演算,,, 部分分数係数の微分作用素 @subsection 部分分数係数の微分作用素の演算 @menu * n_wishartd.wsetup:: * n_wishartd.addpf:: * n_wishartd.mulcpf:: * n_wishartd.mulpf:: * n_wishartd.muldpf:: @end menu @node n_wishartd.wsetup,,, 部分分数係数の微分作用素の演算 @subsubsection @code{n_wishartd.wsetup} @findex n_wishartd.wsetup @table @t @item n_wishartd.wsetup(@var{m}) @end table @table @var @item m 自然数 @end table @itemize @bullet @item @var{m} 変数の計算環境をセットする. 変数は @var{y0,y1,...,ym}, @var{dy0,...,dym} で @var{y0, dy0} は中間結果の計算のためのダミー変数である. @end itemize @node n_wishartd.addpf,,, 部分分数係数の微分作用素の演算 @subsubsection @code{n_wishartd.addpf} @findex n_wishartd.addpf @table @t @item n_wishartd.addpf(@var{p1},@var{p2}) @end table @table @var @item return 部分分数係数の微分作用素 @item p1, p2 部分分数係数の微分作用素 @end table @itemize @bullet @item 微分作用素 @var{p1}, @var{p2} の和を求める. @end itemize @node n_wishartd.mulcpf,,, 部分分数係数の微分作用素の演算 @subsubsection @code{n_wishartd.mulcpf} @findex n_wishartd.mulcpf @table @t @item n_wishartd.mulcpf(@var{c},@var{p}) @end table @table @var @item return 部分分数係数の微分作用素 @item c 部分分数 @item p 部分分数係数の微分作用素 @end table @itemize @bullet @item 部分分数 @var{c} と微分作用素 @var{p} の積を計算する. @end itemize @node n_wishartd.mulpf,,, 部分分数係数の微分作用素の演算 @subsubsection @code{n_wishartd.mulpf} @findex n_wishartd.mulpf @table @t @item n_wishartd.mulpf(@var{p1},@var{p2}) @end table @table @var @item return 部分分数係数の微分作用素 @item p1, p2 部分分数係数の微分作用素 @end table @itemize @bullet @item 微分作用素 @var{p1}, @var{p2} の積を計算する. @end itemize @node n_wishartd.muldpf,,, 部分分数係数の微分作用素の演算 @subsubsection @code{n_wishartd.muldpf} @findex n_wishartd.muldpf @table @t @item n_wishartd.muldpf(@var{y},@var{p}) @end table @table @var @item return 部分分数係数の微分作用素 @item y 変数 @item p 部分分数係数の微分作用素 @end table @itemize @bullet @item 変数 @var{y} に対し, 微分作用素 @var{dy} と @var{p} の微分作用素としての 積を計算する. @end itemize @example [...] n_wishartd.wsetup(4)$ [...] P=n_wishartd.wishartpf(4,1); [[[[1,[]]],(1)*<<0,2,0,0,0>>],[[[1/2,[[y1-y2,1]]],[1/2,[[y1-y3,1]]], ...,[[[-a,[[y1,1]]]],(1)*<<0,0,0,0,0>>]] [...] Q=n_wishartd.muldpf(y1,P); [[[[1,[]]],(1)*<<0,3,0,0,0>>],[[[1/2,[[y1-y2,1]]],[1/2,[[y1-y3,1]]], ...,[[[a,[[y1,2]]]],(1)*<<0,0,0,0,0>>]] @end example @node Runge-Kutta 法の試験的実装,,, matrix 1F1 の対角領域上への制限パッケージ n_wishartd.rr @section Runge-Kutta 法の試験的実装 @menu * rk_ratmat:: @end menu @node rk_ratmat,,, Runge-Kutta 法の試験的実装 @code{n_wishartd.ps_by_hgm} では, パフィアン行列を計算したあと, 与えられたステップ数で Runge-Kutta 法を実行して近似解の値を計算する組み込み関数 @code{rk_ratmat} を実行している. この関数を, 値が与えられた精度で安定するまでステップ数を2倍しながら繰り返して実行する. @code{rk_ratmat} 自体, ある程度汎用性があるので, ここでその使用法を解説する. @subsection @code{rk_ratmat} @findex rk_ratmat @table @t @item rk_ratmat(@var{rk45},@var{num},@var{den},@var{x0},@var{x1},@var{s},@var{f0}) 有理関数係数のベクトル値一階線形常微分方程式系を Runge-Kutta 法で解く @end table @table @var @item return 実数のリスト @item rk45 4 または 5 @item num 定数行列の配列 @item den 多項式 @item x0, x1 実数 @item s 自然数 @item f0 実ベクトル @end table @itemize @bullet @item 配列 @var{num} のサイズを @var{k} とするとき, @var{P(x)=1/den(num[0]+num[1]x+...+num[k-1]x^(k-1))} に対し @var{dF/dx = P(x)F}, @var{F(x0)=f0} を Runge-Kutta 法で解く. @item @var{rk45} が 4 のとき 4 次 Runge-Kutta, 5 のとき 5 次 Runge-Kutta アルゴリズムを実行する. 実験的実装のため, adaptive アルゴリズムは実装されていない. @item @var{s} はステップ数で, 刻み幅は@var{(x1-x0)/s} である. @item @var{f0} がサイズ@var{n} のとき, @var{num} の各成分は @var{n} 次正方行列である. @item 結果は, 長さ @var{s} の実数リスト @var{[r1,...,rs]} で, @var{ri} は @var{i} ステップ目に計算された 解ベクトルの第0成分である. 次のステップに進む前に解ベクトルを @var{ri} で割るので, 最終的に 解 @var{F(x1)} の第 0 成分が @var{rs*r(s-1)*...*r1} となる. @item 方程式が線形なので, Runge-Kutta の各ステップも線形となることを利用し, 第0成分を1に正規化することで, 途中の解の成分が倍精度浮動小数の 範囲に収まることを期待している. 初期ベクトル @var{f0} の成分が倍精度浮動小数に収まらない場合 は, @var{f0} を正規化してから @code{rk_ratmat} を実行し, 前項の結果に @var{f0} の第 0 成分をかければ よい. @end itemize @example [...] F=ltov([sin(1/x),cos(1/x),sin(1/x^2),cos(1/x^2)]); [ sin((1)/(x)) cos((1)/(x)) sin((1)/(x^2)) cos((1)/(x^2)) ] [...] F0=map(eval,map(subst,F,x,1/10)); [ -0.54402111088937 -0.839071529076452 -0.506365641109759 0.862318872287684 ] [...] N0=matrix(4,4,[[0,0,0,0],[0,0,0,0],[0,0,0,-2],[0,0,2,0]])$ [...] N1=matrix(4,4,[[0,-1,0,0],[1,0,0,0],[0,0,0,0],[0,0,0,0]])$ [...] N=ltov([N0,N1])$ [...] D=x^3$ [...] R=rk_ratmat(5,N,D,1/10,10,10^4,F0)$ [...] for(T=R,A=1;T!=[];T=cdr(T))A *=car(T)[1]; [...] A; 0.0998334 [...] F1=map(eval,map(subst,F,x,10)); [ 0.0998334166468282 0.995004165278026 0.00999983333416666 0.999950000416665 ] @end example @comment --- おまじない --- @node Index,,, Top @unnumbered Index @printindex fn @printindex cp @iftex @vfill @eject @end iftex @summarycontents @contents @bye @comment --- おまじない終り ---