if function not working

4 次查看(过去 30 天)
Cameron Aldred
Cameron Aldred 2017-4-24
评论: KL 2017-4-25
Hi, I'm trying to simulate an earthquake signal by adding 12 sine waves together (A,B,C...L). Each sine waves needs to start and stop at different times, and I assumed I can do this by creating an if function for each sine wave individually - however I cant get it to work properly. When I run the code and plot (t,earthquake) the graph shows nothing which suggests all the sine waves are zero the whole time :(
So I'm guessing there is a problem with the if functions?
Here is my code, would appreciate help if someone can tell me what's wrong with it. Thanks!!
close all;clc;
%%EARTHQUAKE = SUM OF 12 SINE WAVES A,B,C,D,E,F,G,H,I,J,K,L:
SCALER = 1.7;
%%INPUTS
%S = acceleration(g) T = period(s) start --------> end
Sa = 0.12; Ta = 0.1; A_start = 0; A_end = 22;
Sb = 0.15; Tb = 0.13; B_start = 1; B_end = 18;
Sc = 0.16; Tc = 0.14; C_start = 2; C_end = 16;
Sd = 0.165; Td = 0.15; D_start = 3; D_end = 15;
Se = 0.17; Te = 0.17; E_start = 4; E_end = 14;
Sf = 0.166; Tf = 0.2; F_start = 3; F_end = 19;
Sg = 0.14; Tg = 0.4; G_start = 2; G_end = 28;
Sh = 0.12; Th = 0.4; H_start = 1; H_end = 31;
Si = 0.1; Ti = 0.5; I_start = 0; I_end = 40;
Sj = 0.04; Tj = 1; J_start = 0; J_end = 20;
Sk = 0.025; Tk = 1.5; K_start = 0; K_end = 45;
Sl = 0.02; Tl = 2; L_start = 0; L_end = 45;
%%IMPLEMENTING SINE WAVE DURATIONS
if t>A_start
A = Sa*SCALER*sin(t* 2*pi/Ta);
elseif t>A_end
A = Sa*SCALER*sin(t* 2*pi/Ta);
else
A = 0;
end
if t>B_start
B = Sb*SCALER*sin(t* 2*pi/Tb);
elseif t>Bend
B = Sb*SCALER*sin(t* 2*pi/Tb);
else
B = 0;
end
if t>C_start
C = Sc*SCALER*sin(t* 2*pi/Tc);
elseif t>C_end
C = Sc*SCALER*sin(t* 2*pi/Tc);
else
C = 0;
end
if t>D_start
D = Sd*SCALER*sin(t* 2*pi/Td);
elseif t>D_end
D = Sd*SCALER*sin(t* 2*pi/Td);
else
D = 0;
end
if t>E_start
E = Se*SCALER*sin(t* 2*pi/Te);
elseif t>E_end
E = Se*SCALER*sin(t* 2*pi/Te);
else
E = 0;
end
if t>F_start
F = Sf*SCALER*sin(t* 2*pi/Tf);
elseif t>F_end
F = Sf*SCALER*sin(t* 2*pi/Tf);
else
F = 0;
end
if t>G_start
G = Sg*SCALER*sin(t* 2*pi/Tg);
elseif t>G_end
G = Sg*SCALER*sin(t* 2*pi/Tg);
else
G = 0;
end
if t>H_start
H = Sh*SCALER*sin(t* 2*pi/Th);
elseif t>H_end
H = Sh*SCALER*sin(t* 2*pi/Th);
else
H = 0;
end
if t>I_start
I = Si*SCALER*sin(t* 2*pi/Ti);
elseif t>I_end
I = Si*SCALER*sin(t* 2*pi/Ti);
else
I = 0;
end
if t>Jstart
J = Sj*SCALER*sin(t* 2*pi/Tj);
elseif t>J_end
J = Sj*SCALER*sin(t* 2*pi/Tj);
else
J = 0;
end
if t>K_start
K = Sk*SCALER*sin(t* 2*pi/Tk);
elseif t>K_end
K = Sk*SCALER*sin(t* 2*pi/Tk);
else
K = 0;
end
if t>L_start
L = Sl*SCALER*sin(t* 2*pi/Tl);
elseif t>L_end
L = Sl*SCALER*sin(t* 2*pi/Tl);
else
L = 0;
end
%%SUM & PLOT
earthquake = A+B+C+D+E+F+G+H+I+J+K+L;
plot(t,earthquake)
grid on
  1 个评论
Stephen23
Stephen23 2017-4-24
There is no problem with if. You just did not read the documentation, in particular this line: "An expression is true when its result is nonempty and contains only nonzero elements (logical or real numeric). Otherwise, the expression is false"
Think about what that means if the expression is non-scalar: what does that mean if there are two elements (answer: they both have to be true).
In any case doing this using if statements is going to be pointlessly complicated: you should simply use indexing and vectorized code.

请先登录,再进行评论。

采纳的回答

KL
KL 2017-4-24
编辑:KL 2017-4-24
Hi,
Assuming t is a vector, which it should be, you should use indexing to compare it in the if conditions, for example,
if t(i,1)>=A_start && t(i,1)<=A_end
% code
else
% code
end
what exactly is the difference between if and elseif in your code?
  4 个评论
Stephen23
Stephen23 2017-4-25
编辑:Stephen23 2017-4-25
Or learn how to use MATLAB efficiently by using logical idnexing:
>> t = (0:0.01:2)';
>> A = zeros(size(t));
>> idx = t>=0 & t<=1;
>> A(idx) = 2*sin(2*pi*t(idx));
>> A(~idx) = 0;
Why waste your life writing ugly loops as if MATLAB was some ugly low-level language like C++ ?
KL
KL 2017-4-25
oh yeah, that's indeed the better way. Thanks Stephen.

请先登录,再进行评论。

更多回答(0 个)

类别

Help CenterFile Exchange 中查找有关 Earthquake Engineering 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by