for構文で算出した複数の解を一つの行列の行に羅列するにはどうすればよいでしょうか。
2 ビュー (過去 30 日間)
古いコメントを表示
for構文において算出した複数(非常に多い)の解を一つに行列の行に羅列するには、どうすればよいのでしょうか。
syms Z1 Z2;
for i=0:0.01:3.9
Z1=1+i;
a1=(Z1*sin(Z1)-Z1^2*cos(Z1))/(2-2*cos(Z1)-Z1*sin(Z1));
b1=(Z1^2-Z1*sin(Z1))/(2-2*cos(Z1)-Z1*sin(Z1));
a2=(Z2*sin(Z2)-Z2^2*cos(Z2))/(2-2*cos(Z2)-Z2*sin(Z2));
b2=(Z2^2-Z2*sin(Z2))/(2-2*cos(Z2)-Z2*sin(Z2)); %安定関数
K1=2*((a2-b2)+3/2)+(3/4+12);
K2=2*((a1-b1)+3/2)+(3/4+12);
K3=2*((a1-b1+a2-b2)+(3/4+4));
K5=-(3/4+2); %行列要素
K=[K3 0 0 0 0 0;0 K3 0 0 0 0;0 0 K1 K5 0 0;0 0 K5 K2 0 0;...
0 0 0 0 K1 K5;0 0 0 0 K5 K2]; %座屈モードⅠの行列
ka=K(1,1); %モードタイプaの行列
solx=vpasolve(det(ka)==0,Z2,[0 10]);
end
solxに算出した解が随時上書きされてしまうことも問題点です。
一つの行列Aに、
A=[i=0のときの解;i=0.01のときの解;・・・;i=3.9のときの解]
のようにしたいのですが。
よろしくお願い致します。
0 件のコメント
採用された回答
Yoshio
2018 年 11 月 21 日
編集済み: Yoshio
2018 年 11 月 21 日
一つの行列が、一列のベクトルという意味でしたら、以下のコードではいかがでしょうか?
syms Z1 Z2;
n = 0;
for i=0:0.01:3.9
n = n+1;
Z1=1+i;
a1=(Z1*sin(Z1)-Z1^2*cos(Z1))/(2-2*cos(Z1)-Z1*sin(Z1));
b1=(Z1^2-Z1*sin(Z1))/(2-2*cos(Z1)-Z1*sin(Z1));
a2=(Z2*sin(Z2)-Z2^2*cos(Z2))/(2-2*cos(Z2)-Z2*sin(Z2));
b2=(Z2^2-Z2*sin(Z2))/(2-2*cos(Z2)-Z2*sin(Z2)); %安定関数
K1=2*((a2-b2)+3/2)+(3/4+12);
K2=2*((a1-b1)+3/2)+(3/4+12);
K3=2*((a1-b1+a2-b2)+(3/4+4));
K5=-(3/4+2); %行列要素
K=[K3 0 0 0 0 0;0 K3 0 0 0 0;0 0 K1 K5 0 0;0 0 K5 K2 0 0;...
0 0 0 0 K1 K5;0 0 0 0 K5 K2]; %座屈モードⅠの行列
ka=K(1,1); %モードタイプaの行列
solx=vpasolve(det(ka)==0,Z2,[0 10]);
a(n) = solx; %行ベクトルに保存
end
A = a.' % 解が複素数の場合を考慮
その他の回答 (3 件)
Yoshio
2018 年 11 月 24 日
シンボリックでも指定の大きさでメモリの事前割り当てができますので、修正してみました。
syms Z1 Z2;
index = 0:0.01:3.9;
m = length(index);
A = sym(zeros(m,1));
n = 0;
for i = 0:0.01:3.9;
n = n+1;
Z1=1+i;
a1=(Z1*sin(Z1)-Z1^2*cos(Z1))/(2-2*cos(Z1)-Z1*sin(Z1));
b1=(Z1^2-Z1*sin(Z1))/(2-2*cos(Z1)-Z1*sin(Z1));
a2=(Z2*sin(Z2)-Z2^2*cos(Z2))/(2-2*cos(Z2)-Z2*sin(Z2));
b2=(Z2^2-Z2*sin(Z2))/(2-2*cos(Z2)-Z2*sin(Z2)); %安定関数
K1=2*((a2-b2)+3/2)+(3/4+12);
K2=2*((a1-b1)+3/2)+(3/4+12);
K3=2*((a1-b1+a2-b2)+(3/4+4));
K5=-(3/4+2); %行列要素
K=[K3 0 0 0 0 0;0 K3 0 0 0 0;0 0 K1 K5 0 0;0 0 K5 K2 0 0;...
0 0 0 0 K1 K5;0 0 0 0 K5 K2]; %座屈モードⅠの行列
ka=K(1,1); %モードタイプaの行列
%solx=vpasolve(det(ka)==0,Z2,[0 10]);
A(n) = vpasolve(det(ka)==0,Z2,[0 10]);
end
Yoshio
2018 年 11 月 26 日
編集済み: Yoshio
2018 年 11 月 26 日
解の精度をどの程度求めるかにもよると思いますが、シンボリック関数 ka を
ka=K(1,1); %モードタイプaの行列
y = matlabFunction(det(ka));
とすることで、通常の関数になりますから、一変数の最小化問題として、fzero等を用いて
[x,fval]= fzero(y,x0)
のように解とその時の評価値を調べ、xが0から10の範囲でabs(fval)が最小となるxを求めれば良いと思います。非線形の問題ですので、初期値x0と解x に関する許容誤差 の設定は、適切に行う必要があります。
参考
カテゴリ
Help Center および File Exchange で 数学 についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!