混合三角多項式の確率モーメント(mixed-trigonometric-polynomial moment)計算とMATLABでの確認
はじめに
確率モーメントベースで状態の不確実性を伝播させるという手法が下記論文(Moment-Based Exact Uncertainty Propagation Through NOnlinear Stochastic Autonomous Systems)で紹介されており,手計算とモンテカルロ法での確認を行ったので紹介する.
これにより,ある時刻でのロボットの状態(位置など)から数ステップ後の状態を不確実性も含めて扱うことができる.
論文においては,混合三角多項式のモーメント計算が示されている.
本記事では,ある確率分布
分布としては正規分布,一様分布,指数分布を扱う.
※原著の英語での用語を日本語にしているので,翻訳違いは容赦ください.
特性関数と確率モーメント
一般式
確率変数
混合三角多項式の
(論文Lemma4)
混合三角多項式のモーメントの例
モーメントの例
様々な分布でのモーメントの計算
正規分布,一様分布,指数分布の確率変数
また,モンテカルロ法により計算結果を確かめる.
モンテカルロ法による計算方法
モンテカルロ法では,確率分布に従う乱数
例えば,
各確率分布に従う乱数は下記のように取得できる(MATLAB).
参考:乱数 - MATLAB random- MathWorks 日本
% 乱数のシード値の固定
rng('default');
rng(1);
% 正規分布の乱数(平均μ=0.5,標準偏差σ=0.4)
rng(1);
theta = random('Normal',0.5,0.4,[1,1e8]);
% 一様分布の乱数(下限-0.2,上限0.5)
rng(1);
theta = random('Uniform',-0.2,0.5,[1,1e8]);
% 指数分布の乱数(平均値1/3)
rng(1);
theta = random('Exponential',1/3.0,[1,1e8]);
次に,確率モーメントを計算する.
% E[cos(θ)]
mean(cos(theta))
% E[sin(θ)]
mean(sin(theta))
% E[θcos(θ)]
mean(theta.*cos(theta))
% E[θsin(θ)]
mean(theta.*sin(theta))
% E[θ^2 cos(θ)]
mean(theta.*theta.*cos(theta))
% E[θ^2 sin(θ)]
mean(theta.*theta.*sin(theta))
以上により各分布でのモーメントが近似できる.
特性関数からの計算と確認
確率モーメントについて手計算する.
またモンテカルロ法での近似解との比較を行う
正規分布
平均値
特性関数は
である.
モンテカルロ法との比較は下記となり,計算が合っていることが確かめられる.
解析解 | 0.8101 | 0.4426 | 0.3342 | 0.3509 | 0.2406 | 0.2997 |
モンテカルロ | 0.8101 | 0.4426 | 0.3343 | 0.3509 | 0.2406 | 0.2998 |
差( |
1.3051 | -2.3970 | -1.4950 | -2.4924 | -1.9404 | -2.7647 |
コード
mu = 0.5;
sigma = 0.4;
Ecos = cos(mu)*exp(-sigma^2/2)
Esin = sin(mu)*exp(-sigma^2/2)
Ethcos = (mu*cos(mu)-sigma^2*sin(mu))*exp(-sigma^2/2)
Ethsin = (mu*sin(mu)+sigma^2*cos(mu))*exp(-sigma^2/2)
Eth2cos = ((sigma^2+mu^2-sigma^4)*cos(mu)-2*mu*sigma^2*sin(mu))*exp(-sigma^2/2)
Eth2sin = ((sigma^2+mu^2-sigma^4)*sin(mu)+2*mu*sigma^2*cos(mu))*exp(-sigma^2/2)
%% Monte Carlo
rng('default');
rng(1);
theta = random('Normal',mu,sigma,[1,1e8]);
%% ====ここから以降は共通===
% E[cos(θ)]
mean(cos(theta))
% E[sin(θ)]
mean(sin(theta))
% E[θcos(θ)]
mean(theta.*cos(theta))
% E[θsin(θ)]
mean(theta.*sin(theta))
% E[θ^2 cos(θ)]
mean(theta.*theta.*cos(theta))
% E[θ^2 sin(θ)]
mean(theta.*theta.*sin(theta))
%%error
e1 = Ecos - mean(cos(theta))
e2 = Esin - mean(sin(theta))
e3 = Ethcos - mean(theta.*cos(theta))
e4 = Ethsin - mean(theta.*sin(theta))
e5 = Eth2cos - mean(theta.*theta.*cos(theta))
e6 = Eth2sin - mean(theta.*theta.*sin(theta))
%表示
s1 = sprintf('| | $\\\\mathbb{E}[\\\\cos(\\\\theta)]$ | $\\\\mathbb{E}[\\\\sin(\\\\theta)]$ | $\\\\mathbb{E}[\\\\theta\\\\cos(\\\\theta)]$ | $\\\\mathbb{E}[\\\\theta\\\\sin(\\\\theta)]$ | $\\\\mathbb{E}[\\\\theta^2\\\\cos(\\\\theta)]$ | $\\\\mathbb{E}[\\\\theta^2\\\\sin(\\\\theta)]$ |\n');
s2 = sprintf('| ---- | ---- | ---- | ---- | ---- | ---- | ---- |\n');
s3 = sprintf('|解析解|%.4f|%.4f|%.4f|%.4f|%.4f|%.4f|\n',Ecos,Esin,Ethcos,Ethsin,Eth2cos,Eth2sin);
s4 = sprintf('|モンテカルロ|%.4f|%.4f|%.4f|%.4f|%.4f|%.4f|\n',mean(cos(theta)),mean(sin(theta)),mean(theta.*cos(theta)),mean(theta.*sin(theta)),mean(theta.*theta.*cos(theta)),mean(theta.*theta.*sin(theta)));
s5 = sprintf('|差( $\\\\times 10^{-5}$ )|%.4f|%.4f|%.4f|%.4f|%.4f|%.4f|\n',e1*1e5,e2*1e5,e3*1e5,e4*1e5,e5*1e5,e6*1e5);
fprintf([s1,s2,s3,s4,s5])
一様分布
分布の下限を
特性関数は
である.
モンテカルロ法との比較は下記.
解析解 | 0.9687 | 0.1464 | 0.1393 | 0.0618 | 0.0589 | 0.0211 |
モンテカルロ | 0.9687 | 0.1464 | 0.1393 | 0.0619 | 0.0589 | 0.0211 |
差( |
0.5153 | -2.2585 | -2.0843 | -1.0109 | -0.9325 | -0.5151 |
コード
L = -0.2;
U = 0.5;
Ecos = (sin(U)-sin(L))/(U-L)
Esin = -(cos(U)-cos(L))/(U-L)
Ethcos = -(-U*sin(U)+L*sin(L)-cos(U)+cos(L))/(U-L)
Ethsin = -(U*cos(U)-L*cos(L)-sin(U)+sin(L))/(U-L)
Eth2cos =-((-U^2+2)*sin(U)-2*U*cos(U)+(L^2-2)*sin(L)+2*L*cos(L))/(U-L)
Eth2sin =((-U^2+2)*cos(U)+2*U*sin(U)+(L^2-2)*cos(L)-2*L*sin(L))/(U-L)
rng(1);
theta = random('Uniform',L,U,[1,1e8]);
%~~~以降省略~~~
指数分布
平均値を
特性関数は
である.
モンテカルロ法との比較は下記.
解析解 | 0.9000 | 0.3000 | 0.2400 | 0.1800 | 0.1080 | 0.1560 |
モンテカルロ | 0.9000 | 0.3000 | 0.2400 | 0.1800 | 0.1080 | 0.1560 |
差( |
-1.4157 | 2.2196 | 0.7986 | 2.0447 | -0.7383 | 3.0397 |
コード
lambda = 3;
Ecos = lambda^2/(lambda^2+1)
Esin = lambda/(lambda^2+1)
Ethcos = (lambda^3-lambda)/(lambda^2+1)^2
Ethsin = (2*lambda^2)/(lambda^2+1)^2
Eth2cos =(2*lambda^2)*(lambda^2-3)/(lambda^2+1)^3
Eth2sin =(2*lambda)*(3*lambda^2-1)/(lambda^2+1)^3
rng(1);
theta = random('Exponential',1/lambda,[1,1e8]);
%~~~以降省略~~~
おわりに
モーメントの手計算を行ってみたが,かなり大変だという印象を受けたので,もし活用していただけるのであれば幸いである.
(特性関数の二階微分とか大変…)
Discussion