5 #ifndef LODESTAR_BILINEARTRANSFORMATION_HPP
6 #define LODESTAR_BILINEARTRANSFORMATION_HPP
9 #include "Lodestar/systems/StateSpace.hpp"
10 #include "Lodestar/aux/CompileTimeQualifiers.hpp"
24 template<
typename TScalar =
double,
int TStateDim = Eigen::Dynamic,
int TInputDim = Eigen::Dynamic,
int TOutputDim = Eigen::Dynamic>
26 Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>> HH;
27 Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>> HH2;
28 Eigen::Matrix<TScalar, TStateDim, TStateDim> I;
31 template<
typename TScalar =
double,
int TStateDim = Eigen::Dynamic,
int TInputDim = Eigen::Dynamic,
int TOutputDim = Eigen::Dynamic>
33 Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>> HH;
34 Eigen::Matrix<TScalar, TStateDim, TStateDim> IMAC;
35 Eigen::Matrix<TScalar, TStateDim, TStateDim> I;
53 c2d(
const Eigen::MatrixXd &A,
const Eigen::MatrixXd &B,
54 const Eigen::MatrixXd &C,
const Eigen::MatrixXd &D,
73 c2d(
const Eigen::MatrixXd *A,
const Eigen::MatrixXd *B,
const Eigen::MatrixXd *C,
const Eigen::MatrixXd *D,
91 template<
typename TScalar,
int TStateDim,
int TInputDim,
int TOutputDim>
96 LS_IS_DYNAMIC_DEFAULT(TStateDim, TInputDim, TOutputDim));
98 template<
typename TScalar,
int TStateDim,
int TInputDim,
int TOutputDim>
103 LS_IS_STATIC_DEFAULT(TStateDim, TInputDim, TOutputDim));
120 template<
typename TScalar,
int TStateDim,
int TInputDim,
int TOutputDim>
125 LS_IS_DYNAMIC_DEFAULT(TStateDim, TInputDim, TOutputDim));
127 template<
typename TScalar,
int TStateDim,
int TInputDim,
int TOutputDim>
132 LS_IS_STATIC_DEFAULT(TStateDim, TInputDim, TOutputDim));
165 d2c(
const Eigen::MatrixXd &A,
const Eigen::MatrixXd &B,
166 const Eigen::MatrixXd &C,
const Eigen::MatrixXd &D,
double dt,
184 d2c(
const Eigen::MatrixXd *A,
const Eigen::MatrixXd *B,
const Eigen::MatrixXd *C,
const Eigen::MatrixXd *D,
263 template<
typename TScalar,
int TStateDim,
int TInputDim,
int TOutputDim>
266 double dt,
double alpha,
268 mallocStructC2D<TScalar, TStateDim, TInputDim, TOutputDim> *memStruct,
269 LS_IS_DYNAMIC(TStateDim, TInputDim, TOutputDim))
271 if (alpha < 0 || alpha > 1) alpha = 0;
275 memStruct->HH = Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>>(
276 memStruct->I - alpha * dt * (ss->
getA()));
277 memStruct->HH2 = Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>>(
278 (memStruct->I - alpha * dt * (ss->
getA())).transpose());
280 out->
setA(memStruct->HH.template solve(memStruct->I - (1 - alpha) * dt * (ss->
getA())));
281 out->
setB(memStruct->HH.template solve(dt * (ss->
getB())));
282 out->
setC(memStruct->HH2.template solve((ss->
getC()).transpose()).transpose());
287 template<
typename TScalar,
int TStateDim,
int TInputDim,
int TOutputDim>
290 double dt,
double alpha,
292 mallocStructC2D<TScalar, TStateDim, TInputDim, TOutputDim> *memStruct,
293 LS_IS_STATIC(TStateDim, TInputDim, TOutputDim))
295 if (alpha < 0 || alpha > 1) alpha = 0;
298 memStruct->I.setIdentity();
299 memStruct->HH = Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>>(
300 memStruct->I - alpha * dt * (ss->
getA()));
301 memStruct->HH2 = Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>>(
302 (memStruct->I - alpha * dt * (ss->
getA())).transpose());
304 out->
setA(memStruct->HH.template solve(memStruct->I - (1 - alpha) * dt * (ss->
getA())));
305 out->
setB(memStruct->HH.template solve(dt * (ss->
getB())));
306 out->
setC(memStruct->HH2.template solve((ss->
getC()).transpose()).transpose());
311 template<
typename TScalar,
int TStateDim,
int TInputDim,
int TOutputDim>
314 double dt,
double alpha,
316 mallocStructD2C<TScalar, TStateDim, TInputDim, TOutputDim> *memStruct,
317 LS_IS_DYNAMIC(TStateDim, TInputDim, TOutputDim))
319 if (alpha < 0 || alpha > 1) alpha = 0;
323 memStruct->HH = Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>>(
324 alpha * dt * (ss->
getA()).transpose() + (1 - alpha) * dt * memStruct->I);
325 out->
setA(memStruct->HH.template solve((ss->
getA()).transpose() - memStruct->I));
326 memStruct->IMAC = memStruct->I - alpha * dt * (out->
getA());
328 out->
setB(memStruct->IMAC * (ss->
getB()) / dt);
329 out->
setC((ss->
getC()) * memStruct->IMAC);
334 template<
typename TScalar,
int TStateDim,
int TInputDim,
int TOutputDim>
337 double dt,
double alpha,
339 mallocStructD2C<TScalar, TStateDim, TInputDim, TOutputDim> *memStruct,
340 LS_IS_STATIC(TStateDim, TInputDim, TOutputDim))
342 if (alpha < 0 || alpha > 1) alpha = 0;
345 memStruct->I.setIdentity();
346 memStruct->HH = Eigen::ColPivHouseholderQR<Eigen::Matrix<TScalar, TStateDim, TStateDim>>(
347 alpha * dt * (ss->
getA()).transpose() + (1 - alpha) * dt * memStruct->I);
348 out->
setA(memStruct->HH.template solve((ss->
getA()).transpose() - memStruct->I));
349 memStruct->IMAC = memStruct->I - alpha * dt * (out->
getA());
351 out->
setB(memStruct->IMAC * (ss->
getB()) / dt);
352 out->
setC((ss->
getC()) * memStruct->IMAC);
357 #endif //LODESTAR_BILINEARTRANSFORMATION_HPP