не может получить те же результаты, что и Matlab

Взгляните на следующую передаточную функцию:

введите здесь описание изображения

С Matlab Simulink:

введите здесь описание изображения

Результат

введите здесь описание изображения

В представлении в пространстве состояний система может быть смоделирована следующим образом:

введите здесь описание изображения

В Matlab мы можем смоделировать систему в представлении в пространстве состояний:

введите здесь описание изображения

введите здесь описание изображения

что дает следующий график:

введите здесь описание изображения

что и является результатом, полученным с помощью передаточной функции. Я пытаюсь получить те же результаты с помощью odeint, но потерпел неудачу. это код

#include <iostream>
#include <Eigen/Dense>
#include <boost/numeric/odeint.hpp>
#include <iomanip>
#include <fstream>


using namespace std;
using namespace boost::numeric::odeint;

typedef std::vector< double > state_type;

void equations(const state_type &y, state_type &dy, double x)
{
    Eigen::MatrixXd A(3, 3), B(3,1);

    /*
        x = y[0]
       dx = y[1] = dy[0]
      ddx = y[2] = dy[1]
     dddx =        dy[2]

    */
    const double r(1);

    A <<   0,   1,  0,
           0,   0,  1,
         -24, -26, -9;

    B << 0, 0, 1;      
    //#####################( ODE Equations )################################
    Eigen::MatrixXd X(3, 1), dX(3,1);
    X << y[0], y[1], y[2];
    dX = A*X + B*r;

    dy[0] = dX(0,0);
    dy[1] = dX(1,0);
    dy[2] = dX(2,0);
}


int main(int argc, char **argv)
{
    const double dt = 0.01;
    runge_kutta_dopri5 < state_type > stepper;

    state_type y(3); 
    // initial values
    y[0] = 0.0; //  x1 
    y[1] = 0.0; //  x2
    y[2] = 0.0; //  x3

    ofstream data("file.txt");

    for (double t(0.0); t <= 5.0; t += dt){
        data << t << " " << 2*y[0] << " " << 7*y[1] << " " << 1*y[2] << std::endl;
        stepper.do_step(equations, y, t, dt);
    }

    return 0;

}

И это результат для всех векторов состояния

введите здесь описание изображения

Ни одна из предыдущих переменных не соответствует результатам, сгенерированным Matlab. Любые предложения по исправлению этого кода?


person CroCo    schedule 25.10.2017    source источник


Ответы (1)


Посмотрите на выражение, которое у вас есть для y. Когда вы умножаете матрицу 1x3 на матрицу 3x1, результатом должна быть матрица 1x1, где значение одного элемента является скалярным произведением двух матриц. То, что вы сейчас делаете, — это поэлементное умножение, когда вы записываете data вместо вычисления скалярного произведения.

person Jacob    schedule 25.10.2017
comment
В вашем коде, где вы записываете результаты в данные. Здесь вы, кажется, пытаетесь вычислить Cx. (Исходя из соглашения об именах в уравнениях, описывающих, как можно смоделировать систему) Вместо этого вы выполняете поэлементное умножение C и x. - person Jacob; 26.10.2017
comment
О чувак. Какая неосторожная ошибка. Спасибо. это правильно. теперь я могу спать. - person CroCo; 26.10.2017