数値2重積分で発生す​る”配列のサイズがこ​の演算に適合しません​”がなぜ発生するので​すか?

14 views (last 30 days)
sumitaka honji
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);
コードとしてはスカラー値を出力する関数を記述しているつもりですので,配列に関するエラーが発生する理由がわかりません.
行列計算とならないようにドットを用いた計算を行っているはずです.
分かりにくい文章かと思いますが,解決方法などご存じの方がいらっしゃいましたら,ご教授願います.

Accepted Answer

Hiro Yoshino
Hiro Yoshino on 20 Dec 2022
無名関数の所かなという気がします:
12 = integral2(@(u1,u2) (g12(u1,u2).^2),0,1,0,1);
なら上手く行くとかないでしょうか?
  3 Comments
Hiro Yoshino
Hiro Yoshino on 21 Dec 2022
integral, integral2 を読んでみました。
前者は、ArrayValued = true とすると NxD の出力を行う行列を戻す関数を引数に取ることができると書いてありますが、後者は同じサイズの2入力に対して同じサイズの1つの出力 (ベクトル) を戻すと書いてあります。従って、g1 を作成する際に、g0 が入っておりこの g0 が NxD の出力を行う可能性が有るとすると、integral2 の引数にそれが入ってくるのは許さないのでは無いのかな?と思いました。
修正するるとすれば、g0 の ArrayValued = false (もしくは default) にする必要が有るかと思いました。
sumitaka honji
sumitaka honji on 21 Dec 2022
ご回答ありがとうございます.
g0はスカラー値として関数の作成に使用しているため問題はないかと思っていたのですが,そのような挙動をする可能性があるということで理解いたしました.
ひとまず回答とさせていただきます.
ありがとうございました.

Sign in to comment.

More Answers (0)

Products


Release

R2022a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!