たとえば、7が単に並んだ列ベクトルをつくるとき、Matlabで一番効率的な方法はなにか?
tic; repmat(7, 1000000,1); toc;
経過時間は 0.006551 秒です。
tic; ones(1000000,1) * 7; toc;
経過時間は 0.008067 秒です。
repmatの方が微妙に早い?のか?
Symbolic mathで微分演算子っぽいものを作ることができる。なんの役に立つか不明だが、面白い機能なので覚書。
[問題の定式化]
2回微分可能な関数について以下の簡単な常微分方程式を考える。
微分演算子を使えば、常微分方程式は以下のように簡単に表記できる。
関数の定義:
function [DD] = diffOperator(funcArray, vars, params)
rho = params.rho;
xx = vars.xx;
DD = diff(funcArray, xx, 2) + rho * funcArray;
end
使い方:
% 関数を特定した場合の使い方
syms xx;
params.rho = 1.5;
vars.xx = xx;
uu(xx) = xx^2;
func = symfun(uu(xx), xx);
diffOperator(func, vars, params)
% 関数が一般形の場合の使い方
clear uu;
syms uu(xx);
func = symfun(uu(xx), xx);
diffOperator(func, vars, params)
使い方次第だと思うが、面白い機能なので覚書。
シンボリック関数はsymfunで作ることができる(フォーマルなやり方)。簡易なやり方としてsym f(x,y)のようにすることもできる(xxとyyは自動生成される)。
syms phi1(xx) phi2(xx);
phi1(xx) = xx;
phi2(xx) = xx^2;
funcArray = symfun([1, phi1(xx), phi2(xx)], xx);
funcArray(xx) = [ 1, xx, xx^2]
使い方:funcArray(2)とするとans = [ 1, 2, 4]が返ってくる。
補足:2変数関数にもできる
clear;
syms phi1(xx, yy) phi2(xx, yy); % xxとyyは自動生成される
phi1(xx, yy) = xx*yy;
phi2(xx, yy) = xx^2 * yy^2;
funcArray = symfun([1, phi1(xx, yy), phi2(xx, yy)], [xx, yy]);
funcArray(xx, yy) = [ 1, xx*yy, xx^2*yy^2]
使い方:funcArray(2, 2)とするとans = [ 1, 4, 16]が返ってくる。
さらにその「シンボリック関数の配列」を(まるで普通の関数のように)微分することもできる。
chebVec(x, y) = chebyshevT([0, 1, 2], x) .* chebyshevT([0, 1, 2], y)
chebVec(x, y) = [ 1, x*y, (2*x^2 - 1)*(2*y^2 - 1)]
diff(chebVec, x)
ans(x, y) = [ 0, y, 4*x*(2*y^2 - 1)]
公式ページのマニュアルだと少しわかりにくい。
参考: