Notes on Mathematica

 

Mathematicaでprogramを組むために基本となる知識をまとめる。本ノートではプログラミングの基本のページの知識が仮定されている。『Wolfram言語&システム|ドキュメントセンター』に目次がありF1で開くので困ったらF1を押すとよい。

構文 [外部リンク]

方程式 [外部リンク]

一つの関係子を含む文字列をと呼ぶ。特に数式が等号=で結ばれているものを方程式と呼ぶ。一般に、文は条件文と命題文の2つからなり、少なくとも一つの未知変数を含む文を条件文と呼び、一つも未知変数を含まずTrueかFalseの二値の値が定まる文を命題(文)と呼ぶ。Mathematicaのおける方程式では、条件文には=が用いられ、命題には==が用いられるが、条件文における=は変数への代入を意味する。

定義する: ① = ② := [外部リンク]

(即決代入): =を用いた等式を実行(Shift+Enter)すると直ちに右辺が評価され左辺にその値が代入される。

(遅延代入): :=を用いた等式を実行した場合、実行した時点ではその等式は評価されず、後で左辺が呼び出された度に右辺が評価され左辺に代入される。

置換する: ① ReplaceAll /. ② ReplaceRepeated //. [外部リンク]

式の文末に置換規則とともに付け加えることで発動される。①置換を一度だけ行う場合には、式 /. 置換規則 を、②変化がしなくなるまで置換を繰り返す場合には、式 //. 置換規則 を用いる。演算子化するには、①ReplaceAll[置換規則]、②ReplaceRepeated[置換規則]とする。

置換規則: ① -> ② :> [外部リンク]

(即決置換): ->を用い置換規則を実行(Shift+Enter)すると直ちにその右辺が評価され左辺が右辺に入れ替わる。

(遅延置換): :>を用いた置換規則を実行した場合、実行した時点ではその規則は実行されず、後で置換規則が呼び出される度に左辺が右辺に置き換わる。

式 /. x->a ⇆ 式//ReplaceAll[x->a]

式の中にあるxを全てaに置き換える。

式 //. {x_}:>x

式の外側に出てくる余分な括弧を外す。

制限処理(制限用法): /; [外部リンク]

ある変数を含む遅延条件文やパタンなどの直後に/;とともにその変数に関する別の条件文(判定文)を書くことで、判定文がTrueを返す場合にだけその遅延条件文やパタンを制限することができる。

(SY comment)
英語における(commaを伴わない)whichの制限用法と同じである。条件文の命題化とも呼ぶことにする。

遅延条件文を制限する: lhs:=rhs /; 判定文

判定文を評価した結果がTrueとなった場合に限りこの遅延文が実行される。

遅延置換規則を制限する: lhs:>rhs /; 判定文

判定文を評価した結果がTrueとなった場合に限りこの遅延規則が実行される。

パタンを制限する: _/; 判定文

判定文を評価した結果がTrueとなる場合のパタン_に限る。

パタン [外部リンク]

部分クラス(subclass)の非特定の要素のことをパタン(pattern)と呼ぶ。(➡ pythonノート/オブジェクト参照)

(SY comment)
パタンはスロット(slot)と読んだほうが馴染みやすいが、MathematicaではSlotは純関数を構成する際のスロット(#)に対してその呼び名が与えられているので本ノートでもこの語法に従う。

パタンを判定する クラスQ

パタンがマッチする(⇄部分クラスに属する)かどうかをTrue/Falseの2値で判定する。True/Falseの2値を返す関数のことを判定関数と呼ぶ。

組み込みパタン判定関数
判定関数 Trueを返す場合 例、補足
EvenQ[式]/OddQ[式] 式が偶数/奇数である場合。
IntegerQ[式]/PrimeQ[式] 式が整数/素数である場合。
NumberQ[式]/NumericQ[式] 式が数/数値である場合。 NumberQ[Pi]/NumericQ[Pi](*->False / True*)
ListQ[式] 式がリストである場合。
ArrayQ[式] 式が完全配列である場合。 ArrayQ[{1,2,3}]⇄ True, ArrayQ[{1,2,{3}}]⇄ False, ArrayQ[{{1,2},{3}}]⇄ False, ArrayQ[{{1,2},{3,4}}]⇄ True,
VectorQ[式《,NumericQ》]/MatrixQ[式《,NumericQ》] 式が《数値》ベクトル/《数値》行列である場合。 VectorQ/MatrixQはArrayQの特殊な場合である。
PolynomialQ[式,{x1,x2,...}] 式がx1,x2,...の多項式である場合。
OrderedQ[リスト] リストの成分が標準的な並び順で配置されている場合。
MatchQ[式,型] 式が型にマッチする場合。
MemberQ[式,型] / FreeQ[式,型] 式の中に型にマッチするものがある/ない場合。
StringMatchQ[字列,型] 字列が型にマッチする場合。
StringContainQ[字列,型] / StringFreeQ[字列,型] 字列の中に型にマッチするものがある/ない場合。

パタンを作る: ① Blank _ ② BlanckSequence __ ③ BlanckNullSequence ___ [外部リンク]

名前を持たない純パタンを作る場合には_をそのまま用い、名前をもつパタンを作る場合にはその名前を表す記号(symbol)の後に_を付け加える。_の数でそのパタンの性質を変化させることができ、①任意の一つの式、②1つ以上の式の列(","で区切られた式)、③0個以上の式の列、を表す。

パタンや変数の型を制限する: ① _/; 判定文 ②_?判定関数 ③_型集合 [外部リンク]

_の後に①条件文②二値関数③型集合を書くことでパタンを制限できる。この場合_の意味は数学記号の∈と等しい。

①(判定文による制限): パタンの後に/;と判定文を書く。 (➡ パタンに対する制限)。
ex) x_/; IntegerQ[x] (*パタンxを整数に制限する*)

