for文による繰り返​し計算の結果で、所定​の条件を満たしたもの​をエクセルに随時記入​していく方法

13 ビュー (過去 30 日間)
Noruji Muto
Noruji Muto 2020 年 2 月 11 日
コメント済み: Noruji Muto 2020 年 2 月 12 日
お世話になります。
この質問は、下記URLの質問に関連した内容になっています。
プログラムの背景等を知りたい方はこちらを参照してください。
for文で作ったいくつかの数式において所定の条件を満たす数値の組み合わせを、
エクセルファイルに書き込んで行きたいのですが、やり方がわかりません。
エクセルファイルへの書き込みのイメージとしては下図のような感じで、
for文内で指定している条件を満たす時の数値をそれぞれ記入していく感じです。
(表上側のm1等の文字類は、後でコード内で使用するものです。)
表の縦方向のセル数(行数)は、
条件式に当てはまる数値の組み合わせがあるだけ生成されるようにしたいのですが、
そのやり方がわかりません。
以下に現状のコードを示します。
clc
clear
close all
L=0.260
m3=0.13
g=9.8
Lcm2=L-Lcm1
F=10^-9
d=0.01%ころがり摩擦係数(オーダー仮定)
for i =0.1:0.1:5
for j=0.1:0.01:5
for n=0.01:0.01:0.26
m1=i
m2=j
Lcm1=n
k=(m2)*g*Lcm2-(m1)*g*(Lcm1)
if k>0
T=d*((m1)+(m2)+m3)*g
p=(((m1)*g*(Lcm1))+(F*(Lcm1)))-(((m2)*g*Lcm2)+T)
if p>0
A=A(1:5,:)%この辺以降がわかりません
A={'m1','m2','Lcm1','Lcm2','k';m1 m2 Lcm1 Lcm2 k}
A(:,1:5)
filename = 'data114514.xlsx';
writetable(A,filename,'Sheet',1,'Range','B1::')
end
end
end
end
end
for文内でやりたい事は以下の通りです。
①m1,m2を0.1を初期値として0.1の刻み幅で5まで増加させる
②Lcm1は0.01を初期値として0.01の刻み幅で0.26まで増加する。
③Lcm2は、=L-Lcm1と定義。Lは0.26で固定
④k>0の時、Tとpの算出に進む。
⑤p>0の時(つまりk>0も満たしているとき),
⑥その時の'm1','m2','Lcm1','Lcm2','k'の値を随時エクセルに書き込んで表を作成
また、
エクセルファイルを作る場所を指定する方法をご存じの方は是非教えていただけないでしょうか?
作ったはずのファイルを検索にかけても見つからない問題が発生しています。
よろしくお願いいたします。
  2 件のコメント
stozaki
stozaki 2020 年 2 月 11 日
7行目のLcm1が未定義となっていますので、定義して頂けますか?
Noruji Muto
Noruji Muto 2020 年 2 月 12 日
stozaki様
以下のように修正してみました。
・9行目にLcm1=0を追加
・15~17行目のm1,m2,Lcm1の定義を、元の値+i or j or k といった感じに変えました。
エクセルファイルが生成された、
または既存の同名のエクセルファイルにデータが書き込まれた様子は未だありません。
clc
clear
close all
L=0.260
m1=0
m2=0
m3=0.13
g=9.8
Lcm1=0
F=10^-9
d=0.01%ころがり摩擦係数(オーダー仮定)
for i =0.1:0.1:5
for j=0.1:0.01:5
for n=0.01:0.01:0.26
m1=m1+i
m2=m2+j
Lcm1=Lcm1+n
Lcm2=L-Lcm1
k=(m2)*g*Lcm2-(m1)*g*(Lcm1)
if k>0
T=d*((m1)+(m2)+m3)*g
p=(((m1)*g*(Lcm1))+(F*(Lcm1)))-(((m2)*g*Lcm2)+T)%トルクのつり合い式
if p>0
A=A(1:5,:)
A={'m1','m2','Lcm1','Lcm2','k';m1 m2 Lcm1 Lcm2 k}
A(:,1:5)
filename = 'data114514.xlsx';
writetable(A,filename,'Sheet',1,'Range','B1::')
end
end
end
end
end

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

採用された回答

Kenta
Kenta 2020 年 2 月 12 日
こんにちは、こちらにあるように、「;」を各行の最後に打って、コマンドウィンドウにその都度結果が出力されないようにしたほうが良いと思います。https://jp.mathworks.com/matlabcentral/answers/501053-
保存のほうですが、さらっと見た限りでは、セル配列でAが出力されるようなので、以下のようにwritecellで対応すればよろしいかと思います。エクセルにも保存されました。
今回の係数では、pの値が正になることはなく、ループ内のコードが実行されなかったため、保存のコードも実行されず、エクセルファイルが出力されなかったのではないでしょうか。
ひとまず、望んだ値がこのコードで出力されているかはわかりませんが、Aで定義された変数はdata114514.xlsxという名前で保存できていると思います。
clc
clear
close all
L=0.260;
m1=0;
m2=0;
m3=0.13;
g=9.8;
Lcm1=0;
F=10^-9;
d=0.01;%ころがり摩擦係数(オーダー仮定)
for i =0.1:0.1:5
for j=0.1:0.01:5
for n=0.01:0.01:0.26
m1=m1+i;
m2=m2+j;
Lcm1=Lcm1+n;
Lcm2=L-Lcm1;
k=(m2)*g*Lcm2-(m1)*g*(Lcm1);
if k>0
T=d*((m1)+(m2)+m3)*g;
p=(((m1)*g*(Lcm1))+(F*(Lcm1)))-(((m2)*g*Lcm2)+T);%トルクのつり合い式
if p>0
A=A(1:5,:);
A={'m1','m2','Lcm1','Lcm2','k';m1 m2 Lcm1 Lcm2 k};
filename = 'data114514.xlsx';
writecell(A,filename)
end
end
end
end
end
  9 件のコメント
Kenta
Kenta 2020 年 2 月 12 日
承知いたしました。またご不明な点がございましたらご連絡ください。よろしくお願いいたします。
Noruji Muto
Noruji Muto 2020 年 2 月 12 日
お世話になっています。
不明点が出てきましたので新しく質問スレッドを立ち上げました。

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

その他の回答 (0 件)

Community Treasure Hunt

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

Start Hunting!