数値2重積分で発生する”配列のサイズがこの演算に適合しません”がなぜ発生するのですか?
14 views (last 30 days)
Show older comments
sumitaka honji
on 20 Dec 2022
Commented: sumitaka honji
on 21 Dec 2022
以下のような関数gから,複数の数値積分を経てある値を求める計算を行おうと考えています.
% 関数のパラメータ
sigma_c1 = 0.5693716434943505;
loc_c1 = 0.0022334596806387118;
scale_c1 = 0.02331851663458861;
mu_c1 = log(scale_c1);
sigma_c2 = 0.8495997045207737;
loc_c2 = 2.7282820954594182;
scale_c2 = 13.489831354317026;
mu_c2 = log(scale_c2);
sigma_k = 0.16071736351747318;
loc_k = -0.018924579331412603;
scale_k = 0.10619425405284172;
mu_k = log(scale_k);
mu_q0 = 0.030429120348286542;
sigma_q0 = 0.033019617597742;
K = 0.0125;
% 関数内に含まれる関数
c1 = @(u1) exp(-sqrt(2)*sigma_c1*erfcinv(2.*u1)+mu_c1)+loc_c1;
c2 = @(u2) exp(-sqrt(2)*sigma_c2*erfcinv(2.*u2)+mu_c2)+loc_c2;
k = @(u3) exp(-sqrt(2)*sigma_k*erfcinv(2.*u3)+mu_k)+loc_k;
q0 = @(u4) sqrt(2)*sigma_q0*erfinv(2.*u4-1)+mu_q0;
% 目的の関数
g = @(u1,u2,u3,u4,t) K.*(1./k(u3).*(1-exp(-k(u3)./c1(u1).*t))+1./c2(u2).*t)+q0(u4);
gの5変数の内,tはあるスカラー値で固定するとして,残りの4変数を積分することを考えています.
4変数全てに関する積分及びある1変数を除いた積分による新しい関数の作成はエラー無く処理できています.
% 数値4重積分
g0 = integral(@(u4) integral3(@(u1,u2,u3) g(u1,u2,u3,u4,time),0,1,0,1,0,1),0,1,'ArrayValued',true);
% 1変数の新しい関数
g1 = @(u1) integral3(@(u2,u3,u4) g(u1,u2,u3,u4,time),0,1,0,1,0,1) - g0;
g2 = @(u2) integral3(@(u1,u3,u4) g(u1,u2,u3,u4,time),0,1,0,1,0,1) - g0;
% 2変数の新しい関数
g12 = @(u1,u2) integral2(@(u3,u4) g(u1,u2,u3,u4,time),0,1,0,1) - g0 - g1(u1) - g2(u2);
しかし,ここで作成した関数を2乗した形で積分しようとしたところ,”配列のサイズがこの演算に適合しません”というエラーが発生しました.
D12 = integral2(@(u1,u2) g12(u1,u2).^2,0,1,0,1);
コードとしてはスカラー値を出力する関数を記述しているつもりですので,配列に関するエラーが発生する理由がわかりません.
行列計算とならないようにドットを用いた計算を行っているはずです.
分かりにくい文章かと思いますが,解決方法などご存じの方がいらっしゃいましたら,ご教授願います.
0 Comments
Accepted Answer
Hiro Yoshino
on 20 Dec 2022
無名関数の所かなという気がします:
12 = integral2(@(u1,u2) (g12(u1,u2).^2),0,1,0,1);
なら上手く行くとかないでしょうか?
3 Comments
Hiro Yoshino
on 21 Dec 2022
前者は、ArrayValued = true とすると NxD の出力を行う行列を戻す関数を引数に取ることができると書いてありますが、後者は同じサイズの2入力に対して同じサイズの1つの出力 (ベクトル) を戻すと書いてあります。従って、g1 を作成する際に、g0 が入っておりこの g0 が NxD の出力を行う可能性が有るとすると、integral2 の引数にそれが入ってくるのは許さないのでは無いのかな?と思いました。
修正するるとすれば、g0 の ArrayValued = false (もしくは default) にする必要が有るかと思いました。
More Answers (0)
See Also
Categories
Find more on Surrogate Optimization in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!