combvecによる​メモリ不足および積分​計算に関しまして

1 visualizzazione (ultimi 30 giorni)
maro_ta
maro_ta il 11 Ott 2020
Commentato: maro_ta il 12 Ott 2020
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

Risposte (1)

Shota Kato
Shota Kato il 11 Ott 2020
以下の2点を確認させてください.
  1. 台形の面積は解析的な解が存在するので,piecewise関数やint関数を用いることなく陽に答えを書くことができそうですが,そのようにしない回答が必要,ということでしょうか?そうでないなら,問題は簡単になります.
  2. 添付画像を見ると,t1<t2<t3<L/2という条件が成立しそうですが,main.m内ではその条件が成り立っていないと思います.画像が正しいのであれば,コードを見直す必要がありますが,どうでしょうか?
  3 Commenti
maro_ta
maro_ta il 12 Ott 2020
ご回答ありがとうございます.ご質問を頂いたので回答させていただきます.
1,この先でtrap2の関数f(s)を用いた二重積分等の出力を行うのですが,この積分解としてパラメータを用いた解析解を与えるのは厳しいかと考え,台形を関数定義しております.
具体的には以下のような計算をするつもりでいます.
syms u
f = trap2(s, k1, k2, k3, t1, t2, t3, p1, p2, L); %%% k3求値後に関数fのを定義
theta = int(f, s, [0 u]);
x = double(int(cos(theta), u,[0 L]));
y = double(int(sin(theta), u,[0 L]));
2,おっしゃる通りですね.後々パラメータの大小関係を満たすものを抽出するつもりでいましたが,先に行った方が圧倒的にベクトルが短縮できたので,以下のように条件を満たすベクトルMを作りました(あまり得意でないので冗長になってしまいましたが....)
L = 10;
lim = L - 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,k2,t1,p1,t2,p2,t3
[Xrow Xcol] = size(X);
T = zeros(size(X));
count = 0;
for i=1:Xrow
if ((X(i,3) + X(i,4) < X(i,5))) && ((X(i,5) + X(i,6) < X(i,7))) %%% t1 + p1 < t2, t2 + p2 < t3 → ベクトルTを生成
count = count + 1;
T(count,:) = X(i,:);
end
end
clear X; %%% Xは不要なので削除
M = T(T(:,1) ~= 0,:); %%%% ベクトルTから要素が0の行を削除 → ベクトルMを生成
k1 = M(:, 1);
k2 = M(:, 2);
t1 = M(:, 3);
p1 = M(:, 4);
t2 = M(:, 5);
p2 = M(:, 6);
t3 = M(:, 7);
maro_ta
maro_ta il 12 Ott 2020
以下のコードで実行したところ,写真のようなエラーが発生しました.積分計算にベクトルを用いるのは厳しいのでしょうか....
【trapmat】
function f = trapmat(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 - t2) + k2,...
t2<=s<=t2_prime, k2,...
t2_prime<=s<=t3, a2 .* (s - t3) + k3,...
t3<=s<=L/2, k3);
end
close all;
clc;
clear;
L = 10;
lim = L - 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,k2,t1,p1,t2,p2,t3
[Xrow Xcol] = size(X);
T = zeros(size(X));
count = 0;
for i=1:Xrow
if ((X(i,3) + X(i,4) < X(i,5))) && ((X(i,5) + X(i,6) < X(i,7))) %%% t1 + p1 < t2, t2 + p2 < t3の条件でベクトルTを生成
count = count + 1;
T(count,:) = X(i,:);
end
end
clear X; %%% Xは不要なので削除
M = T(T(:,1) ~= 0,:); %%%% ベクトルTから要素が0の行を削除 → ベクトルMを生成
k1 = M(:, 1);
k2 = M(:, 2);
t1 = M(:, 3);
p1 = M(:, 4);
t2 = M(:, 5);
p2 = M(:, 6);
t3 = M(:, 7);
syms s k3
f2 = trapmat(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を求値

Accedi per commentare.

Prodotti

Community Treasure Hunt

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

Start Hunting!