②(二値関数による制限): パタンの後に?とTrue/Falseの二値のどちらかをとる判定関数を引数無しで書く。 (➡ [外部リンク])
ex) x_?IntegerQ (*パタンxを整数に制限する*)

この文法において、①の判定関数が一般の場合に純関数化して用いても必ずしもうまくいくとは限らない。(下の例)

③(型集合による制限): パタンの後に型集合を書く。特に、パタンの後に記号を書くとその記号を先頭に持つ任意の式を表すことが出来る。 (➡ [外部リンク])
ex) x_Integer (*パタンxを整数に制限する*)

型集合による制限
パタン指定 型の意味 例、補足
_記号, _Integer, _Real, _Complex, _List, _Symbol 記号を先頭にもつ関数型, 整数型, 実数型, 複素数型, リスト型, 代数記号型
_型集合?判定関数

型集合による制限と判定関数による制限は両立可能である。例えばx_Integer?Positiveで正の整数にxは制限される。

パタンxを型が含まないものに制限する

x_/;FreeQ[x,型]のように記述する。このときx_?FreeQ[#,型]&と書いてもうまくいかない。

パタンにデフォルト値を与える

パタン:xと書くことでパタンが省略された場合にはxが代わりに代入される。
ex) f[x_, y_:0] := {x, y} ; f[a, b] (*⇄ {a,b} *) ; f[a] (*⇄ {a,0} *)

どれかのパタン: Alternatives |

Alternatives[パタン1,パタン2, ...]パタン1|パタン2| ...によってパタン1、パタン2、...のどれかを表すことが出来る(パタンにおけるor表現)。
ex) Alternatives[リスト] (* リストの成分のうちのどれかのパタン *)

パタンを繰り返す: ①Repeated .. ②RepeatedNull ...

同じ表現がcomma(,)で区切られながら繰り返された表現をすることが出来る。

繰り返しパタン表現
表現 解説 例、補足
Repeated[パタン] ⇄ パタン.. パタンが1つ以上繰り返された表現を表す。 {f[_]..} ⇄ {f[_]},{f[_],f[_]}, ...
Repeated[パタン,max] パタンが1個以上max個以下繰り返された表現を表す。
Repeated[パタン,{min,max}] パタンがmin個以上max個以下繰り返された表現を表す。
Repeated[パタン,{n}] パタンが丁度n個繰り返された表現を表す。 {Repeated[f[_],{3}]} ⇄ {f[_],f[_],f[_]}
RepeatedNull[パタン] ⇄ パタン... パタンが0個以上繰り返された表現を表す。 {f[_]...} ⇄ {},{f[_]},{f[_],f[_]}, ...
RepeatedNull[パタン,max] パタンが0個以上max個以下繰り返された表現を表す。
RepeatedNull[パタン,{min,max}] パタンがmin個以上max個以下繰り返された表現を表す。

リストからあるパタンを満たす成分を取り出す/取り除く: ① Cases / DeleteCases ② -> Nothing ③ Except

①リストからパタンに合うものを取り出す/取り除く場合には、Cases[リスト,パタン] / DeleteCases[リスト,パタン]とする。これらは演算子型をもち後置作用が可能。リスト//Cases[パタン] / リスト//DeleteCases[パタン]

②パタンに合うものを取り除く場合には、規則を使ってリスト/.パタン->Nothingとすることも可能。Nothingはリストや連想配列の中で自動的に削除される要素。

③以上の操作を逆に行いたければ補パタンExceptを用いる。

それ以外のパタン(補パタン): Except

Except[除外パタン《,一致パタン》]により《一致パタンには一致するが》除外パタン以外にマッチするパタンを表す。

< リストから整数を削除する >

{1,b,f[1],4}//Cases[Except[_Integer]] ⇆ {1,b,f[1],4}//DeleteCases[_Integer] ⇆ {1,b,f[1],4}/._Integer->Nothing ⇆ {b,f[1]}

複文

条件分岐文

If文

判定文を評価して真の場合と偽の場合とで異なる式を実行しその値を返す。If文はネスト(入れ子に)出来る。

< If文の基本的構造 >

If[判定文, 真のとき実行される式, 偽のとき実行される式]

Which文

判定文iを順番に評価して最初に真になった直後の式iを実行しその値を返す。 場合分けが多い場合にはIfよりも便利である。

< Which文の基本的構造 >

Which[判定文1, 式1, 判定文2, 式2, ...]

Swhich文

式と型iを順に比較して最初にマッチした直後の式iを実行しその値を返す。

< Swhich文の基本的構造 >

Swhich[式,型1,式1,型2,式2, ...]

繰り返し文 (loop sentence)[外部リンク]

同じ処理を繰り返すことができる。

< 1から50までを順に掛ける >

