is the "for loop" is wrong? what can be the solution?

clc
ti = 0;
tf = 100E-4;
tspan=[ti tf];
o = 1E6;
tc = 70E-9;
tf = 240E-6;
a1 = 0.02;
a2 = 0.02;
P1 = 1;
P2 = 1;
k = 0.033;
l = 0.5;
f = @(t,y) [ ((y(2)-a1).*y(1)) + k.*(y(1).*cos(y(3))).*(2/tc);
(P1 - y(2).*(1+y(1)))./tf;
o - (k / tc) * 2 * sin(y(3));
];
[T,Y] = ode45(f,tspan,[1;1;0].*10E-3);
% this is the for loop, maybe this is wrong
Y(:,3) = -3:0.01:3;
U = zeros(length(k),1) ;
for i = 1:length(k)
U(i) = -o.*(Y(:,3)) - 2.*(k./tc).*cos(Y(:,3) - pi/2)
end
%plotting the graphs
plot(T,Y(:,3));
xlim([0 10E-5])
xlabel('t')
ylabel('phase difference')
legend('k = 0.033')
plot(Y(:,3),U)

댓글 수: 6

Hi!
The below lines of code are not correct. Read the comments below and try to rereview your code, and maybe you share what you are trying to do with this for loop.
Y(:,3) = -3:0.01:3; % this assignement is not correct size(-3:0.01:3) is different from size(Y(:,3))
U = zeros(length(k),1) ; % k is a scalar thus U is a scalar
for i = 1:length(k) % length(k) is one >> one iteratio, what is the point to use a for loop!!
U(i) = -o.*(Y(:,3)) - 2.*(k./tc).*cos(Y(:,3) - pi/2) % This assignment is not possible size(U(i)) does not match the size of the right side.
end
I calculated the Y(:,3) which represent Φ, i want to calculate the U for different value of Φ, where the U is
then I want to plot (Y(:,3), Φ)
Okay now is clear what you re trying to do. You do not need a loop. One of MATLAB advantages is vectorization. Check out @Torsten answer.
VBBV
VBBV 2022년 7월 20일
You can also use for loop as shown in your code. But plot you mentioned plot (Y(:,3), Φ) is strange. It will be a straight line since Y(:,3) and Φ are same according to your equation and code written. Do you mean plot (Y(:,3), U) ?
VBBV
VBBV 2022년 7월 20일
The for loop code works well as shown in my answer below. which can also be done without a loop.
yeah I mean plot (Y(:,3), U) and the graph is correct too.

댓글을 달려면 로그인하십시오.

 채택된 답변

VBBV
VBBV 2022년 7월 20일
편집: VBBV 2022년 7월 20일
clc
ti = 0;
tf = 100E-4;
tspan=[ti tf];
o = 1E6;
tc = 70E-9;
tf = 240E-6;
a1 = 0.02;
a2 = 0.02;
P1 = 1;
P2 = 1;
k = 0.033;
l = 0.5;
f = @(t,y) [ ((y(2)-a1).*y(1)) + k.*(y(1).*cos(y(3))).*(2/tc);
(P1 - y(2).*(1+y(1)))./tf;
o - (k / tc) * 2 * sin(y(3));
];
[T,Y] = ode45(f,tspan,[1;1;0].*10E-3);
% this is the for loop, maybe this is wrong ... yes this assignment is
% incorrect
Y(:,3) = linspace(-3,3,length(Y)); % change this
U = zeros(length(Y),1) ;
for i = 1:length(Y)
U(i) = -o.*(Y(i,3)) - 2.*(k./tc).*cos(Y(i,3) - pi/2); % also this
end
%plotting the graphs
figure(1)
plot(T,Y(:,2));
figure(2)
plot(T,U)
xlim([0 10E-5])
xlabel('t')
ylabel('phase difference')
legend('','k = 0.033')
Warning: Ignoring extra legend entries.
plot(T,U)
You can plot both U and T variables , but for loop needs modififcation

댓글 수: 2

clc
ti = 0;
tf = 100E-4;
tspan=[ti tf];
o = 1E6;
tc = 70E-9;
tf = 240E-6;
a1 = 0.02;
a2 = 0.02;
P1 = 1;
P2 = 1;
k = 0.033;
l = 0.5;
f = @(t,y) [ ((y(2)-a1).*y(1)) + k.*(y(1).*cos(y(3))).*(2/tc);
(P1 - y(2).*(1+y(1)))./tf;
o - (k / tc) * 2 * sin(y(3));
];
[T,Y] = ode45(f,tspan,[1;1;0].*10E-3);
% this is the for loop, maybe this is wrong ... yes this assignment is
% incorrect
Y(:,3) = linspace(-3,3,length(Y)); % change this
U = zeros(length(Y),1) ;
for i = 1:length(Y)
U(i) = -o.*(Y(i,3)) - 2.*(k./tc).*cos(Y(i,3) - pi/2); % also this
end
%plotting the graphs
figure(1)
plot(Y(:,3),U); % i guess you are looking for this
i guess you are looking for this
yes, this graph is correct that what i expected, without for loop I get a straight line.

댓글을 달려면 로그인하십시오.

추가 답변 (1개)

Torsten
Torsten 2022년 7월 20일
ti = 0;
tf = 100E-4;
tspan=[ti tf];
o = 1E6;
tc = 70E-9;
tf = 240E-6;
a1 = 0.02;
a2 = 0.02;
P1 = 1;
P2 = 1;
k = 0.033;
l = 0.5;
f = @(t,y) [ ((y(2)-a1).*y(1)) + k.*(y(1).*cos(y(3))).*(2/tc);
(P1 - y(2).*(1+y(1)))./tf;
o - (k / tc) * 2 * sin(y(3));
];
[T,Y] = ode45(f,tspan,[1;1;0].*10E-3);
% this is the for loop, maybe this is wrong
U = -o.*Y(:,3) - 2.*(k./tc).*cos(Y(:,3) - pi/2);
%plotting the graphs
plot(T,Y(:,3));
xlim([0 10E-5])
xlabel('t')
ylabel('phase difference')
legend('k = 0.033')
plot(Y(:,3),U)

카테고리

도움말 센터File Exchange에서 Loops and Conditional Statements에 대해 자세히 알아보기

태그

질문:

2022년 7월 20일

댓글:

2022년 7월 20일

Community Treasure Hunt

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

Start Hunting!

Translated by