|
Week 12: Linear Quadratic
Regulators
13 January 2003
|
|
The linear quadratic regulator (LQR) problem provides a design method for building
state space controllers. We start with a review of the optimal control problem
and basic LQR results (details and proofs are left to the reading). The results
are illustrated using the ducted fan example and exploring how different choices
of weights affect the performance. We then explore how to incorporate reference
inputs and integral action into the LQR formalism. Finally, some notions of
robustness are explored and a comparison with frequency domain techniques is
given.
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;
}
Homework
The homework covers the basic design of LQR controllers through a set of four
different problems. In addition, one problem covers the design of feedforward
controllers for nonzero desired states and integral action in LQR compensators.
Homework #10
Frequently asked questions and homework hints [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;
}