数値2重積分で発生する”配列のサイズがこの演算に適合しません”がなぜ発生するのですか?
12 次查看(过去 30 天)
显示 更早的评论
以下のような関数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 个评论
采纳的回答
Hiro Yoshino
2022-12-20
無名関数の所かなという気がします:
12 = integral2(@(u1,u2) (g12(u1,u2).^2),0,1,0,1);
なら上手く行くとかないでしょうか?
3 个评论
Hiro Yoshino
2022-12-21
前者は、ArrayValued = true とすると NxD の出力を行う行列を戻す関数を引数に取ることができると書いてありますが、後者は同じサイズの2入力に対して同じサイズの1つの出力 (ベクトル) を戻すと書いてあります。従って、g1 を作成する際に、g0 が入っておりこの g0 が NxD の出力を行う可能性が有るとすると、integral2 の引数にそれが入ってくるのは許さないのでは無いのかな?と思いました。
修正するるとすれば、g0 の ArrayValued = false (もしくは default) にする必要が有るかと思いました。
更多回答(0 个)
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Surrogate Optimization 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!