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

お世話になります。
この質問は、下記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が未定義となっていますので、定義して頂けますか?
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

2 个投票

こんにちは、こちらにあるように、「;」を各行の最後に打って、コマンドウィンドウにその都度結果が出力されないようにしたほうが良いと思います。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 个评论

Noruji Muto
Noruji Muto 2020-2-12
こんにちは。
;をつけてみて、おっしゃる通りに修正してみましたが、
エクセルファイル「data114514」が見つかりません。
エクスプローラーで検索をかけてみたり、PCを再起動したり、
ファイル名を別のものに変えたりしましたがダメでした。
Kenta
Kenta 2020-2-12
ご返信ありがとうございます。私のコメントのほう、うまく伝わっておらず申し訳ございません。
エクセルファイルがないのは、pの値が正にならず、常にそのループに入れていないからと思われます。
pの値の閾値を変えるか、ほかのパラメータ・式自体を変更し、pの値が正になれば、保存のプロセスに入ります。「⑤p>0の時(つまりk>0も満たしているとき)」が満たされず、エクセルへの保存がなかったと思うのですがいかがでしょうか。
試しにk>-20, p>-20の時に保存プロセスに入るようにしてみました。
以下は23行目以降を抜粋したものです。
if k>-20%%ここを変更
T=d*((m1)+(m2)+m3)*g;
p=(((m1)*g*(Lcm1))+(F*(Lcm1)))-(((m2)*g*Lcm2)+T);%トルクのつり合い式
if p>-20%%ここを変更
A=A(1:5,:);
A={'m1','m2','Lcm1','Lcm2','k';m1 m2 Lcm1 Lcm2 k};
filename = 'kekka.xlsx';
xlswrite(filename,A)
すると、以下のようなエラーが出てきました。
(hanteiというのは、私が名前をつけている本コードの.mファイル名です。)
関数または変数 'A' が未定義です。
エラー: hantei (line 24)
A=A(1:5,:);
どうもA=A(1:5,:)では行列(表)を定義することができなかったようです。
解決方法を探す必要があります。
Kenta
Kenta 2020-2-12
失礼いたしました。そのエラーの行を削除いただけますか。ひとまずそれで保存自体ができるか教えていただけますか
以下のコードのように修正しました。
if k>-20
T=d*((m1)+(m2)+m3)*g;
p=(((m1)*g*(Lcm1))+(F*(Lcm1)))-(((m2)*g*Lcm2)+T);%トルクのつり合い式
if p>-20
%A=A(1:5,:); コメント化によって消しました。
A={'m1','m2','Lcm1','Lcm2','k';m1 m2 Lcm1 Lcm2 k;};
filename = 'kekka.xlsx';
xlswrite(filename,A)
保存はできました。
しかしながら繰り返しの条件に合致する組み合わせは全てエクセルに書き込みたいのに対して、結果が一組しか書き込まれない状況です。
エクセルの結果.png
Kenta
Kenta 2020-2-12
はい、保存そのものはこれでできます。
ただ、毎回Aに同じ値を入れているので、複数回全く同じ値を持つ変数を保存していることになります。
1)該当する変数の数だけエクセルのファイルを保存する、または2)該当する変数を適宜累積させていき、最後に1つ、エクセルファイルを保存するのかわかりませんが、おそらく2のほうでしょうか。
2)の場合は、毎回ループごとに、A(i,1:5)=(変数)のように、順次、変数を保存していき、最後にループの外でエクセルファイルを保存したら良いと思います。
上のコマンドは例で、どのように累積させるかは保存する変数の型によります。
ひとまず、「エクセルファイルを作る場所を指定する方法をご存じの方は是非教えていただけないでしょうか?作ったはずのファイルを検索にかけても見つからない問題が発生しています。」ということでしたので、保存できたようでよかったです。
上のように順次、累積させていく件、また不明点があれば、いってもらえればと思います。
Noruji Muto
Noruji Muto 2020-2-12
承知しました。
このスレッドのタイトルにある問題そのものは解決できたので、
ひとまず回答をアクセプトさせていただきます。
また何かあったら他のスレッドで質問するかと思います。
その時はよろしくお願い致します。
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!