数値関数 †
初等関数 †
ArcCos, ArcCosh, ArcSin, ArcSinh, ArcTan, ArcTanh, Cos, Cosh, Exp, Log, Sin, Sinh, Sqrt, Tan, Tanh, XSin, XSinh †
- SAD には以上の初等関数が備わっています。
- これらは原則として複素数にも適用できます。
- また、これらの関数はリストに対してはその要素に並列に作用します。
- XSin[x]はx-Sin[x]と等価な関数です。
- XSinh[x]はx-Sinh[x]と等価な関数です。
Log †
- Log[z] は zの自然対数。
- Log[a, z] は z の底 a の対数、(=
)。
ArcTan †
- ArcTan[z] (=
)。
- ArcTan[x, y] (=
)、
の間の値をとる。
特殊関数 †
現在までに備えられている特殊関数は以下の通りです。ご覧の通りあまり豊富ではありませんが、実際の要求に応じて整備します。これらは原則として複素数にも適用可能ですが、実数のみに限定されるものもあります。もし、複素数引き数が必要な場合は要求され次第対処します。以下で引き数が u, v, w, z,
で表わされているのものは複素数を受け付けます。また、これらの関数はリストに対してはその要素に並列に作用します。
BesselI †
- BesselI[
, z] = 
BesselJ †
- BesselJ[
, z] = 
BesselJZero †
- BesselJZero[
, z] returns k-th zero of BesselJ[
,0].
Unlike Mathematica, BesselJZero[
,0] returns 0 for n>0 and NaN for n=0.
BesselK †
- BesselK[
, z] = 
BesselY †
- BesselY[
, z] = 
Gamma †
- Gamma[z]:

- Gamma[a, x]:

Factorial †
- Factorial[z] は Gamma[z + 1] と同値です。
LegendreP †
- LegendreP[n,x]は、ルジャンドル多項式
を与える。
- LegendreP[n,m,x]は、同伴ルジャンドル多項式
を与える。
- Packages/D.nで定義されています。
LogGamma †
- LogGamma[z] は定義は Log[Gamma[z]] と同値ですが、計算上、Gamma[z] のオーヴァーフローを避けることができます。
LogGamma1 †
- LogGamma1[z] は定義は Log[Gamma[z + 1]] と同値ですが、計算上、Gamma[z + 1] のオーヴァーフローを避けることができます。
GammaRegularizedQ †
- GammaRegularizedQ[a, x]:

GammaRegularized †
- GammaRegularized[a, x] は GammaRegularizedQ[a, x] と同値です。
GammaRegularizedP †

Erf †
- Erf[z]:

- InverseEr[z]:
Inverse error function
Erfc †
- Erfc[z]:

- InverseErfc[z]:
数値関数 †
SAD には以下の数値関数が備わっていいます。
- Abs, Ceiling, Floor, Max, Min, MinMax, Mod, Negative, NonNegative, Positive, Round, Sign
- この内、Abs, Ceiling, Floor, Round, Signはリストに対してはその要素に並列に作用します。
複素数演算 †
- Arg, Complex, ComplexQ, Conjugate, Im, Re。
Complex †
- Complex[x, y] は複素数 x + y * I を表わします。ここで x、y は複素数でも構いません。
- シンボル I は Complex[0, 1] と同値です。
ComplexQ †
- ComplexQ[式1] は式1 の値が実数でない複素数、あるいは、少なくともひとつの要素がそのような数であるリストの時 True(1) になり、それ以外は False(0) になります。
フーリエ変換 †
Fourier †
- Fourier[リスト1] は複素数から成る リスト1 =
の高速フーリエ変換

を求め、結果を複素数のリストにして返します。ここで N はリスト1 の長さです。N が 2の冪乗でないときには、2の冪乗になるまで後ろに 0 を補ってから変換します。
InverseFourier †
- InverseFourier[リスト1] は複素数から成る リスト1 =
の高速フーリエ変換

