#include #include "DifferenceOperator.h" #include "CREATE.h" #include "SingularMatrixError.h" #include "LDUFullMatParPv.h" #include "FullRow.h" using namespace MbD; std::shared_ptr> DifferenceOperator::OneOverFactorials = []() { auto oneOverFactorials = std::make_shared>(10); for (int i = 0; i < oneOverFactorials->size(); i++) { oneOverFactorials->at(i) = 1.0 / std::tgamma(i+1); } return oneOverFactorials; }(); void MbD::DifferenceOperator::calcOperatorMatrix() { //Compute operatorMatrix such that //value(time) : = (operatorMatrix at : 1) timesColumn : series. //valuedot(time) : = (operatorMatrix at : 2) timesColumn : series. //valueddot(time) : = (operatorMatrix at : 3) timesColumn : series. this->formTaylorMatrix(); try { operatorMatrix = CREATE::With()->inversesaveOriginal(taylorMatrix, false); } catch (SingularMatrixError ex) { } } void MbD::DifferenceOperator::initialize() { } void MbD::DifferenceOperator::setiStep(int i) { iStep = i; } void MbD::DifferenceOperator::setorder(int o) { order = o; } void MbD::DifferenceOperator::instantiateTaylorMatrix() { if (taylorMatrix == nullptr || (taylorMatrix->nrow() != (order + 1))) { taylorMatrix = std::make_shared>(order + 1, order + 1); } } void MbD::DifferenceOperator::formTaylorRowwithTimeNodederivative(int i, int ii, int k) { //| rowi hi hipower aij | auto& rowi = taylorMatrix->at(i); for (int j = 0; j < k; j++) { rowi->at(j) = 0.0; } rowi->at(k) = 1.0; auto hi = timeNodes->at(ii) - time; auto hipower = 1.0; for (int j = k + 1; j < order + 1; j++) { hipower = hipower * hi; assert(false); //aij = hipower * (OneOverFactorials at : j - k - 1); //rowi at : j put : aij } } void MbD::DifferenceOperator::settime(double t) { time = t; }