ans=1;For[i=1,i<=50,i++,ans*=i] (*1から50までを順に掛ける*)

ans=1;i=1;While[i<=50,ans*=i;i++]

ans=1;Do[ans*=i,{i,1,50}]

(SY comment)
YITPで行われたMathematica講習では複文は計算が遅くApply[Times,Table[i,{i,1,50}]]のように複文を使わないほうが速い、という説明を受けた。(➡計算の高速化)

For文

カウンタ変数が条件を満たすと、カウンタ変数を更新し、operationを実行する。

< For文の基本的構造 >

For[カウンタ変数の初期化, カウンタ変数の満たす条件, カウンタ変数の更新文, operation ]

While文

カウンタ変数が条件を満たしている間はoperationを実行する。

< While文の基本的構造 >

While[カウンタ変数の条件, operation, カウンタ変数の更新文]

Do文

Sumと同じ記法でoperationを実行することが出来る。

< Do文の基本的構造 >

Do[operation,{カウンタ変数,min,max}]

リスト=配列 [外部リンク]

リストとは入れ子可能なベクトルである。すなわち、リストのリストを考えることもでき、外側でn個中括弧に囲まれた成分の位置を第nレベルという。

リストを作る

リテラル構成/抽出的構成 List, { }

系統的構成 Table, Array, ...

Table/Arrayは関数の引数を明示的にして/せずにリストを作る。

< リスト構成 >
表現 解説 例、補足
Table[式,{変数1《,min1》,max1《,d1》},{変数2《,min2》,max2《,d2》},...] 式の中の変数kを《dkをステップとして》1《mink》からmaxkまで動かしたリストを作成する。 dim次元の半対称行列:Table[Sign[i-j] mat[i,j],{i,dim},{j,dim}]
Array[関数,n《,0》]
⇄ Table[関数[変数],{変数《,0》,n《-**》}]
関数[変数]を要素とする《0を指標の始点とする》長さnのリストを作成する。 Array[f,5,-1]⇄ {f[-1],f[0],f[1],f[2],f[3]}
Array[関数,{n1,n2,...}《,{0,0,...}》]
⇄ Table[関数[変数1,変数2,...],{変数1《,0》,n1《-**》},{変数2《,0》,n2《-**》},...]
関数[変数1,変数2,...]を要素とする《{0,0,...}を指標の始点とする》長さn1*n2*...でネストしたリストを作成する。 Array[f,{2,2}]⇄{{f[1,1],f[1,2]},{f[2,1],f[2,2]}}
ConstantArray[要素,{n1,n2,...}]
⇄ Array[要素&,{n1,n2,...}] 
要素を長さn1*n2*...でネストしたリストを作成する。 ConstantArray[0,{3,3}]⇄Array[0&,{3,3}]⇄{{0,0,0},{0,0,0},{0,0,0}}
SparseArray[{位置1->値1,位置2->値2,...}] 位置iが値iをもつ以外は0になるリストを作成する。 SparseArray[{{i_,i_}->1},{d,d}]⇄IdentityMatrix[d]
CoefficientArrays[多項式,{変数1,変数2,...}] 多項式の変数1,変数2,...の係数の配列を与える。
初等行列の定義

a行b列のみが1でそれ以外が0となるdim次元行列は、mat[a_,b_]:=Table[KroneckerDelta[a, c] KroneckerDelta[b, d], {c, 1, dim}, {d, 1, dim}]で定義できる。

成分を調べる

パタン判定の他にもリスト標準演算として成分を調べる組み込み関数を使ってリストの成分を調べることが出来る。

< 成分調査 >
表現 解説 例、補足
リスト[[n]] ⇆ Part[リスト,n] リストの第n成分を返す。 リストを式にすると式の第n項を返す。
Extract[式,リスト] ⇆ 式//Extract[リスト] 式からリストで指定される位置にある部分を抜き出す。 Extract[{a,b,c},{2}]⇄ b
Length[リスト] リストの長さを返す。
Reverse[リスト] リストを逆順にする。
Count[リスト,型] リストの中に型が現れる回数を与える。
Position[リスト,型] リストの中で型が現れる場所を返す。

成分の変更操作

成分の変更操作
表現 解説 例、補足
Insert[リスト,要素,n] リストの第n成分に要素を足したものを返す。
Append[リスト,要素]/Prepend[リスト,要素] リストの末尾/先頭に要素を足したものを返す。
AppendTo[リスト,要素]/PrependTo[リスト,要素] リストの末尾/先頭に要素を足したものを返した後にリストを変更する。 AppendTo[X,a] ⇆ X=Append[X,a]
Delete[リスト,n] ⇆ リスト//Delete[n] リストの第n成分の成分を取り除く。 最後の成分は第-1成分で指定できる。パタンによって削除することもできる。
DeleteDuplicates[リスト] リストから重複するものをすべて削除する。 SortをしないUnionに等しい。
Join[リスト1,リスト2,...] リスト1,リスト2,...を連結したリストを返す。 ⇆ リスト1~Join~リスト2~...
Union[リスト1,リスト2,...] リスト1,リスト2,...を連結し重複する成分を除去してかつ正しく並び替えたリストを返す。 ⇆ DeleteDuplicates[リスト1,リスト2,...]//Sort
Transpose[リスト] リストの最初の2つのレベルを転置する。 Transpose[リスト] ⇆ Transpose[リスト,{2,1}]
Transpose[リスト,{n1,n2,...}] リストの第kレベルが第nkレベルになるように転置する。 リスト[[a1,a2,a3]]=T_{a_1a_2a_3}と書くと、Transpose[リスト,{s1,s2,s3}]=T_{a_{s1}a_{s2}a_{s3}}。

