2017-10-25 9 views
1

는 다음과 같은 전달 함수를 살펴 보자 생성 동일한 결과를 얻을 수 없다는 매트랩

enter image description here

enter image description here

:

enter image description here

매트랩, 우리는 상태 공간에서 시스템을 모델링 할 수 다음과 같이 상태 공간에서, 시스템 모델링 할 수있다

다음 플롯을 얻는다 :

enter image description here

정확히 전달 함수를 사용하여 생성 된 결과입니다. 나는 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; 

} 

입니다 그리고 이것은 앞의 변수

enter image description here

없음 matlab에 의해 생성 된 결과를 일치하지 모든 상태 벡터에 대한 결과입니다. 이 코드를 수정하라는 제안이 있습니까?

답변

2

y에 대한 표현식을 살펴보십시오. 1x3 행렬에 3x1 행렬을 곱하면 결과는 1x1 행렬이어야합니다. 여기서 단일 요소의 값은 두 행렬의 내적입니다. 내적을 계산하는 대신 data에 쓸 때 현재 수행중인 것은 요소 단위의 곱셈입니다.

+0

내 코드에서 1x3 매트릭스는 어디에 있습니까? – CroCo

+0

코드에서 결과를 데이터에 씁니다. 여기에서 Cx를 계산하려고 시도하는 것 같습니다. (시스템을 모델링 할 수있는 방법을 설명하는 방정식의 명명 규칙을 따름) 대신 C와 x의 요소 별 곱셈을 수행합니다. – Jacob

+0

오 이런. 무슨 부주의 한 실수 야. 고맙습니다. 이 말이 맞습니다. 이제 나는 잘 수있다. – CroCo