Using and Programming with MATLAB as an Engineering Tool [ Part III ]
Lecture outline Saving variables Basic file input/output Evaluating string commands Functions of functions
Saving Variables Sometimes you might want to save some or all of your workspace Don’t want to repeat time consuming calculations
Saving Variables Sometimes you might want to save some or all of your workspace MATLAB allows you to save variables from the console workspace
Saving Variables Sometimes you might want to save some or all of your workspace MATLAB allows you to save variables from the console workspace You can load these variables whenever you need them
Saving Variables Sometimes you might want to save some or all of your workspace MATLAB allows you to save variables from the console workspace You can load these variables whenever you need them Mat-files
Saving Variables >> save Saves the entire workspace to matlab.mat >> save points.mat x y Saves x and y in points.mat >> save change dx dy dz Saves dx, dy and dz in change.mat >> save coord.dat x y z –ascii Saves x, y and z in coord.dat in ASCII format
Loading Variables >> load Loads the variables in matlab.mat >> load change Loads the variables in change.mat >> load coord.dat –ascii Loads the variables in ASCII file coord.dat >> load points x Only loads x from points.mat
Input from a File Opening a file fid = fopen(filename, ‘r’); –fid = -1 means can’t open file Reading formatted data result = fscanf(fid, format); Reading a line line = fgetl(fid); % fgets keeps end-of-line char Closing a file fclose(fid);
Input from a File Block Properties Temp Press Vol >> fid = fopen(‘data.in’, ‘r’); >> fgetl(fid); >> T = scanf(fid,‘%g%g%d’) >> fclose(fid) data.in
Input from a File Block Properties Temp Press Vol >> fid = fopen(‘data.in’, ‘r’); >> fgetl(fid); >> T = scanf(fid,‘%g%g%d’) >> fclose(fid) data.in
Input from a File Block Properties Temp Press Vol data.in >> fid = fopen(‘data.in’, ‘r’); >> fgetl(fid); >> T = scanf(fid,‘%g%g%d’) >> fclose(fid)
Input from a File Block Properties Temp Press Vol data.in >> fid = fopen(‘data.in’, ‘r’); >> fgetl(fid); >> T = scanf(fid,‘%g%g%d’) >> fclose(fid) Read a real Read an integer
Input from a File Block Properties Temp Press Vol data.in >> fid = fopen(‘data.in’, ‘r’); >> fgetl(fid); >> T = scanf(fid,‘%g%g%d’) >> fclose(fid) Read a real Read an integer
Input from a File Block Properties Temp Press Vol data.in >> fid = fopen(‘data.in’, ‘r’); >> fgetl(fid); >> T = scanf(fid,‘%g%g%d’) >> fclose(fid) Read a real Read an integer
Input from a File Block Properties Temp Press Vol >> fid = fopen(‘data.in’, ‘r’); >> fgetl(fid); >> T = scanf(fid,‘%g%g%d’) >> fclose(fid) data.in Read a real Read an integer
Input from a File Block Properties Temp Press Vol >> fid = fopen(‘data.in’, ‘r’); >> fgetl(fid); >> T = scanf(fid,‘%g%g%d’) >> fclose(fid) data.in
Input from a File Block Properties Temp Press Vol T = data.in Need to manipulate T into matrix form T = zeros(4, 3); for i = 1:4, T(i, :) = fscanf(fid, … ‘%g%g%d’, 3); end Read three values
Output to a File Open a file also using fopen fid = fopen(filename, ‘w’); –‘w’ means write and create if necessary –replacing ‘w’ by ‘a’ means append (also creating) Writing formatted data fprintf(fid, format, data) Writing a line fprintf(fid, ‘…\n’, data) Use fclose to close a file and write it
Output to a File >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid)
Output to a File >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out
Output to a File Block Properties >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out
Output to a File Block Properties Temp Press Vol >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out Moves columnwise
Output to a File Block Properties Temp Press Vol >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out Width 3 chars, 1 dp Width 3 chars, 2 dp integer (no width)
Output to a File Block Properties Temp Press Vol >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out Width 3 chars, 1 dp Width 3 chars, 2 dp integer (no width)
Output to a File Block Properties Temp Press Vol >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out
Output to a File Block Properties Temp Press Vol >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out
Output to a File Block Properties Temp Press Vol >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out
Output to a File Block Properties Temp Press Vol >> T = [ ; ; ; ]; >> fid = fopen(‘data.out’, ‘w’); >> fprintf(fid, ‘Block Properties\n’); >> fprintf(fid, ‘Temp Press Vol\n’); >> fprintf(fid, … ‘ %3.1f %3.2f %d\n’, T’); >> fclose(fid) data.out
Lab 6 Example (p. 128) function [names, years, rain] = getrain(filename, numnames, numyears) This line defines a function with inputs –the file’s name (a string) –the number of names to read (an integer) –the number of years to read (an integer) and outputs –the names (a cell vector) –the years (a integer vector) –the rain (a real matrix)
Lab 6 Example (p. 128) fid = fopen(filename, ‘r’); This line opens the file (as read only) and assigns a file identifier if fid ~= -1, blah, blah, blah else error([‘Could not open file ‘ filename]); end; These lines check if the file has been opened and writes an error if it was not
Lab 6 Example (p. 128) fgetl(fid); This line reads a line from the file –The table heading an column heading, e.g., c = ‘ ’; while c ~= ‘|’, c = fscanf(fid, ‘%c’, 1); end; These lines initialise a character c to be a space, then keep reading a new character from the file until a | is found Rainfall (in) | Year Rainforest Location |
Lab 6 Example (p. 128) years = fscanf(fid, ‘%d’, numyears); This line reads the years following the | from the file fgetl(fid); These lines read the remainder of the heading line and the table separator Rainforest Location |
Lab 6 Example (p. 128) for n = 1:numnames, Read a row from the file end; These lines read numnames rows from the table using a for loop names = cellstr(namematrix); This line creates a cell vector from a charatcer matrix (more later) fclose(fid); This line closes the file
Lab 6 Example (p. 128) name = ‘’; c = ‘ ’; while c ~= ‘|’, c = fscanf(fid, ‘%c’, 1); if c ~= ‘|’, name = [name c]; end; namematrix(n, :) = name; These lines read a name from the table by reading characters and adding them to name, then setting the appropriate row of the namematrix Zaire |
Lab 6 Example (p. 128) rain(n, :) = fscanf(fid, ‘%g’, numyears)’; This line reads the rainfall data for the given number of years and saves them in the rainfall matrix fgetl(fid); This line reads the rest of the line and discards it Zaire | India |
Lab 6 Example (p. 128) What is a cell vector (or a cell matrix for that matter)?! names = cellstr(namematrix); Matlab stores information in matrices, each row must have the same number of columns What about a list of names, where the names have different lengths? We can use a matrix and fill the remaining columns with spaces (e.g., namematrix ) Or we can use a cell vector or matrix structure where each entry may be a different size (e.g., names )
Cells No real details here (use help cell ) Work similar to matrices and vectors except use {} instead of [], e.g., names{3} is the third name in names What about names = cellstr(namematrix); ? –Takes the charater matrix and turns it into a cell vector (removing leading and trailing whitespace)
The sprintf function string = sprintf(format, data); Write formatted variables into a string >> [‘Give the integer ‘ sprintf(‘%d’, 6) … ‘ a real format ‘ sprintf(‘%3.2f’, 6)] ans = Give the integer 6 a real format 6.00 Concatenated string int2str
The eval function eval(string); Evaluates the string as a command eval(‘x = 5 * 6 / 2’) equivalent >> x = 5 * 6 / 2 Many uses, e. g., batch commands for run = 1:10, outfile = [‘result’ int2str(run)]; % Do some calculations eval([‘save ‘ outfile]) end Creates files result1 result2. result10
The feval function value = feval(name, inputs); Evalutes the function call with the given inputs, i. e., value = name(inputs); function y = mypoly(x) y = x.^2 + 2 * x + 1; return; >> y = feval(‘mypoly’, 1) y = 4
Using feval Calculate the forward difference of a function function df = fordiff(func, x, h) df = (feval(func, x + h) – feval(func, x)) / h; return;
Passing Functions as Variables to Functions MATLAB has a collection of useful built in functions that require a function name be passed as an argument Function-functions Examples:
Passing Functions as Variables to Functions MATLAB has a collection of useful built in functions that require a function name be passed as an argument Function-functions Examples:
Passing Functions as Variables to Functions MATLAB has a collection of useful built in functions that require a function name be passed as an argument Function-functions Examples:
Passing Functions as Variables to Functions MATLAB has a collection of useful built in functions that require a function name be passed as an argument Function-functions Examples: fminfind minima of a function fzerofind zeros of a function fplotplot a function quadintegral of a function ode23solves ordinary differential equations ode45solves ordinary differential equations
Example of Function-functions Plot the function y=x 3 -x
Example of Function-functions Function: function y=cubic(x) y=x.^3-x; return; Plot the function y=x 3 -x
Example of Function-functions x=0:0.01:1; y=cubic(x); plot(x,y); One way: Function: function y=cubic(x) y=x.^3-x; return; Plot the function y=x 3 -x
Example of Function-functions x=0:0.01:1; y=cubic(x); plot(x,y); One way: Function: function y=cubic(x) y=x.^3-x; return; Plot the function y=x 3 -x Vector of closely spaced x values to give smooth curve
Example of Function-functions x=0:0.01:1; y=cubic(x); plot(x,y); One way: Function: function y=cubic(x) y=x.^3-x; return; fplot(‘cubic’,[0 1]); Alternate: Plot the function y=x 3 -x Vector of closely spaced x values to give smooth curve
Example of Function-functions x=0:0.01:1; y=cubic(x); plot(x,y); One way: Function: function y=cubic(x) y=x.^3-x; return; fplot(‘cubic’,[0 1]); Alternate: Plot the function y=x 3 -x Vector of closely spaced x values to give smooth curve Restricted in how we can define cubic by the guidelines given by fplot
Using Function-functions to Solve an Ordinary Differential Equation Example:An object dropping under the influence of gravity and air friction:
Using Function-functions to Solve an Ordinary Differential Equation Example:An object dropping under the influence of gravity and air friction: dV dt = G - fV
Using Function-functions to Solve an Ordinary Differential Equation Example:An object dropping under the influence of gravity and air friction: G=9.81 m/s² and f=0.001/s dV dt = G - fV
Using Function-functions to Solve an Ordinary Differential Equation Set up a function to compute the derivative, dV/dt:
Using Function-functions to Solve an Ordinary Differential Equation Set up a function to compute the derivative, dV/dt: function Vprime=drop(t,V) G = 9.81; f = 0.001; Vprime = G-f*V; return;
Using Function-functions to Solve an Ordinary Differential Equation Find and plot the velocity from time 0 seconds to 10 seconds with an initial velocity of 0 m/s:
Using Function-functions to Solve an Ordinary Differential Equation Find and plot the velocity from time 0 seconds to 10 seconds with an initial velocity of 0 m/s: Timespan = [0 10]; V0 = 0; [allt,allV]=ode23(‘drop’,timespan,V0); Plot(allt,allV); range of time – start, end
Using Function-functions to Solve an Ordinary Differential Equation Find and plot the velocity from time 0 seconds to 10 seconds with an initial velocity of 0 m/s: Timespan = [0 10]; V0 = 0; [allt,allV]=ode23(‘drop’,timespan,V0); Plot(allt,allV); initial value of V
Using Function-functions to Solve an Ordinary Differential Equation Find and plot the velocity from time 0 seconds to 10 seconds with an initial velocity of 0 m/s: timespan = [0 10]; V0 = 0; [allt,allV]=ode23(‘drop’,timespan,V0); Plot(allt,allV); Call to MATLAB ODE function
Using Function-functions to Solve an Ordinary Differential Equation Find and plot the velocity from time 0 seconds to 10 seconds with an initial velocity of 0 m/s: timespan = [0 10]; V0 = 0; [allt,allV]=ode23(‘drop’,timespan,V0); plot(allt,allV); results are plotted
Next Week… Simple Plots (Revised) Getting more out of your plots Drawing multiple plots