MATLAB ヤコビアンを数値的に計算
MATLABには,シンボリック関数を渡すとヤコビアンを計算してくれる jacobian 関数がありますが,無名関数に対してヤコビアンの計算ができないものかと調べていたところ,ヤコビアンの数値解を求める関数を作っている方を発見しました.
http://jp.mathworks.com/matlabcentral/fileexchange/13490-adaptive-robust-numerical-differentiation
ヤコビアンだけでなく,数値微分などもあります.
使い方はこんな感じ↓
https://jp.mathworks.com/matlabcentral/answers/28066-numerical-jacobian-in-matlab
MATLABでの関数の活用法
MATLABには様々なタイプの関数が用意されていますが,
特に無名関数などは,MathWorksのドキュメンテーションを読んでも,使い道がピンと来ないと思います.
数値シミュレーション等における関数の活用法が,分かりやすくまとめられている資料があったので,紹介します.
www.slideshare.net
なお,以下の書籍の巻末にも,上のスライドと同様の内容が付録として収録されているうえ,
無名関数などを活用したカルマンフィルタのサンプルスクリプトが多数掲載されているので,併せて読むと勉強になります.
MATLAB 効率化のための関数化
他のプログラミング言語と同様,MATLABでもスクリプトを可能な限り関数化することによって,効率よくシミュレーションを行えます.
関数化することによるメリットとしては,
- 可読性が高まる
- 再利用しやすくなる
- 処理速度の高速化に貢献する
といったことが挙げられます.
MATLABのプログラミングにおいてどのように関数をコールすれば高速化ができますか?
jp.mathworks.com
MATLABで関数を作る方法は,3つ考えられるので,整理して紹介します.
1.関数毎に mファイルを作る
最も汎用性が高く,一般的な方法だと思われます.
しかし,一目でプログラムの全体像を把握することが難しく,
関数毎にファイルが増えてしまうため管理も面倒です.
2.スクリプト全てを関数化する
function [] = test_script() % function1, function2 を含むメインの処理の記述 clear; close all; A = function1(1.0, 2.0) B = function2(1.5, 2.5) end function [a] = function1(b, c) % 自作の関数 その1 a = b + c; end function [d] = function2(e, f) % 自作の関数 その2 d = e * f; end
上記の様に記述し,"test_script.m"という名前で保存すれば,
スクリプト内の全部分が関数となる1つのmファイルが出来上がります.
こうすることで,処理の高速化ができ,
mファイルも1つに集約でき管理しやすくなります.
しかし,メイン部分まで関数にすることで,ワークスペースには変数が残らないようになります.
そのため,変数の状況を確認しながらスクリプトを修正していく,という書き方はできません.
3.スクリプトに関数を含める
% function1, function2 を含むメインの処理の記述 clear; close all; A = function1(1.0, 2.0) B = function2(1.5, 2.5) function [a] = function1(b, c) % 自作の関数 その1 a = b + c; end function [d] = function2(e, f) % 自作の関数 その2 d = e * f; end
R2016bから導入された機能です.
自作の関数を,スクリプト内で見渡すことができるうえ,
メイン部分の変数についてはワークスペースに保存されるため,データの様子を見ながらスクリプトを書き進めることができます.
新しい環境が使える方には,大変便利なのでおすすめです.
古い環境で実行しなければならないときでも,メイン部分もfunctionになるように数行書き足すだけ,手法2.と同じように扱えるので,支障ありません.
- 作者: 青山貴伸,蔵本一峰,森口肇
- 出版社/メーカー: 講談社
- 発売日: 2016/02/23
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る