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

13 ビュー (過去 30 日間)
sumitaka honji
sumitaka honji 2022 年 12 月 20 日
コメント済み: sumitaka honji 2022 年 12 月 21 日
以下のような関数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);
コードとしてはスカラー値を出力する関数を記述しているつもりですので,配列に関するエラーが発生する理由がわかりません.
行列計算とならないようにドットを用いた計算を行っているはずです.
分かりにくい文章かと思いますが,解決方法などご存じの方がいらっしゃいましたら,ご教授願います.

採用された回答

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

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeSurrogate Optimization についてさらに検索

製品


リリース

R2022a

Community Treasure Hunt

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

Start Hunting!