を求め、結果を複素数のリストにして返します。ここで N はリスト1 の長さです。N が 2の冪乗でないときには、2の冪乗になるまで後ろに 0 を補ってから変換します。
行列演算 †
以下でべクトルは1階の、行列は2階のリストで表現されます。この場合行列は行べクトルのリストであるとみなします。SAD には以下の行列演算の関数が備わっています。
Eigensystem †
- Eigensystem[行列1] は正方行列 行列1 に対して、{固有値達, 右固有べクトル達} というリストを返します。
Det †
Dot, . †
IdentityMatrix †
- IdentityMatrix[n]は、n x n単位行列を返します。
Inner †
- Inner[積1, リスト1, リスト2, 和1] はリスト1とリスト2の一般化された内積を返します。ここで積1 と 和1 はそれぞれ積と和の役割を果たす関数です。
LinearSolve †
- LinearSolve[行列1, べクトル1] は方程式 行列1 . 解 == べクトル1 の singular value decompositionによる解を求めます。行列1は正方形である必要はありません。
- 線形回帰は LinearSolve で簡単に求めることができます。
- LinearSolve[行列1, べクトル1, Tolerance ->
] は singular value decomposition のしきい値を
に設定して解を求めます。Tolerance のデフォルト値は
です。
- Packages/Matrix.nで定義されています。
Outer †
- Outer[積1, リスト1, リスト2, ...] はリスト1, リスト2, ...の一般化された外積を返します。ここで積1 は積の役割を果たす関数です。
- リスト1, リスト2, ... の頭部は List でなくても構いませんが、頭部の一致は必要です。
SingularValues †
- SingularValues[行列1] は行列1の singular value decomposition を求めます。
- SingularValues[行列1] はリスト {u, w, v} を返しますが、行列1の実効的逆行列は Transpose[v] . DiagonalMatrix[w] . u で表わされます。つまり、べクトル w は singular values の実効的逆数のリストです。
- SingularValues[行列1, Tolerance ->
] は singular value decompositionのしきい値を
に設定します。Tolerance のデフォルト値は
です。
- 詳しくは Packages/Matrix.nとsrc/tfdot.f (subroutine tfsingularvalues)を参照してください。
- ここで「実効的逆数」とは、ある singular value を
、最大の singular value を
とした時、
で表わされる量です。
Transpose †
- Transpose[行列1] は行列1 の転置行列を返します。
疑似乱数 †
2008/02/24以降の実装は以下の通り。
- Random関数ファミリーのフロントエンド src/tfRandom_.c
- 疑似乱数発生器フレームワーク src/random_driver.[ch]
- 標準の疑似乱数発生器プラグイン src/random_plugin_sad.c
- 追加の疑似乱数発生器プラグイン集 extensions/RandomMT/
Random †
- Random[] は0と1の間の一様擬似乱数を返します。
- Random[n] は0と1の間のn 個の一様擬似乱数達をリストにして返します。
- Random[n1, n2, ...] は0と1の間の一様擬似乱数達を、各階数の要素数がn1, n2, ... になるテンソルにして返します。後のインデクスほど速く動きます。
GaussRandom †
- GaussRandom[] は平均値0、分散1の正規擬似乱数を返します。
- GaussRandom[n] は平均値0、分散1のn 個の正規擬似乱数達をリストにして返します。
- GaussRandom[n1, n2, ...] は平均値0、分散1の正規擬似乱数達を、各階数の要素数がn1, n2, ... になるテンソルにして返します。後のインデクスほど速く動きます。
- 絶対値がシンボル GCUT の値を上回るものは排除されます。GCUT=3とすると3
以上の値は落とされます。GCUT の初期値は
です。
PRNG (Psuedo-Random Number Generator) †
- いわゆる疑似乱数発生器のこと。
- SADでは、好みにより疑似乱数発生器を使い分けることが可能である。
- Defaultではインストールされないが、メルセンヌ・ツイスターにより高品質な乱数も使うことが出来る。
ListRandom[] †
- 使用可能な PRNG(Pseudo-Random Number Generator) pluginのリストを返す。
- PRNG(Pseudo-Random Number Generator) pluginでのサポートは必須である。
ParabolaRandom[] †
SeedRandom †
- SeedRandom[] はその時点の擬似乱数の種を含めてリストとして返します。
- 返されるリストの中には、現在のPRNG(Pseudo-Random Number Generator) pluginの内部状態、並びに、選択中のPRNG pluginの内部状態を含む。
- SeedRandom[expr]は乱数系列をexprに切り換える。
- SeedRandom[奇数1] は擬似乱数の種を 奇数1 に設定します。奇数1 の絶対値は
を越えません。
UniformRandom[] †
UniformRandom0[] †
- 区間[0,1)の均一分布乱数を返します。
- Random[]の別名
- PRNG(Pseudo-Random Number Generator) pluginでのサポートは必須である。
UniformRandom1[] †
UniformRandom01[] †
方程式の近似解 †
FindRoot †
- FindRoot[式1 == 式2, {未知数1, 初期値1}, {未知数2, 初期値2}, ..., オプション] は方程式 式1 == 式2 の近似解を 未知数1、未知数2, ... を未知数として求めます。未知数1, ... はシンボルで、 式1 == 式2 の中にあからさまに現われなければなりません。
- 未知数1、未知数2, ... の初期値は 初期値1 ... で指定されます。
- FindRoot は結果を {未知数1 -> 解1, ... } というリストで返します。
- FindRoot[x == Cos[x], {x, 0}] ⇒ {x -> .739085133215161}。
- FindRoot[{式11 == 式12, 式21 == 式22, ... }, {未知数1, 初期値1},
{未知数2, 初期値2}, ..., オプション] は連立方程式の近似解を求めます。
- 各未知数の指定を {未知数, 初期値, {下限値, 上限値}}のようにすると、未知数の検索範囲を制限することができます。
- FindRoot はニュートン法を基本に解を探します。
- 解が存在しない場合は残差の2乗和の極小値を解として返します。
- FindRoot には次の表のオプションがあります。
FindRootオプション
| オプション | 値 | デフォルト値 | 効果 |
| AccuracyGoal | 数値 |  | 2乗残差の両辺の2乗の最大値に対する相対精度 |
| MaxIterations | 数値 | 50 | 探査中に方程式を評価する最大回数 |
非線形回帰 †
Fit †
- Fit[リスト1, 式0, シンボル0, {パラメータ1, 初期値}, ... , オプション] はリスト1 で表わされるデータ点に対して、パラメータ1, ... を動かして式0 の
-Fit を求めます。
- 式0 はシンボル0, パラメータ1, ... をあらわに含む式です。Fit の二番目以降の引き数は前もって評価されないため、そのような「あらわに含む式」を得るためにここに Evaluate[式00] と書かねばならないことがあります (Evaluate[]を参照)。ここで 式00 は 式0 を結果としてもたらす式です。
- 各パラメータを {パラメータ, 初期値, {下限値, 上限値}} とするとそのパラメータの検索範囲を制限することができます。
- リスト1 は {{x1, y1,
y1, {x2, y2,
y2}, ...} という構造です。三番目の数値はエラーバーの大きさで、
の重みとなります。
- 各データ点の三番目の数値は指定する場合は全てのデータ点に対して指定しなければなりません。
- 各データ点の三番目の数値がない場合は各点の重みは均等になり、エラーバーの大きさは
が Fit の結果に一致するように決まるものとします。
- リスト1 のデータの構造は ListPlot[]と共通です。
- FitPlot[]により結果をグラフ表示できます。
- Fit は シンボル -> 値 という規則のリストを結果として返します。ここでシンボルの意味は以下の表に示します。
- Packages/Fit.nで定義されています。
Fitの結果を表すシンボル。ここでn,mはそれぞれデータ点、パラメータの数を表わします。
| シンボル | 値 | 意味 |
| パラメータ1, ... | 実数値 | 各パラメータの最適値 |
| ChiSquare | 実数値 |  |
| GoodnessOfFit | 実数値 |  |
| ConfidenceInterval | 要素数 m のリスト | パラメータ1, ... の推定域 |
| Covariancatrix | m m 行列 | 共分散行列 |
PolynomialFit †
- PolynomialFit[a_List,n_Real]はリストaで表されるデータ点に対してn次多項式でfitします。
- 返り値は{{c0,c1,...,cn},{Residual->res}}のようなリストで返ります。
- c0,c1,...,cnは多項式
の係数です。resはfitの残差です。
- Packages/Fit.nで定義されています。
Spline †
NIntegrate †
- NIntegrate[]は実数および複素数関数の数値積分を行った値を返します。
Usage: NIntegrate[f, {x, x0, x1}, options]
- 但し、fは独立変数xをexplictに含む関数である必要がある。
- 注意点
- 数値積分NIntegrate[]は、台形公式もしくは3次スプライン補間(default)を使った数値積分を行っていますが、スプライン補間の場合、端点の導関数を仮定しているために精度が上がりません。
- 解析関数の周期積分や急減少解析関数の無限区間積分の場合は、Spline->Falseにて台形公式を使うことを推奨します。
- SAD Cluster上では、Library@Require["Math/NIntegrate"]でRomberg積分で実装されたNIntegrate[]を使うことが出来ます。
- MAIN trunk 1.0.10.4.15a以前、並びにamorita branch r3657以前は台形公式の実装自体が間違っているので、Splice->Falseは使い物になりません。
- Options
- 以下のオプションを取る事が出来る。
- AccuracyGoalはRelative accuracyでdefault値は AccuracyGoal->1e-13
- InitialPoints は積分する際に積分区間の分割数の初期値。default値は20個。
- Spline->True or False
関数の最小化 †
DownhillSimplex[] †
- DownhillSimplex[]はNelder-Mead法を用いた最適化を行った結果を返します。
- N次元の引数の関数の最小値解を得る場合に、初期状態ではN+1個の点からなる多面体、すなわち単体を選ぶ、これを逐次的に改良することで、最適解を得る。
- 関数の導関数が分からなくても、関数値だけ分かれば適用できる。しかし、回数が多く掛かる欠点がある。
- N+1個の点の中で関数値が最大である点を、残りN個の点が定める超平面の逆側に、単体の体積を保存したまま移動させる。
- 移動後の点が最良点よりよければ、移動幅を大きくする。
- 谷状になっていることが検出されれば、移動幅を小さくする。
- 最適値に近づいているようならば、単体の体積を縮小する。
- 呼び出し方:DownhillSimplex[initial,f,MaxIterations->100];
- Packages/optimize.nで定義されている。
- Options
- VariableRange->{min1,min2,...,minn},{max1,max2,...,maxn}}. defaultはマイナス無限大からプラス無限大まで。
- MaxIteration->nで最大のイタレーション回数を指定する。defaultはMax[100, 10*(n+1))].
- Output->fn 途中結果を出力するファイルナンバーを指定する。defaultは6です。
- Tolerance->tol local minimumかどうか判断するtolerance値を指定する。もし、(fmax-fmin)/(abs(fmax)+abs(fmin))がtol値より小さくなれば、iterationループを終える。
defaultは1E-6である。
- 初期値は上昇順にソートしたものを与える必要がある。
Example
- r1,r2,r3,r4のパラメータが与えれるので与えられたパラメータに対するsimulation結果を与える。
FFS;
d0={{-11.5, {-14,-35,-17.5,-20},
{-18.0, {-14,-20,-17.5,-40},
{-18.5, {-14,-40,-15.0,-40},
{-22.8, {-15,-20,-15.0,-20},
{-22.4, {-15,-40,-15.0,-40}};
initial=Sort[d0]; ! 初期値はSortしておく
f=[{r1_,r2_,r3_,r4_}]:=(Print["r=",{r1,r2,r3,r4}];Read[5,Real]);
! 関数値を端末入力待ちになる。
! この代わりにsimulation結果を入れてやれば良い。
result=DownhillSimplex[initial,f,MaxIteration->5];
end;
<実行例>-----------------------------------------------------------------
r={-15,-25,-13.75,-10} ! この変数に対応する関すうちが要求されている。
-20 ! 端末から値を入力
{ -22.80000, -22.40000, -20.00000, -18.50000, -18.00000} ! 1回目の更新
r={-15.5,-42.5,-11.875,-35}
-17 ! 端末から値を入力
r={-14.375,-25.625,-16.09375,-23.75}
-23 ! 端末から値を入力
{ -23.00000, -22.80000, -22.40000, -20.00000, -18.50000} ! 2回目の更新
r={-15.6875,-15.3125,-14.921875,-6.875}
-25 ! 端末から値を入力
r={-16.53125,-2.96875,-14.8828125,9.6875}
-30 ! 端末から値を入力
{ -30.00000, -23.00000, -22.80000, -22.40000, -20.00000} ! 3回目の更新
r={-15.453125,-19.296875,-16.73828125,-27.03125}
-19 ! 端末から値を入力
r={-15.11328125,-23.57421875,-14.4970703125,-14.2578125}
-29 ! 端末から値を入力
{ -30.00000, -29.00000, -23.00000, -22.80000, -22.40000} ! 4回目の更新
r={-15.509765625,3.916015625,-15.23681640625,15.83984375}
-31 ! 端末から値を入力
r={-15.7646484375,25.8740234375,-15.355224609375,43.759765625} ! 5回目の更新
!MaxIterations->5なのでこれで終了
end;
In[2]:= result
Out[2]:= {{-31,{-15.509765625,3.916015625,-15.23681640625,15.83984375}},
{-30,{-16.53125,-2.96875,-14.8828125,9.6875}},
{-29,{-15.11328125,-23.57421875,-14.4970703125,-14.2578125}},
{-23,{-14.375,-25.625,-16.09375,-23.75}},{-22.8,{-15,-20,-15,-20}}}
In[3]:=
Example2
f:=Apply[Function[{x,y},((x^2+y^2)-1)*(x^2+y^2)-(x-.5)/3.],#]&; ! 関数を定義する
v={{1.,1.},{0.,-1.},{0.,1.}}; ! 初期値
limit={{-0.5,-1.5},{0.65,1.5}}; ! 探索範囲を指定
p=Sort[Map[{f[#],#}&,v]]; ! 初期値をソートする
DownhillSimplex[p,f,MaxIteration->100,
Tolerance->1e-4,VariableRange->limit]; !極小値を探索する