テンソル [外部リンク]

リストのうち成分の階数が系統的に現れるものをテンソルと呼ぶ。

自前テンソル算プログラム

  1. 縮約する添字のクラスclassQと縮約しない添字のクラスExcept[classQ]を分ける。例えば縮約するdummy添字は頭文字を統一し、縮約されない添字はこの頭文字を持たないよう定義する。ここでは縮約する添字は必ずaから始まるものとする。
  2. 現れる縮約の添字には一つ一つ異なる縮約する足のクラスの変数a1,a2,...を導入する。一つの項で添字が縮約されている場合、その添字の数はその項の中で必ず2つだけになるようにコーディングする。
  3. 縮約された変数をもつ項を縮約変数をなるべく用いない式で書き変える規則を作る。具体的には、KroneckerDeltaとして別にdeltaを用意し、rule={delta[i_?Except[classQ],i_Except[classQ]]->1,delta[a1_?classQ,a1_?classQ]->dim,delta[a1_,a2_?classQ] f[a2_classQ]->f[a1]}などを作る。
  4. 規則を適用し続け簡単化する。
  5. 計算の一番最後に各項で異なる縮約添字をなるべく統一した縮約添字で書き直す。

縮約計算の注意点は、すでに縮約のあるテンソルを定義しその積を考えると一つの項に縮約される同じ添字が2つ以上現れてしまう場合がある。これを避けるために、縮約がある場合には常に縮約規則を適用してできるだけ縮約添字が現れないようにテンソルを定義しておく。これができない場合には、そのテンソルを定義する際縮約する添字も引数に持たせておき、そのテンソルが現れるごとに違う縮約添字を使うようにする。

m個の変数で作られているn階対称テンソルTを簡略化する

