  | 
     
      
      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;
}