Engr/Math/Physics 25. Chp4 MATLAB Programming-4. Bruce Mayer, PE Licensed Electrical & Mechanical Engineer [email protected] Please HELP Rm 3906A Lab. Please do NOT SAVE ANY Files to the DESKTOP on the computers in Rm3906A Lab
Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.
Engr/Math/Physics 25
Chp4 MATLABProgramming-4
Bruce Mayer, PE
Licensed Electrical & Mechanical [email protected]
The conditional statements (if, else, elseif) we learned last time allowed us to determine at run-time whether or not to execute a block of code.
What these Decision Statements Do NOT do is to allow us to execute a block more than once
The TWO Things that Computers Do Better than People
STORE Massive Amounts of Data
REPEAT operations
A “LOOP” is a Program Structure that REPEATS Until some CONDITION is MET
The NUMBER of Loops may Be
Known a priori (ahead of time)
No. of Loops Determined by simple COUNTING
Determined Dynamically
No. of Loops Determined by a DECISION statement
The Loop consists of
A Condition Test
A Repeated Statement-Block
PreTest Loop
PostTest Loop
MidTest Loop
A PreTested, COUNTED Loop
Start
Set k = m
k ≤ n?
Increment kby s
True
Statements-1
False
end
Statements
Given for Loop Counting Variable: k=m:s:n
The step value s may be negative
Example: k = 10:-2:4 produces k = 10, 8, 6, 4
If s is omitted, the step value defaults to +1
If s is positive, the loop will not be executed if m is greater than n
If s is negative, the loop will not be executed if m is less than n
If mequalsn, the loop will be executed only once
If the step value s is not an integer, round-off errors can cause the loop to execute a different number of passes than intended
Time For
Live Demo
The continue statement passes control to the next iteration of the loop in which it appears, skipping any remaining statements in the body of the loop.
The Following Code Uses a continue
statement to avoid taking the log of a negative number.
x = [10,1000,-10,100];
y = NaN*x;
for k = 1:length(x)
if x(k) < 0
continue
end
y(k) = log10(x(k));
end
y = 1, 3, NaN, 2
Let’s Fine Tune the No-Neg-Log Code by COMMENTING OUT the if-continue Commands
x = [10,1000,-10,100];
y = NaN*x;
for k = 1:length(x)
%if x(k) < 0
%continue
%end
y(k) = log10(x(k));
end
y =
1.0000 3.0000 1.0000 + 1.3644i 2.0000
The use of loops and branching can often be avoided, thus creating simpler and faster programs by using a logical array as a mask that selects elements of another array.
Any elements not selected will remain unchanged.
The following session creates the logical array D from the 3x3 numeric array B
Logical Mask Session
>> B = [0, -1, 4; 9, -14, 25; -34, 49, 64]
B =
0 -1 4
9 -14 25
-34 49 64
>> D = (B >= 0)
D =
1 0 1
1 0 1
0 1 1
Mask Array →a Logical that “masks out” Negative numbers
Original B =
0 -1 4
9 -14 25
-34 49 64
>> B(D) = sqrt(B(D))
B =
0 -1 2
3 -14 5
-34 7 8
>> B(~D) = B(~D) + 50
B =
0 49 2
3 36 5
16 7 8
Negative Values Unchanged → Masked OUT by D(m,n) = 0
Positive Values Unchanged → Masked OUT by D(m,n) = 1
>> x = [-7 0 8 5 -2]
x =
-7 0 8 5 -2
>> nn = x>=0 % the logical mask
nn =
0 1 1 1 0
>> y = x(nn)
y =
0 8 5
>> sqrt1 = sqrt(x(nn))
sqrt1 =
0 2.8284 2.2361
>> sqrt2 = x % make starting copy of x
sqrt2 =
-7 0 8 5 -2
>> sqrt2(nn) = sqrt(sqrt2(nn))
sqrt2 =
-7.0000 0 2.8284 2.2361 -2.0000
ONLY the Three Sq-Roots
the Three Sq-Roots AND the two NON-Roots
The while loop is used when the looping process terminates because a specified condition is satisfied, and thus the number of passes is not known in advance.
A simple example of a while loop is
x = 5;
while x < 25
disp(x)
x = 2*x - 1;
end
A PreTested DYNAMIC Loop
Start
Set Loop VarInitial value
LogicalDecision
True
Statements(MUST IncrementLoop Variable)
False
end
Statements
For the while loop to function properly two conditions must occur
Start
Set Loop VarInitial value
LogicalDecision
True
Statements(MUST IncrementLoop Variable)
False
end
Statements
A simple while loop
k =
1
x =
9
k =
2
x =
17
k =
3
x =
33
x = 5;k = 0;
while x < 25
k = k + 1
y(k) = 3*x;
x = 2*x-1
end
>> y
y =
15 27 51
Write a .m- file to determine
The min. number of terms required for the sum of the series 5k2 – 2k; k = 1, 2, 3, … to just exceed 10,000.
the sum for this number of terms
The .m-file and the Results
tot = 0;k = 0;
while tot < 10e3
k = k + 1;
tot = 5*k^2 - 2*k + tot;
end
disp('No. terms = ')
disp(k)
disp('The Sum = ')
disp(tot)
No. Terms =
18
Sum =
10203
Time For
Live Demo
The switch structure provides an alternative to using the if, elseif, and else commands. Anything programmed using switch can also be programmed using if structures.
However, for some applications the switch structure producesmore readable code than when using the if structure.
switch input expression (which can be a scalar or string).
case value1
statement group 1
case value2
statement group 2
.
.
.
otherwise
statement group n
end
This switch Block displays the High School Class-Name that Corresponds to a Given Grade Level
grade_level = input('Hi-School Grade Level.: ');
switch grade_level
case 9
disp(' Freshman')
case 10
disp(' Sophomore')
case 11
disp(' Junior')
case 12
disp(' Senior')
otherwise
disp(' NOT a Hi-Schl Grade Lvl')
end
Hi-School Grade Level.: 9
Freshman
Hi-School Grade Level.: 11
Junior
Hi-School Grade Level.: 13
NOT a Hi-Schl Grade Lvl
Hi-School Grade Level.: 10
Sophomore
Consider an Electrical Diode →
I
V
REALBehavior
IDEALModel
OFFSETModel
LINEARModel
+VL-
+VL-
% Bruce Mayer, PE * 08Sep11
% ENGR25 * Problem 4-27
% file = Prob4_27_Vs_plot.m
% INPUT SECTION
tmax = input('Max time in sec = ');
Vmax = input('Max Supply Potential in V = ');
%CALCULATION SECTION
% use linspace command to generate 500 time pts
t = linspace(0,tmax,500);
% Use for-Loop to generate plotting vector, vs
for k = 1:500
% Calc SUPPLY V-Level
vsup = Vmax*exp(-t(k)/3)*sin(pi*t(k));
vs(k) = vsup;
end
% PLOT SECTION
plot(t,vs),ylabel('Load Voltage (V)'),xlabel('Time (sec)'),...
title('Ideal-Diode Rectifier'), grid
disp('Plot Complete')
+VL-
Diode ON
Recall the Ideal-Diode Model →
IDEALModel
+VL-
% Bruce Mayer, PE * 08Sep11
% ENGR25 * Problem 4-27a
% file = Prob4_27a_ideal_diode.m
% INPUT SECTION
tmax = input('Max time in sec = ');
Vmax = input('Max Supply Potential in V = ');
% CALCULATION SECTION
% use linspace command to generate 500 time pts
t = linspace(0,tmax,500);
% Use for-Loop to generate plotting vector, vL
for k = 1:500
% Calc SUPPLY V-Level at the current t(k)
vs = Vmax*exp(-t(k)/3)*sin(pi*t(k));
% chkFwd or Rev condition by if-else
if vs > 0
vL(k) = vs; % diode absorbs NO voltage
else
vL(k) = 0; % diode BLOCKS ALL Current
end
end
plot(t,vL),ylabel('Load Voltage (V)'),xlabel('Time (sec)'),...
title('Ideal-Diode Rectifier'), grid
+VL-
VS
IDEALModel
Recall the OffSet-Diode Model →
OFFSETModel
+VL-
% Bruce Mayer, PE * 08Sep11
% ENGR25 * Problem 4-27b
% file = Prob4_27b_offset_diode.m
% INPUT SECTION
tmax = input('Max time in sec = ');
Vmax = input('Max Supply Potential in V = ');
% CALCULATION SECTION
% use linspace command to generate 500 time pts
t = linspace(0,tmax,500);
% Use for-Loop to generate plotting vector, vL
for k = 1:500
% Calc SUPPLY V-Level at current t(k)
vs = Vmax*exp(-t(k)/3)*sin(pi*t(k));
% chkFwd or Rev condition by if-else
if vs > 0.6
vL(k) = vs-0.6; % diode absorbs 0.6V
else
vL(k) = 0; % diode BLOCKS All current
end
end
plot(t,vL),ylabel('Load Voltage (V)'),xlabel('Time (sec)'),...
title('Offset-Diode Rectifier'), grid
+VL-
VS
OFFSETModel
Compare Plots Side-by-Side
+VL-
Plots for 24V amplitude
+VL-
SinusoidalHalfWaveRectifier
Engr/Math/Physics 25
Appendix
Time For
Live Demo
Bruce Mayer, PE
Licensed Electrical & Mechanical [email protected]