$%2017/06/12
\newcommand\compl[1]{{#1^\mathtt{c}}}
\newcommand\pare[1]{{(#1)}}
\newcommand\Pare[1]{\left(#1\right)}
\newcommand\curl[1]{\{#1\}}
\newcommand\Curl[1]{\left\{#1\right\}}
\newcommand\squa[1]{[#1]}
\newcommand\Squa[1]{\left[#1\right]}
\newcommand\abs[1]{\lvert#1\rvert}
\newcommand\Abs[1]{\left\lvert#1\right\rvert}
\newcommand\floor[1]{\lfloor#1\rfloor}
\newcommand\Floor[1]{\left\lfloor#1\right\rfloor}
\newcommand\ceil[1]{\lceil#1\rceil}
\newcommand\Ceil[1]{\left\lceil#1\right\rceil}
\newcommand\setN[0]{\mathbb{N}}
\newcommand\setZ[0]{\mathbb{Z}}
\newcommand\setQ[0]{\mathbb{Q}}
\newcommand\setR[0]{\mathbb{R}}
\newcommand\setC[0]{\mathbb{C}}
\newcommand\sfrac[2]{#1/#2}
\newcommand\od[2]{\frac{d#1}{d#2}}
\newcommand\pd[2]{\frac{\partial#1}{\partial#2}}
\newcommand\sod[2]{\sfrac{d#1}{d#2}}
\newcommand\spd[2]{\sfrac{\partial#1}{\partial#2}}$
$\newcommand\L{\mathcal{L}}
\newcommand\R{\mathcal{R}}
\newcommand\A{\mathscr{A}}
\newcommand\B{\mathscr{B}}
\newcommand\G{\mathscr{G}}
\newcommand\M{\mathbb{M}}
\newcommand\I{\mathscr{I}}
\newcommand\N{\mathscr{N}}
\newcommand\setOR[0]{\overline{\mathbb{R}}}
\DeclareMathOperator{\vol}{vol}
\DeclareMathOperator\supp{supp}$
# wolfram cloudで手計算地獄から解放されよう.
## インストール(ブラウザ上でお手軽コース)
https://www.wolframcloud.com/
でアカウントをつくり,ログイン.
New Notebookを選択.
ブラウザにて,インタラクティブなインターフェイスで数式展開を代行してくれる.
数式を打ち込み,Enterを押すと次の数式を入力できる.
メニューを開き,Evaluate All Cellsを選択すると,入力したすべての数式を評価してもらえる.
Shift+Enterでその行の数式のみを評価してもらえる.

まずはcloud上でいろいろさわってみてから,PCへインストールするか決めるとよいでしょう.
## インストール(PC上でいじりたいよコース)
Jupyter notebookなどでやりたい場合の環境導入手順を説明する.
### インストール手順1:PythonとJupyter notebookをインストール
Jupyter notebookのインストールをするには,お手軽にやるならAnacondaを使うと楽だが,
環境を汚す,ライセンス制限が最近厳しくなった(?)などで不評らしい.
condaとpipの相性が良くない:
http://onoz000.hatenablog.com/entry/2018/02/11/142347
以下のいずれかの選択肢にて,PythonとJupyter notebookをインストールする.
* 選択肢1(Anacondaを使わない):
* Pythonをインストールする.
* https://www.python.jp/install/windows/install.html
* Jupyter notebookをインストールする
* https://www.javadrive.jp/python/jupyter-notebook/index1.html
* 
* 選択肢2(Anacondaを使う):
* Anacondaを使ってPython, Jupyterごとインストールしてしまう.
* https://udemy.benesse.co.jp/development/python-work/jupyter-notebook.html
### インストール手順2:Wolfram Engineをインストールする:
* 以下サイトにて,Wolfram Engineをダウンロードし,インストールする.
* https://www.wolfram.com/engine/index.ja.php?source=footer
* 注:windowsアップデートをかけないと「セキュリティの関係でダメ」とwindowsがへそを曲げることがあった.
インストール後,ユーザー名とパスワードを求められるので,wolframcloudと同じアカウントでログインするとよい.
### インストール手順3:wolframscriptをインストール
* https://www.wolfram.com/wolframscript/index.ja.html?footer=lang
wolfram engineをjupyter notebook で使えるようにする際に,wolframscriptをいれておくことが推奨らしい.
### インストール手順4:wolfram engineをjupyter notebook で使えるように設定.
* 以下サイトを参考にする
* https://note.com/yusuke_higuchi/n/n3d4c0a3700a7
* 以下から「WolframLanguageForJupyter-master」をzipでダウンロード.解凍.
* https://github.com/WolframResearch/WolframLanguageForJupyter
* 
* C直下でもprogram files以下でもいいから,「WolframLanguageForJupyter-master」をインストールしたい場所にコピー(このフォルダはインストール後参照され続けるので削除してはいけない.)
* コマンドプロンプトを(できれば管理者モードで)起動.「WolframLanguageForJupyter-master」のフォルダ上で以下を実行.
```javascript=
configure-jupyter.wls add
```

* なお,後日,「WolframLanguageForJupyter-master」を移動させたくなった場合は,ファイルを移動後,「configure-jupyter.wls remove」してから「configure-jupyter.wls add」をやり直せばよい.
### インストール手順5:動作確認
wolfram engineをJupyter notebookで使えるように設定できたら,
コマンドプロンプトで
```javascript=
jupyter notebook
```
と打ち込むと,Jupyter notebookが起動する.
(「jupyter notebook」と命令を打ち込んだ際のフォルダが開くため,システムファイルを削除してしまわないように注意)

Jupyter notebook上で以下の通り,Newの項目が増えていたら成功.

あとは楽しく遊ぶ.

### インストール手順6(オプション):毎回の起動の手間を軽減する
毎回コマンドプロンプトを起動して「jupyter notebook」と打ち込むことがめんどくさい場合は,以下の中身をもつbatファイルを用意すればよい.
run_jupyter.bat
```javascript=
jupyter notebook
```
(batファイルの名前はjupyter.batにしないこと.notebookが起動せずにbatファイルが永遠と起動し続けてしまう.)

Jupyter notebook が起動したときに最初に表示されるフォルダは起動コマンドを入力したフォルダと同じになるため,スクリプトファイルをおいているフォルダと同じフォルダにこのbatファイルをおいておくとよい.
### インストール手順7(オプション):自動入力補間を導入する
https://www.soudegesu.com/post/python/jupyter-autocomplete/
にあるNbextensionsを使った方法により,Jupyter notebookにも入力補間機能を導入することができる.

## 関数定義をしましょう:
```javascript=
f[x_]:=x^2
```
で$f(x)=x^2$を定義できる.
```javascript=+
f[2]
```
と記述すると値の代入結果が得られる.
https://www.wolfram.com/language/fast-introduction-for-programmers/ja/function-definitions/
## 行列
wolfram言語ではベクトルや行列はリストとして実装される.行ベクトルと列ベクトルは区別されない.
```javascript=
mat = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
```
で行列を定義できる.
```javascript=+
mat // MatrixForm
```
で行列表記で結果を表示できる.// MatrixForm抜きだとリストとしての表示になる.
```javascript=+
mat = Table[x^i + x^j, {i, 1, 4}, {j, 1, 3}];
mat // MatrixForm
```
のように,関数の行列を定義することもできる.この場合,iはたて,jは横のインデックスを意味する.
https://reference.wolfram.com/language/howto/CreateAMatrix.html.ja
ただし,上記ページの「行列を割り当てと一緒に保存する場合」のくだりをよく読んでおくこと.
```javascript=+
v = {x, y}
```
でベクトルを定義できる.
ドット演算子でつないで内積を計算する.
```javascript=+
{x, y} . {xp, yp}
```
行列の掛け算をするときもドット演算子でつなぐ.
```javascript=+
mat.v
mat.mat
```
以下で動作テストしてみよ.
```javascript=+
mat = {{a, 2, 3}, {4, 5, 6}, {7, 8, 9}}
v={x,y,z}
mat.v // MatrixForm
v.v // MatrixForm
mat.mat // MatrixForm
```
## 微分しよう.
導関数をもとめたいときは,
```javascript=+
f'[x]
```
と入力すると,導関数の式形が得られる.
```javascript=+
f'''[x]
```
などと入力すると,高次の微分も計算してくれる.
```javascript=+
D[f[x],x]
```
と入力すると,fのxに関する微分を計算してくれる.
D[f[x],{x,3}]なら3次の微分を計算してくれる.
https://reference.wolfram.com/language/howto/TakeADerivative.html.ja?source=footer
ヤコビ行列は以下コードで計算してくれる.

## if文でgeneralized powerを定義する(同次の研究をする人向け):
```javascript=+
gpow[x_,a_] := If[x < 0, -Abs[x]^a, Abs[x]^a]
```
または,
```javascript=+
gpow[x_,a_] := Piecewise[{{-Abs[x]^a,x<0},{Abs[x]^a,x>0}},0]
```
で一般化べき乗を定義できる.
```javascript=+
D[gpow[x,a],x]
```
で微分が求まる.
## 制約条件つきで最小最大を求める(Lyapunov関数を扱う人向け):
```javascript=
f[x_,y_]=x^2+3y^2
MinValue[{f[x,y],x^2+y^2==1},{x,y}]
MaxValue[{f[x,y],x^2+y^2==1},{x,y}]
```
## オイラーラグランジュ方程式の求め方(ロボットの制御を研究する人向け):
まず,
```javascript=
Needs["VariationalMethods`"]
```
にて,パッケージを使うよ宣言をする.
単純な振り子はラグランジアン1/2 m r^2 \[Theta]'[t]^2 + m g r Cos[\[Theta][t]]である.
これをEulerEquations関数に代入することで,運動方程式が得られる.
```javascript=+
EulerEquations[ 1/2 m r^2 \[Theta]'[t]^2 + m g r Cos[\[Theta][t]], \[Theta][t], t]
```
https://reference.wolfram.com/language/VariationalMethods/ref/EulerEquations.html.ja?source=footer
これで地獄の計算から解放される.
## 慣性行列$M(q)$から運動方程式を求めてみよう。
以下の通り,運動方程式(1)は(2)(3)より慣性行列$M(q)$を使って一意に表現することができる.

注:(3)式右辺第2項全体に転置をかけることが抜けています.
このことを2リンクマニピュレータの運動方程式(既知)を使って確かめてみよう.
http://www.lab.kochi-tech.ac.jp/robotics/textbook/Robotics/IR6.pdf
の内容を使う.



以下のようなコードで偏微分を計算しつつ,$\dot{M}$や$S$項を計算すると,慣性行列$M$から遠心コリオリ項$C$が計算できていることがわかる.

## オイラーラグランジュ方程式から運動方程式を求めてみよう。
ラグラジアンを使い,以下で運動方程式を求めることもできる.

与えられた$L(q,\dot{q})$に対し,オイラーラグランジュ方程式を展開すると,
\begin{align}
\od{}{t}\Pare{\pd{L}{\dot{q}}(q,\dot{q})}-\pd{L}{q}(q,\dot{q})
&=
\frac{\partial^2L}{\partial \dot{q}^2}(q,\dot{q})\ddot{q}
+
\frac{\partial^2L}{\partial q\partial \dot{q}}(q,\dot{q})\dot{q}
-\pd{L}{q}(q,\dot{q})
\end{align}
となるため,ラグラジアンから
\begin{align}
M(q)=\frac{\partial^2L}{\partial \dot{q}^2}(q,\dot{q})
\end{align}
により,
慣性行列$M(q)$を具体的に求めることもできる.
逆に,慣性行列$M(q)$が既知であれば,$L(q)=1/2\dot{q}^TM(q)\dot{q}-$「ポテンシャルエネルギー」と定義することで,慣性行列を使った方法で運動方程式を求めた時と同じ結果を得ることができる.


確かにそれっぽく運動方程式がたっている.$M(q)$で自動でくくるとかは言語仕様上やってくれないようだ.
## 記法に厳格な立場でオイラーラグランジュ方程式をといてみる.
## ちょっとした微分方程式の解をとかせてみる
https://www.wolfram.com/language/fast-introduction-for-math-students/ja/differential-equations/
に書かれている方法により,ちょっとしたシミュレーションくらいならWolfram Engineさんがグラフ化までやってくれる.

常微分方程式をとく例:

無名関数とmap関数の省略表記を活用することで,うまく文法上の問題をクリアしていることに注意する.
$n$次元に一般化する例:

文字の接続に関する文法を使っている
#### tips:無名関数とmap関数の省略表記
純関数(matlabでは無名関数)
#+2&[3]
#純関数宣言開始,&で宣言終了
#で引数を意味する.
#1+#2&[3,4]
のように複数引数も可
「#1+#2&」部分が関数記号と思えばよい
Map関数の省略表記
Map[Head,{3,12,"nya-"}]
Head/@{3,12,"nya-"}
どちらも同じ.
## 計算結果をコピペするには?



## 即時定義と遅延定義の違い
https://reference.wolfram.com/language/tutorial/TransformationRulesAndDefinitions.html#29979

上記文法を使い,フィボナッチ数列をうまく定義する

式を評価せずにholdしとけ:

計算するなとっておいたものをReleaseHold:


## いろいろな関数を調べよう
Grad
Transpose
Table
Map
Fullsimplify
命令など,便利なものがいっぱいあるのでしらべよう
meirei//Fullsimplify
は文法的には
Fullsimplify[meirei]
と同じことに注意.
%は「直前の出力」を意味する.
#### 雑多メモ
windowsのデフォルトフォントは目によろしくない.こだわったほうが良い.
https://juliamono.netlify.app/
https://github.com/miiton/Cica
#### 参考リンク
https://hackmd.io/@hyrodium/Bku5r-Q8l
https://hackmd.io/@hyrodium/HJm70dIIx
https://hackmd.io/@hyrodium/BJuLgB8GZ
https://hackmd.io/@hyrodium/Bk1w_lkp7