標準的な順序になっている足をもつテンソルだけに置換する規則を作る。

  1. m個の変数のセット{x1,x2,...,xm}から作られるちょうどn個からなる(重複を許した)組み合わせを全て生成する。
    a1=Permutations[{x1,x2,...,xm},{n}]
  2. その組み合せのうち、標準的な順序に並んでいるものだけを拾い出す。
    a2=Cases[a1,{x1_,x2_,...,xn_}/;OrderedQ[{x1,x2,...,xn}]]
  3. 標準的順序になっているテンソルのリストを構成する。
    a3 = T @@@ a2
  4. 構成したリストa3それぞれの要素に対し、標準的順序ではない足をもつテンソルを生成し、それを標準的順序の足をもつテンソル置き換える規則を作る。
    Do[p = a3[[i]] // Permutations // DeleteCases[a3[[i]]]; ans = {}; ans = ans~Join~{(# -> a3[[i]]) & /@ p}, {i, Length[a3]}]
  5. レベルを平坦にしておく。
    ans// Flatten

mathematicaでは式を構成するための種々の部品(組み込み演算子)が用意されている。(➡ [外部リンク])

割り算を使いたい: Quotient[m,n((,d))]/Mod[m,n((,d))]

mをnで割った商/剰余を(($ d \leq m -n Quotient[m,n,d] < d+n $ / $ d \leq Mod[m,n,d] < d+n $の範囲で))与える。

円環状に並ぶオブジェクトや準周期関数を帰納的に組み込む

(Circular quiverなど)円環を構成する集合をCとすると、円環を構成する元xに対しf[x_]=Mod[x,Length[C],1]を使ってラベルしておくとよい。Length[C]は円環を構成する集合の長さである。これは準周期関数を定義する際にも応用できる。

式の中で引数を偶数/奇数にして簡略化する

Simplify[式,Assumptions->Mod[引数,2]==0/1]とする。

式を調べる

式変形操作
表現 解説 例、補足
Length[式] 式の項の数を返す。
Part[式,n] ⇆ 式[[n]] 式のn番目を取り出す。 多項式の第n番目の項を取り出したい場合には前もってExpandしておく。

式を変形する [外部リンク]

式変形操作
表現 解説 例、補足
Expand[式]/ExpandAll[式] 式の積とベキ乗の項を展開する/式の全ての部分をExpandする。
PowerExpand[式] べき乗の指数を展開する。 (xyz)p//PowerExpand (*⇄ xpypzp *), Sqrt[xy]//PowerExpand (*⇄ Sqrt[x]Sqrt[y] *)
ComplexExpand[式] すべての変数が実数からなると前提した上で式を展開する。 Sin[x+Iy]//ComplexExpand (*⇄ Cosh[y] Sin[x] + I Cos[x] Sinh[y] *)
Factor[式] 式を因子の積の形に変換する。
Together[式] 式を通分し単一分数にまとめる。
Apart[式] 式を簡単な形の分母を持った複数の分数項に展開する。
Cancel[式] 式において分母と分子の共通因子を約分する。
Collect[式,x] xの同じ次数の項をまとめる。

式操作

分配法則 Distribute

関数の作用
表現 解説 例、補足
Distribute[関数[式1,式2,...]] 各式に関数を分配する。 Distribute[f[a+b,c+d]] ⇆ f[a,b]+f[a,d]+f[b,c]+f[b,d]

Thread

Listable属性を持つ関数はリストに対して自動的にThread作用する。

Thread[関数[リスト]《,h》]

リスト《に現れる頭部hを持つオブジェクト》に関数を適用する。

Thread[リストの式]

リストの式から式のリストを構成する。

写像関数

構成法

関数の作用は大括弧[]を使って一般にf[x,y,...]のように表現することができる

後置作用 f[式] ⇆ f @ 式 ⇆ 式 // f

一つの式に作用させる場合、@を用いたり後置作用//で書くことができる。

演算子化

パラメータ付きpの関数や作用素fを定義する場合、f[x_,p_]:=...と定義するのではなくf[p_][x_]:=...で定義しておくと、後置作用x//f[p]が使えるようになり便利。

条件付き関数定義

例として、$f(x)=-1 /; (x\leq-1), /; x^3 /; (-1 \leq x\leq1), /; 1 /; (1\leq x)$を定義する。条件指定の方法は複数ある。

(I) 制限処理/;を用いる

①変数型指定

f[x_/; x<-1]:= -1;
f[x_/; -1 <= x || x<=1 ]:= x^3;
f[x_/; 1<x]:= 1;

(II) 条件分岐文を使う

①If文をnestする。

f[x_]:=If[x<-1,-1,If[-1<=x||x<=1,x^3,1]]

名前のない関数を構成する ➡ 純関数: Function &

プログラムを作るときには一度しか使わない関数などは(globalな)名前を与えずに、localに定義してその場だけ使えるようにしたい。そのような場合には純関数が役に立つ。純関数の構成法は以下の通り。
①関数Functionの中に局所変数を指定し、それを使って関数を構成する。
②局所変数はスロット#を使うことで代用できる。複数スロットを使う場合には#1,#2,...と番号を振ることができる。
③スロットを使った場合、Functionを書かずに、式の最後に&をつけることで構成することもできる(純関数化)。

< $x^2$の純関数 >

① Function[x,x^2]  ⇆  ② Function[#^2]  ⇆  ③ #^2&

< $x^3+y^2$の純関数 >

① Function[{x,y},x^3+y^2]  ⇆  ② Function[#1^3+#2^2]  ⇆  ③ #1^3+#2^2&

複雑な値を成分にもつリストに純関数を作用させる: ##

例えば2つの区間{{x1,a1,b1},{x2,a2,b2}}に純関数hoge[f,#]&を作用しても第一区間にしか作用してくれない:

hoge[f, #] & @@ {{x1, a1, b1}, {x2, a2, b2}} (* -> hoge[f, {x1, a1, b1}] )

このようなときはスロットを2重(##)にするとちゃんと作用してくれる:

hoge[f, ##] & @@ {{x1, a1, b1}, {x2, a2, b2}} (* -> hoge[f, {x1, a1, b1}, {x2, a2, b2}])

リストのそれぞれの要素に同じ操作を施す、リストのそれぞれの要素でラベルされる演算を定義する

  1. リストが一変数だとした場合のプログラムを用意する。
  2. 変数の部分をスロット#(もしくは##)で置き換え文末に&を付け加えて純関数にする。
  3. 後はMapを使ってリストに作用させればよい。

関数を手続き的に構成する

複雑な関数を手続き的に定義したい場合がある。その場合、f[x_]:=(a1=...;a2=...;...;an=...)のように途中の計算ステップをセミコロンで結いで(最後にはセミコロンを付けない)全体を括弧()でくくることにより定義できる。

変数を局所化したい: Module

関数を手続き的に定義すると、そこでしか使っていない変数に値が入ってしまい不便が生じる。その場合、Module[{a1,a2,...,an},a1=...;a2=...;...;an=...]とすると、その変数a1,a2,...,anが局所化されModule内でしか値が入っていないようにすることができる。

変数を局所定数で扱いたい: With

局所変数を(局所)定数として扱いたい場合、With[{a1=a10,a2=a20,...,an=an0},a1=...;a2=...;...;an=...]とすることで実現できる。

大域変数を局所的に扱いたい: Block

大域的に定義された数を一時的に異なる値を代入したい場合などは、Block[{a1=a10,a2=a20,...,an=an0},a1=...;a2=...;...;an=...]とすることで実現できる。

計算した結果の保存

f[x_]:=f[x]=(定義式)のように定義しておくと、例えばf[3]を計算したあとはその値が代入されて次に呼び出された場合に再び計算せずに結果だけを呼び出すことができる。ただし、関数の定義を間違えてしまって再定義した場合などでは、Clear[f]などを行って昔の計算結果を消去する必要があるので、定義が確定した関数のみ結果を保持しておくとよい。

再帰的定義

ある作用fを用いて関数Fを再帰的に定義する際の一つの雛形は、F[{N}_][x_]:=If[N>0,x//f//F[{N-1}],x] or F[{N}_][x_]:=If[N==0,x,x//f//F[{N-1}]]である。ここで{N}は数Nが付随するオブジェクトを表す。例えば、そのオブジェクトがリストであった場合、Nはその要素数を表す。

関数操作

関数への作用(関数から関数への写像)は作用を定義するのではなく、Replaceによって行うとよい。

リストに作用させる: Map /@, MapAt, MapAll //@, Apply @@,@@@

< 関数のリスト作用 >
表現 解説 例、補足
Map[関数,リスト] ⇆ リスト//Map[関数]
⇆ 関数/@ リスト
リストの第1レベルの成分に関数を作用(Map)させる。 {a,b,c}// Map[f] ⇆ Map[f,{a,b,c}]
⇆ f /@ {a,b,c} ⇆ {f[a],f[b],f[c]}
Map[関数,リスト,{n}] 関数が作用するリストのレベルを丁度nだけのものに制限する。 Map[f, {{a, b},c}, {2}] ⇆ {{f[a], f[b]},c}
Map[関数,リスト,max] 関数が作用するリストのレベルがmax以下のものに制限する。 Map[f, {{a, b},c}, 2] ⇆ {f[{f[a], f[b]}],f[c]}
MapAll[関数,リスト]
⇆ リスト // MapAll[関数]
リストの全ての下位階層に関数を作用させる。 MapAll[f,{a,{b,{c,d}}}]
⇆ f[{f[a],f[{f[b],f[{f[c],f[d]}]}]}]
MapAt[関数,リスト,n]
⇆ リスト//MapAt[関数,n]
リストの第n成分の成分に関数を作用させる。 {a,b,c,d} // MapAt[f,2]
⇆ MapAt[f,{a,b,c,d},2] ⇆ {a,f[b],c,d}
MapThread[関数,{リスト1,リスト2,...}] 関数をリスト毎の対応するペアに作用させる。 MapThread[f,{{a,b},{c,d}}] ⇆ {f[a,c],f[b,d]}
cf. Thread
Apply[関数,リスト] ⇆ リスト // Apply[関数]
⇆ 関数 @@ リスト
リストから外側の{}を一つ取り除いて関数を作用(Apply)させる。 f @@ {x1,x2,...,xn} ⇆ {x1,x2,...,xn} // Apply[f] ⇆ f[x1,x2,...,xn]
Apply[関数,リスト,{n}] 関数をApplyするリストのレベルを丁度nだけのものに制限する。 Apply[f, {a,{b,{c,d}}}, {2}] ⇆ {a, {b, f[c, d]}}
Apply[関数,リスト,max] 関数をApplyするリストのレベルがmax以下のものに制限する。 Apply[f, {{a, b},c}, 2] ⇆ {f[f[a], f[b]],f[c]}
関数 @@@ リスト ⇆ Apply[関数,リスト,1] リストのレベル1に関数をApplyする。 f @@@ {{a},{b},c} ⇆ Apply[f,{{a},{b},c},1] ⇆ {f[a], f[b], c}

反復的に作用させる: Nest, NestList,... [外部リンク]

関数の反復作用
表現 解説 例、補足
Nest[関数,x,n] 関数をxにn回作用させる。 Nest[f,x,3] ⇆ f[f[f[x]]]
NestList[関数,x,n] 関数をxにn回重ねてネストさせた結果をリスト構成にする。 NestList[f,x,2] ⇆ {x,f[x],f[f[x]]}
FixedPoint[関数,x] 結果に変化がなくなるまで関数をxに作用する。
FixedPointList[関数,x] FixedPoinstの変化の結果をリストで返す。
NestWhile[関数,x,判定関数] 結果に判定関数を適用してもTrueが返されなくなるまで関数をxに作用させる。
NestWhileList[関数,x,判定関数] NestWhileの変化の結果をリストで返す。

属性 [外部リンク]

関数には常に成立する性質(属性)を設定することが出来る。

属性の設定

属性の設定
表現 解説 例、補足
Attributes[関数] 関数の属性を参照する。
Attributes[関数]={属性1, ...} 関数に属性1,...を与える。 何も入れない場合には属性の除去に相当する。
SetAttributes[関数,属性] 関数に属性を加える。
ClearAttributes[関数] 関数から属性を除去する。 この操作で関数の値は消えない。値を消すにはClear[関数]を使う。

属性の種類

属性の種類
表現 解説 例、補足
Orderless 引数が標準的順序になり、かつ交換則が成り立つ。
Flat 引数が平坦化され、かつ結合則が成り立つ。
Listable 引数がリストの場合各成分に適用される。 f[{a,b}] -> {f[a],f[b]}
Const 微分をゼロとする関数になる。
Protected 関数の値が変更不可能になる。

字列 String[外部リンク]

文字を何も変換せずそのままで扱いたいときに使う。

字列の構成法: "文字列"

記号列をダブルクォート"で囲うことにより字列を(リテラル)構成できる。

字列演算 [外部リンク]

字列を抜き出す

部分を指定して抜き出す: ①StringTake ②StringPart

StringPartはver11で導入。

部分を指定して抜き出す
表現 解説 例、補足
StringTake[字列,《-》n] 字列の先頭《末尾》からn個の文字を含む列を与える。 StringTake["abcdefghijklm", 6] (*->abcdef*)
StringTake[字列,{《-》n}] 字列の先頭《末尾》から第n番目の文字を与える。 ⇄ StringPart[字列,《-》n]
StringTake[字列,{m,n}] 字列の第m番目から第n番目の文字を与える。 ⇄ StringPart[字列,m;;n;;1]
StringPart[字列,{n1,n2,...}] 字列の中の第ni番目の文字のリストを返す。

検索して抜き出す: StringCase

字列から指定したパタンや正規表現にマッチする部分字列をリスト形式で抜き出す。

検索して抜き出す
表現 解説 例、補足
StringCase[字列,正規表現《,n》] 字列から正規表現にマッチする部分字列を《最初のn個》与える。 ⇆ 字列//StringCase[正規表現]
Stringcase[字列,正規表現->置換結果] 字列から正規表現にマッチした部分字列に置換規則を施して抜き出す。
Stringcase[字列,{p1,p2,...}] 字列から任意の正規表現p1,p2,...にマッチする部分字列を与える。

正規表現 [外部リンク]

字列パタンのあるクラスを正規表現という。Mathematicaで使うことができる正規表現は拡張正規表現(ERE)と似ている。(cf. Perlにおける正規表現パタン)

正規表現の構成: RegularExpression["正規表現"]

構成された正規表現は字列(String)関連の関数で文字列のクラスを表す際に用いる。

文字表現

エスケープシーケンス
表現パタン 解説 例、補足
. 改行を除く任意の一文字を表す。 .+ ↔ .{1,} ↔ 一文字以上を含む文字列
\\d /\\D 1桁の数字/以外。 ⇄ [0-9]/[^0-9], \\d\\d ↔ (2桁の数字)
\\w/\\W 1ワード文字/以外 ⇄ アルファベット or 数字 or アンダーバー/以外 ⇄ [a-zA-Z_0-9]/[^a-zA-Z_0-9]
\\s/\\S スペース,改行,タブ,その他の空白文字/以外。
\\b/\\B ワード文字からそれ以外の(スペースなどの)文字/以外を表す。 /http\\b/ ↔ /http:/, /http@/, ...

エスケープシーケンス escape sequence: \\

デフォルトである機能をもつ正規表現の記号などをその機能を失わせて別の機能を持った記号として使用したい場合に使われる。

エスケープシーケンス
表現パタン 解説 例、補足
\\[ / \\. [.を表す。

機能表現

機能表現
表現パタン 解説 例、補足
( ) 表現パタンは包括指定子である括弧で囲むことによりグループ化できる。 グループ化された表現パタンは前から順に番号がつけられ$1,$2,..で後で参照できる。
[ ] /[^ ] [ ]の中の/中にない1文字。マイナス(-)はその範囲を表す。 [1-4] ↔ [1234], [a-c] ↔ [abc], [^a-z0-9] ↔ 小文字または数字以外の任意の1文字
| |における左右どちらかの文字を表す hog|me ↔ hoge, home
^/$ 文字列の先頭/末尾を表す。 ^A.*Z$ ↔ 行頭をAとし末尾をZとする文字列

量表現

直前の文字を繰り返す表現パタンを指定できる。

量指定子
表現パタン 解説 例、補足
* 直前の文字を0回以上を表す。 {0,}と等価。
? 直前の文字を0回又は1回を表す=直前の文字があってもなくてもよい。 {0,1}と等価。
+ 直前の文字を1回以上を表す。 {,1}と等価。
{n} 直前の文字をn回を表す。 \\d{4} ↔ 4桁の数字
{n,}/{,n} 直前の文字をn回以上/以下を表す。 \\d{2,} ↔ 2桁以上の数字
{n,m} 直前の文字をn回以上、m回以下を表す。

オプション表現

続く正規表現にオプションを設定する。

オプション表現
表現パタン 解説 例、補足
(?i) 大文字小文字の区別をしない。
(?m) ^$が行の先頭と末尾に一致する。 =multi-line.
(?s) .を新規行にマッチさせる。
(?-c) オプションを解除する。

その他(Tips)

TuringMachine [外部リンク]

並列計算 [外部リンク]

local kernelの設定

評価 > カーネル環境設定 で行う。

調べたい: ?

?の後に調べたいコマンドを打つと説明が出てくる。wildcard*を使うとそのスペルを含むコマンドが出てくる。

グラフ描画 ① ListPlot ListPlot3D ② Plot Plot3D ③ ParametricPlot ParametricPlot3D[外部リンク]

同一のグラフに複数描画したい場合には、リスト形式で代入する。

グラフ描画
表現 解説 例、補足
Plot[関数[x],{x,a,b}] 関数[x]をx=aからx=bの範囲で同じグラフに描画する。 オプションの詳細については外部リンクを参照(➡ [外部リンク])
ListPlot[リスト] リストデータをプロットする。 オプション"PlotJoined->True"で点の間を線で結ぶ。
ParametricPlot[{x[u],y[u]},{u,a,b}] パラメータuがu=aからu=bの範囲で点{x[u],y[u]}をプロットとする。

二つのグラフを重ねて描画する: Show

グラフパラメータの動的変化、アニメーションの作成: Manipulate

外部操作

Directory操作

Directory操作
コマンド説明
Directory[] 設定されている作業ディレクトリ(データをやりとりするディレクトリ)を返す。
NotebookDirectory[x.nb] x.nbというファイル名のノートブックがあるディレクトリを返す。空白にして何も入れないと現在評価しているノートブックのディレクトリを返す。
SetDirectory["dir"] 作業ディレクトリをdirに設定する。空白にして何も入れないと、"~"を入れたことになり、ホームディレクトリを作業ディレクトリに設定する。

SetDirectory[NotebookDirectory[]]

現在評価しているノートブックのディレクトリを作業ディレクトリに設定する。

結果を外部ファイルに読み書きする: ① Put (>>), Get (<<) ①'PutAppend (>>>) ② Export, Import [外部リンク],[外部リンク]

長い計算をした場合には、計算結果を外部ファイルに書き出しておくとよい。
① 式をそのままの形でファイルに読み書きする。①'式を追加保存したい場合には、>>>を用いる。 [外部リンク]
② 式を読み書きする際、formatが指定できる。[外部リンク]

① 式 >> file.txt ⇆ Put[式,"file.txt"]

式をそのままの形でfile.txtに保存する。

① 式 =<< file.txt ⇆ 式 = Get["file.txt"]

file.txtを読み込み式に代入する。

Linuxでmathematicaを起動する [外部リンク]

ノートブックをスクリプトファイルにする[外部リンク]

スクリプトファイル [外部リンク]

コマンドラインからの実行 [外部リンク]

MathLMの監視する: monitorlm [外部リンク]

使用可能/使用中ライセンス数と使用しているユーザ名、完全修飾ドメイン名等の情報を与える。

入力ヒント [外部リンク]

キーボードでセルを消去する

該当セルをキーボードで選択し、DelteもしくはBackSpaceキーを押す。セルの選択のキーボードによる方法は次の通り。

  1. キーボードの上[下]を押して該当セルとその直前[直後]のセルの間にカーソルが来るようにする。
  2. Shift+下[上]を押すことで該当セルを選択することができる。

拡大する: Cntl+マウスホイール

Controlキーとマウスホイールによってファイルの文字を拡大することができる。これは他のアプリケーションでも使える。

自由形式入力

インターネットに接続した状態で使うことのできる機能。英語の命令文を打つことにより自動で解釈して実行してくれる。セルの最初に=を押すことで発動。

Wolfram|Alphaへ質問を送る

セルの最初に==を押す。

過去の計算を参照する: %

直前のものは%だけを用いて参照できる。Out[n]の結果を引用したい場合には%nとする。

キーボードショートカット [外部リンク]

ショートカット
操作 解説 例、補足
Alt + / クリック位置以降の単語/範囲が選択されていれば選択範囲がコメントアウトされる。 (* コメント *)と等価。
Alt + . 現在行っている処理を中断する。 評価 > カーネルを終了 > local と等価。
Ctr + . クリック位置の単語が選択される。続けて押していくと選択範囲が広がる。

基本数学アシスタント(Basic Math Assistant)

パレット(Palletes) > 基本数学アシスタント(Basic Math Assistant)を選ぶと、基本的な演算記号がパレット形式でまとめられている。

特殊文字 [外部リンク]

< 特殊文字まとめ >
特殊文字 操作 例、補足
ギリシア子文字 ESC > greek > ESC ⇆ \[greek] 小文字μ: ESC > m(⇆mu) > ESC ⇆ \[Mu]
ギリシア大文字 ESC > Greek > ESC ⇆ \[CapitalGreek] 大文字Μ: ESC > M(⇆Mu) > ESC ⇆ \[CapitalMu]

小技

代入せずに置換せよ。

計算の高速化

基本的な指針は、自前でルーチンを組むのではなく出来るだけ組み込み関数を使う。組み込み関数は最適化されていることが多い。

リスト処理はリスト処理関数を使う

リストの処理は複文を用いた繰り返し処理を行うよりもMapやApplyなどのリスト処理関数で一括処理したほうが速い。

関数はコンパイルする [外部リンク]

繰り返し使う関数はCompileしておくことで計算の高速化が図れる。

Compile
表現 解説 例、補足
Compile[{x1,x2,...},式] xiが数値であるという前提として式を評価する関数を作成する。
Compile[{{x1,型1},{x2,型2},...},式] xiが型iに適合するタイプであることを前提として式を評価する関数を作成する。 型の指定には型集合が使える。
Compile[{{x1,型1,n1},...},式] xiがni次元配列でその要素が型iに属することを前提として式を評価する関数を作成する。

内積(Dot product)を定義する

SetAttributes[Dot, Orderless];				(* Dot積の順序をなくす *)
dotrule = {Dot[a_ (k_?NumericQ), b_] :> k Dot[a, b],
  Dot[a_, (k_?NumericQ) b_] :> k Dot[a, b],
  Dot[a_ + c_, b_] :> Dot[a, b] + Dot[c, b],
  Dot[a_, b_ + d_] :> Dot[a, b] + Dot[a, d]}		(* Dot積の線形演算を定義 *)
dotExpand[expr_] := Expand[expr //. dotrule];

関数展開のコツ

Seriesで関数を展開したときに出てくるFloor関数を消したい

Assumptions->条件式を用いて展開変数などを適切な領域に制限する。

冪を展開しながら計算したい

式//PowerExpand//Expandと2重で展開してみる。これでダメならパタンを使って逐次冪を展開する。

展開係数を計算したい

SeriesCoefficientがあるが、これは計算があまり速くない。(ローラン)多項式であることがわかっている場合には、(xをかけて多項式にして)Taylor展開の基づき微分してxをゼロに置くほうが速い。


主要参考文献・役立ちサイト ⇧ top ⇧

WOLFRAM 『Wolfram言語 & システム ドキュメントセンター』