for文を使ったプロット

5 views (last 30 days)
Daichi
Daichi on 21 Nov 2022
Commented: Atsushi Ueno on 22 Nov 2022
以下のようにfor文をまわしてXの値に対するF0xの値をプロットしたいのですがF0xは最後の値しか保存されません。どうしたら正しくプロットできるか教えていただきたいです。
g = 9.81 ;
l=1;
L=1;
m0=1;
m1=1;
m2=1;
m3=1;
K= 30;
X=1:1:10;
for i=1:length(X)
F0x = zeros(1,length(X));
B = zeros(12,length(X));
A = zeros(12,13,length(X))
A1 = zeros(13,12,length(X))
A(:,:,i) = [1,0,0,0,0,0,-1,0,0,0,0,0,0;
0,1,0,0,0,0,0,-1,0,0,0,0,0;
0,0,0,0,0,0,-l*sin(X(i)),l*cos(X(i)),0,0,0,0,1;
0,0,1,0,0,0,0,0,-1,0,0,0,0;
0,0,0,1,0,0,0,0,0,-1,0,0,0;
0,0,0,0,0,0,0,0,-l*sin(X(i)),l*cos(X(i)),0,0,0;
0,0,0,0,1,0,0,0,0,0,-1,0,0;
0,0,0,0,0,1,0,0,0,0,0,-1,0;
0,0,0,0,0,0,0,0,0,0,-(l)*sin(X(i)),(l)*cos(X(i)),0;
0,0,0,0,0,0,1,0,1,0,1,0,0;
0,0,0,0,0,0,0,1,0,1,0,1,0;
0,0,0,0,0,0,0,L,0,0,0,-L,0];
A1(:,:,i) = pinv(A(:,:,i));
B(:,i) = [m0*sin(X(i));m0*(cos(X(i))+g);0;sin(X(i));cos(X(i))+g;0;sin(X(i));cos(X(i))+g;0;sin(X(i));cos(X(i))+g;0];
A2(:,:,i) = A1(:,:,i) * B(:,i)
F0x(1,i) = A2(1,1,i);
end
plot(X(i),F0x(i),"LineWidth",1.0)

Accepted Answer

Atsushi Ueno
Atsushi Ueno on 21 Nov 2022
Edited: Atsushi Ueno on 22 Nov 2022
>どうしたら正しくプロットできるか教えていただきたいです
for ループを10回回って抜け出た後の i の値は10です。
なので下記の plot 関数を実行するとx(10)に対するF0x(10)の1点しか表示されません。しかも plot 関数はデフォルトでマーカー(〇や*等の印)を表示しない為、下記を実行しても何も表示されません。
plot(X(i),F0x(i),"LineWidth",1.0)
下記の様に添え字を取ればベクトル全体を扱う事になり、期待通りにプロットされます。
添え字を全体に渡り指定しても良いです。書き方も何種類かあります。
plot(X,F0x,"LineWidth",1.0);
plot(X(:),F0x(:),"LineWidth",1.0); % 上と同じ動作になる
plot(X(1:10),F0x(1:10),"LineWidth",1.0); % 上と同じ動作になる
  2 Comments
Atsushi Ueno
Atsushi Ueno on 22 Nov 2022
何を計算しているのか把握していませんが、下記はforループの外で初期化する必要があると思います。
下記4行をfor文の外に移動してプロットした結果を更新して置きました。
F0x = zeros(1,length(X));
B = zeros(12,length(X));
A = zeros(12,13,length(X));
A1 = zeros(13,12,length(X));

Sign in to comment.

More Answers (0)

Tags

Products


Release

R2022b

Community Treasure Hunt

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

Start Hunting!