00001
00002
00003
00004
00005
00006
00007
00008 #include "LinearModel.h"
00009
00010 using namespace boost::numeric::ublas;
00011
00012 namespace uvsim
00013 {
00014
00015 LinearModel::LinearModel(vector<double> *x, vector<double> *u) :
00016 Model(x,u)
00017 {
00018 }
00019
00020 LinearModel::~LinearModel()
00021 {
00022 }
00023
00024 void LinearModel::print()
00025 {
00026 std::cout << "\nContinuous Process Matrices:"
00027 << "\nAc: " << Ac
00028 << "\nBc: " << Bc
00029 << "\nEc: " << Ec << std::endl;
00030 std::cout << "\nDiscrete Process Matrices:"
00031 << "\nAd: " << Ad
00032 << "\nBd: " << Bd
00033 << "\nEd: " << Ed << std::endl;
00034 std::cout << "\nMeasurement Matrices:"
00035 << "\nC: " << C
00036 << "\nL: " << L << std::endl;
00037 }
00038
00039 void LinearModel::size(int n, int m, int p)
00040 {
00041 this->n = n;
00042 this->m = m;
00043 this->p = p;
00044 Ac = zero_matrix<double>(n,n);
00045 Bc = zero_matrix<double>(n,p);
00046 Ec= zero_matrix<double>(n,n);
00047 Ad = zero_matrix<double>(n,n);
00048 Bd = zero_matrix<double>(n,p);
00049 Ed= zero_matrix<double>(n,n);
00050 C = zero_matrix<double>(m,n);
00051 L = zero_matrix<double>(m,m);
00052 }
00053
00054 void LinearModel::discretize(double freq, int order)
00055 {
00056 double dt = 1/freq;
00057 Ad = identity_matrix<double>(n);
00058 matrix<double> X = identity_matrix<double>(n)*dt;
00059 double num = 1, den = 1;
00060 matrix<double> Apow = identity_matrix<double>(n);
00061 for (int i=1;i<=order;i++)
00062 {
00063 num *= dt;
00064 den *= i;
00065 Apow = prod(Apow, Ac);
00066 Ad = Ad + Apow*num/den;
00067 X = X + Apow*dt*num/((i+1)*den);
00068 }
00069 Bd = prod(X,Bc);
00070 Ed = prod(X,Ec);
00071 }
00072
00073 }
00074
00075