forループで1ルー​プごとの最大値をプロ​ットするにはどうすれ​ばよいですか?

値が変化するときの計算値の変化を調べようと思い、forループを使ってコードを組んでいます。
以下のようなコードの場合、
①A=0のときのEの最大値、A=1のときのEの最大値……というように1回ループするごとに得られるEの値の中から、最大値だけを取り出し、AとE最大値だけの2次元グラフを作りたいのですが、どうすればよいでしょうか?
②A=0,A=1......のそれぞれでEが最大になる時のBとCの値も取得したいのですがどうすればよいですか?
px=[];
py=[];
pz=[];
pa=[];
for A=0:1:30
for B=1:5:45
for C=-45:5:45
D=B/C;
E=sind(A)+sind(D);
px=[px,A];
py=[py,B];
pz=[pz,C];
pa=[pa,E];
end
end
end
scatter(px,pa);
よろしくお願いします。

 Respuesta aceptada

Hernia Baby
Hernia Baby el 24 de En. de 2022

0 votos

Aについてはmaxで示し、maxAに格納していきます
Dが共通なので先に計算しています
maxAの時のインデックスを格納し、BとCにidx1,idx2として返しています
clear,clc,close all;
A = 0:1:30;
B = 1:5:45;
C = -45:5:45;
for jj = 1:length(B)
for kk = 1:length(C)
D(jj,kk) = B(jj)/C(kk);
end
end
E = zeros(size(D));
for ii = 1:length(A)
E=sind(A(ii))+sind(D);
maxA(ii) = max(max(E));
[idx1(ii),idx2(ii)] = find(E==maxA(ii));
end
scatter(A,maxA)

4 comentarios

Hernia Baby
Hernia Baby el 24 de En. de 2022
Dはmeshgridでも代用できます
B = 1:5:45;
C = -45:5:45;
[BB,CC]=meshgrid(B,C);
DD=BB./CC;
DD = DD'
DD = 9×19
-0.0222 -0.0250 -0.0286 -0.0333 -0.0400 -0.0500 -0.0667 -0.1000 -0.2000 Inf 0.2000 0.1000 0.0667 0.0500 0.0400 0.0333 0.0286 0.0250 0.0222 -0.1333 -0.1500 -0.1714 -0.2000 -0.2400 -0.3000 -0.4000 -0.6000 -1.2000 Inf 1.2000 0.6000 0.4000 0.3000 0.2400 0.2000 0.1714 0.1500 0.1333 -0.2444 -0.2750 -0.3143 -0.3667 -0.4400 -0.5500 -0.7333 -1.1000 -2.2000 Inf 2.2000 1.1000 0.7333 0.5500 0.4400 0.3667 0.3143 0.2750 0.2444 -0.3556 -0.4000 -0.4571 -0.5333 -0.6400 -0.8000 -1.0667 -1.6000 -3.2000 Inf 3.2000 1.6000 1.0667 0.8000 0.6400 0.5333 0.4571 0.4000 0.3556 -0.4667 -0.5250 -0.6000 -0.7000 -0.8400 -1.0500 -1.4000 -2.1000 -4.2000 Inf 4.2000 2.1000 1.4000 1.0500 0.8400 0.7000 0.6000 0.5250 0.4667 -0.5778 -0.6500 -0.7429 -0.8667 -1.0400 -1.3000 -1.7333 -2.6000 -5.2000 Inf 5.2000 2.6000 1.7333 1.3000 1.0400 0.8667 0.7429 0.6500 0.5778 -0.6889 -0.7750 -0.8857 -1.0333 -1.2400 -1.5500 -2.0667 -3.1000 -6.2000 Inf 6.2000 3.1000 2.0667 1.5500 1.2400 1.0333 0.8857 0.7750 0.6889 -0.8000 -0.9000 -1.0286 -1.2000 -1.4400 -1.8000 -2.4000 -3.6000 -7.2000 Inf 7.2000 3.6000 2.4000 1.8000 1.4400 1.2000 1.0286 0.9000 0.8000 -0.9111 -1.0250 -1.1714 -1.3667 -1.6400 -2.0500 -2.7333 -4.1000 -8.2000 Inf 8.2000 4.1000 2.7333 2.0500 1.6400 1.3667 1.1714 1.0250 0.9111
峻 佐藤
峻 佐藤 el 25 de En. de 2022
ご回答いただきありがとうございます。とても参考になりました。
追加の質問になってしまうのですが、maxAそれぞれの時にA,B,Cがどの値を取っているかを調べ、三次元グラフを作成することは可能でしょうか?
お手数をおかけしますが、ご回答いただけると幸いです。
Hernia Baby
Hernia Baby el 25 de En. de 2022
実は以下の部分でとっています
[idx1(ii),idx2(ii)] = find(E==maxA(ii));
clear,clc,close all;
A = 0:1:30;
B = 1:5:45;
C = -45:5:45;
[BB,CC]=meshgrid(B,C);
DD=BB./CC;
D = DD';
E = zeros(size(D));
for ii = 1:length(A)
E=sind(A(ii))+sind(D);
maxA(ii) = max(max(E));
[idx1(ii),idx2(ii)] = find(E==maxA(ii));
end
例として最後だけプロットしてみますか
@Hiro さんのコードを応用します
E = E'; % D=DD'の影響です
surf(CC,BB,E,'Facealpha',0.3);
title(sprintf("A=%d",A(end)))
hold on
B_maxA = B(idx1);
C_maxA = C(idx2);
scatter3(C_maxA(end),B_maxA(end),maxA(end),'r','filled')
xlabel 'C'
ylabel 'B'
zlabel 'E'
view([25.679 44.382])
峻 佐藤
峻 佐藤 el 26 de En. de 2022
詳しく解説していただきありがとうございます!
疑問点が解消されました。

Iniciar sesión para comentar.

Más respuestas (1)

Hiro Yoshino
Hiro Yoshino el 24 de En. de 2022

0 votos

既に回答が出ているので、私からは MATLAB っぽいやり方を紹介します。
LiveEditor で実行すると添付にあるような動画を作製できます。
% データ
B=1:5:45;
C=-45:5:45;
% Meshgrid を作製します
[Bmesh,Cmesh] = meshgrid(B,C);
D = (Bmesh./Cmesh);
sindD = sind(D);
% A に沿ってループ
for A=0:1:30
E = sindD + sind(A);
surf(Bmesh,Cmesh,E);
title(sprintf("A=%d",A))
drawnow;
end

Categorías

Más información sobre 数学 en Centro de ayuda y File Exchange.

Productos

Versión

R2021b

Preguntada:

el 24 de En. de 2022

Comentada:

el 26 de En. de 2022

Community Treasure Hunt

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

Start Hunting!