combvecによるメモリ不足および積分計算に関しまして
Show older comments
Xにより7つのパラメータを遷移させた上で,解としてk3を求めるプログラムを組んだのですが,エラーが発生してしまいました.
操作としては,Xで全てのパラメータのパターンを網羅したベクトルをつくり,別のmファイル(trap2.m)から関数を呼び出し各パラメータを代入し,方程式eqnを満たすk3を求めるといったものになります.
また,方程式eqnはパラメータk1,k2,t1,t2,t3,p1,p2を与えた上で,trap2.m(台形を組み合わせた関数)の面積が0となるようなk3を求めるといったものです.
trap2.mの概形は写真にて添付させていただきました.

よろしくお願い致します.
【main.m】
close all;
clc;
clear;
L = 10;
lim = L/2 - 0.5;
X = (combvec(0.1:0.1:0.5, -0.1:-0.1:-0.5, 0.5:0.5:lim, 0.5:0.5:lim, 0.5:0.5:lim, 0.5:0.5:lim, 0.5:0.5:lim))';
k1 = X(:, 1);
k2 = X(:, 2);
t1 = X(:, 3);
t2 = X(:, 4);
t3 = X(:, 5);
p1 = X(:, 6);
p2 = X(:, 7);
syms s k3
f2 = trap2(s, k1, k2, k3, t1, t2, t3, p1, p2, L);%%%%%% k3を求めるために変数をs,k3にした関数f2
eqn = int(f2, s, [0 L/2]) == 0; %%%%%%% k3に関する方程式を定義
k3 = solve(eqn,k3) ; %%%%%%%%%%%%%%%% 関数f2のトータル面積が0になるようなk3を求値
sprintf('fin')
【trap2.m】
function f = trap2(s, k1, k2, k3, t1, t2, t3, p1, p2, L)
t1_prime = t1 + p1;
t2_prime = t2 + p2;
a1 = (k2-k1)/(t2-t1_prime); %%% 傾き1
a2 = (k3-k2)/(t3-t2_prime); %%% 傾き2
f = piecewise(0<=s<=t1, (k1/t1)*s,...
t1<=s<=t1_prime, k1,...
t1_prime<=s<=t2,a1*(s-t1_prime)+k1,...
t2<=s<=t2_prime, k2,...
t2_prime<=s<=t3, a2*(s-t3)+k3,...
t3<=s<=L/2, k3);;
end
Answers (1)
Shota Kato
on 11 Oct 2020
0 votes
以下の2点を確認させてください.
- 台形の面積は解析的な解が存在するので,piecewise関数やint関数を用いることなく陽に答えを書くことができそうですが,そのようにしない回答が必要,ということでしょうか?そうでないなら,問題は簡単になります.
- 添付画像を見ると,t1<t2<t3<L/2という条件が成立しそうですが,main.m内ではその条件が成り立っていないと思います.画像が正しいのであれば,コードを見直す必要がありますが,どうでしょうか?
3 Comments
Shota Kato
on 11 Oct 2020
添付していただいたコードを回すと,確かにメモリ不足のエラーが出ますが,これはtrap2に与えられる引数がベクトルになっていて,関数内(15行目)の計算結果が行列になっているからです.
trap2の関数内の(/と*)の演算子をドット付き演算子にすることで,要素ごとに計算を行う(クロネッカー積と呼ばれます)ことができるので,メモリ不足の問題は解決されるはずです.
ただ,コードがこのままだとシンボリック計算が終了しない(主にintの部分)ため,計算がいつ終わるのかはわかりません.
maro_ta
on 12 Oct 2020
maro_ta
on 12 Oct 2020
Categories
Find more on 微積分 in Help Center and File Exchange
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!