|
Lecture 6.1: Transfer Functions
4 November 2002
|
|
This
lecture is the first lecture of the course to introduce transfer functions in
a formal way (we have already seen frequency response and body plots). The lecture
uses the example of a spring, mass, damper system to show how transfer functions
can be used to compute the frequency response of an interconnected system of
components. We also define poles and zeros and indicate how they affect the
frequency response of a system. Finally, we introduce the general computations
of block diagram algebra.
Mud card responses [advanced
search]:
#!/usr/bin/perl
# -*- perl -*-
#
# htdbsearch.cgi - search for matching files in a database directory
# RMM, 16 Mar 97
#
# This CGI script searches the description files in a directory for a
# against a set of criteria
#
# This script should be called as
#
# http://machine/path/htdblist.cgi?
# or
# http://machine/path/htdblist.cgi?db=&args
#
# where is the name of the configuration file that defines
# all of the information needed to generate the listing. The optional
# arguments are:
#
# _count=NN only list the first NN entries
# _tight=1 use tight listing
# _ssi=1 don't print header, trailer info (for includs)
#
# Include the necessary libraries
require "cgi-lib.pl";
require "htdblib.pl";
# Parse script arguments
if (&htdbinit) {
# If the form contains some values, use them to search, and return
# the results.
if ($in{'_dbconfig'}) {
# Generate the context header for the browser
print &PrintHeader;
# Print out the introductory information for search
if (defined &SearchHeader) {&{$SearchHeader}($DBName);}
# Summarize the search that was performed
$rsltheader =
defined &ResultHeader ? \&ResultHeader : htdb::ResultHeader;
&{$rsltheader}(%in) if (!$in{_ssi});
# Go through and look for matching files
if (not &PrintMatches) { &PrintNoMatches if (!in{ssi}); }
# Generate the trailer
if (defined &dbtrailer) {$dbtrailer = \&DBTrailer};
if (not $dbtrailer) {$dbtrailer = \&htdb::DBTrailer;}
&{$dbtrailer}($DBName) if (!in{ssi});
} else {
# Check to see if there is a user function for printing the search form
if (defined &SearchForm) {$searchform = \&SearchForm};
if (not $searchform) {$searchform = \&htdb::SearchForm;}
# Print out the introductory information for search
if (defined &SearchHeader) {&{$SearchHeader}($DBName);}
# Print the search form
&{$searchform}(%in);
}
}
#
# Subroutine for printing the matches that occured
#
sub PrintMatches {
my ($num_found);
# Go to the database directory and read the contents
chdir $DBPath || die "Can't cd to $DBPath";
opendir(DIR, '.') || die "Can't open $DBPath";
@filenames = readdir(DIR);
closedir(DIR);
# Check to see if there is a user function for checking matches
if (defined &CheckEntry) {$checkentry = \&CheckEntry};
if (not $checkentry) {$checkentry = \&htdb::CheckEntry;}
# Check to see if there is a user function for parsing filenames
if (defined &ParseFname) {$parsefname = \&ParseFname};
if (not $parsefname) {$parsefname = \&htdb::ParseFname;}
# Check to see if there is a user function for printing the entry
if (defined &PrintEntry) {$printentry = \&PrintEntry};
if (not $printentry) {$printentry = \&htdb::PrintEntry;}
# Check to see if there is a user function for printing the entry
if (defined &TightEntry) {$tightentry = \&TightEntry};
if (not $tightentry) {$tightentry = \&htdb::TightEntry;}
# Open the list environment used for the results
# Print the command to generate a list of elements
print ($in{_tight} ? "\n" : "\n");
# Loop through the filenames in order.
$getfnames = defined &GetFnames ? \&GetFnames : htdb::GetFnames;
@filenames = &{$getfnames}($DBPath);
for (@filenames) {
# Parse the filname and extract the ID and tag information
($id, $tag) = &{$parsefname}($filename = $_);
next if not $id;
# Open the file and extract the contents
$contents = &htdb::readfile($filename);
next if not $contents;
# Now see if this entry matches the criteria for a match
next if not &{$checkentry}($contents, %in);
# Print out the information associated with this entry
$count += &{($in{_tight} ? $tightentry : $printentry)}
($filename, $contents, $id, $tag, $DBURL."/".$filename);
$num_found++;
# See if we are counting and stop if needed
last if ($in{_count} && $count > $in{_count});
}
# Close the list environment used for the results
print ($in{_tight} ? "
\n" : "\n");
return $num_found;
}
#
# Subroutine for alerting the user that no matches occured
#
sub PrintNoMatches {
print "No matches found
\n";
print "Sorry, no entries match your request. ";
print "Please choose some different parameters and try again.\n";
print $footer;
}
Handouts from lecture
The following materials were handed out in lecture. These have been updated to
include any corrections.
Required reading
Supplemental reading
- A. D. Lewis,
A Mathematical Introduction to Feedback Control, Chapter 3 [pdf]
and Chapter 4 [pdf]
Homework
This homework set covers basic transfer function concepts. The conceptual problems
show how to create a frequency response for a complex system of components using
MATLAB. The analytical problems cover basic anaytical concepts in transfer functions.
Modifications to the homework (link above is always the latest version):
- 4 Nov 02: problem set release
Frequently asked questions on homework and TA hints:
#!/usr/bin/perl
# -*- perl -*-
#
# htdbsearch.cgi - search for matching files in a database directory
# RMM, 16 Mar 97
#
# This CGI script searches the description files in a directory for a
# against a set of criteria
#
# This script should be called as
#
# http://machine/path/htdblist.cgi?
# or
# http://machine/path/htdblist.cgi?db=&args
#
# where is the name of the configuration file that defines
# all of the information needed to generate the listing. The optional
# arguments are:
#
# _count=NN only list the first NN entries
# _tight=1 use tight listing
# _ssi=1 don't print header, trailer info (for includs)
#
# Include the necessary libraries
require "cgi-lib.pl";
require "htdblib.pl";
# Parse script arguments
if (&htdbinit) {
# If the form contains some values, use them to search, and return
# the results.
if ($in{'_dbconfig'}) {
# Generate the context header for the browser
print &PrintHeader;
# Print out the introductory information for search
if (defined &SearchHeader) {&{$SearchHeader}($DBName);}
# Summarize the search that was performed
$rsltheader =
defined &ResultHeader ? \&ResultHeader : htdb::ResultHeader;
&{$rsltheader}(%in) if (!$in{_ssi});
# Go through and look for matching files
if (not &PrintMatches) { &PrintNoMatches if (!in{ssi}); }
# Generate the trailer
if (defined &dbtrailer) {$dbtrailer = \&DBTrailer};
if (not $dbtrailer) {$dbtrailer = \&htdb::DBTrailer;}
&{$dbtrailer}($DBName) if (!in{ssi});
} else {
# Check to see if there is a user function for printing the search form
if (defined &SearchForm) {$searchform = \&SearchForm};
if (not $searchform) {$searchform = \&htdb::SearchForm;}
# Print out the introductory information for search
if (defined &SearchHeader) {&{$SearchHeader}($DBName);}
# Print the search form
&{$searchform}(%in);
}
}
#
# Subroutine for printing the matches that occured
#
sub PrintMatches {
my ($num_found);
# Go to the database directory and read the contents
chdir $DBPath || die "Can't cd to $DBPath";
opendir(DIR, '.') || die "Can't open $DBPath";
@filenames = readdir(DIR);
closedir(DIR);
# Check to see if there is a user function for checking matches
if (defined &CheckEntry) {$checkentry = \&CheckEntry};
if (not $checkentry) {$checkentry = \&htdb::CheckEntry;}
# Check to see if there is a user function for parsing filenames
if (defined &ParseFname) {$parsefname = \&ParseFname};
if (not $parsefname) {$parsefname = \&htdb::ParseFname;}
# Check to see if there is a user function for printing the entry
if (defined &PrintEntry) {$printentry = \&PrintEntry};
if (not $printentry) {$printentry = \&htdb::PrintEntry;}
# Check to see if there is a user function for printing the entry
if (defined &TightEntry) {$tightentry = \&TightEntry};
if (not $tightentry) {$tightentry = \&htdb::TightEntry;}
# Open the list environment used for the results
# Print the command to generate a list of elements
print ($in{_tight} ? "\n" : "\n");
# Loop through the filenames in order.
$getfnames = defined &GetFnames ? \&GetFnames : htdb::GetFnames;
@filenames = &{$getfnames}($DBPath);
for (@filenames) {
# Parse the filname and extract the ID and tag information
($id, $tag) = &{$parsefname}($filename = $_);
next if not $id;
# Open the file and extract the contents
$contents = &htdb::readfile($filename);
next if not $contents;
# Now see if this entry matches the criteria for a match
next if not &{$checkentry}($contents, %in);
# Print out the information associated with this entry
$count += &{($in{_tight} ? $tightentry : $printentry)}
($filename, $contents, $id, $tag, $DBURL."/".$filename);
$num_found++;
# See if we are counting and stop if needed
last if ($in{_count} && $count > $in{_count});
}
# Close the list environment used for the results
print ($in{_tight} ? "
\n" : "\n");
return $num_found;
}
#
# Subroutine for alerting the user that no matches occured
#
sub PrintNoMatches {
print "No matches found
\n";
print "Sorry, no entries match your request. ";
print "Please choose some different parameters and try again.\n";
print $footer;
}