2016-11-30 69 views
0

我正在實現ODE來求解四個耦合方程,並且遇到了我的狀態向量的定義問題。我在這裏舉例以供參考(https://www.codeproject.com/articles/268589/odeint-v-solving-ordinary-differential-equations);正如我所說,我的代碼和這一個之間的唯一區別是方程的實際定義,並且我需要一個帶有4個元素的向量,而不是3個。向量下標與odeint不匹配(C++)

我的代碼如下(質量值,慣性等)中定義的數據基於來自另一個類的用戶輸入);我還沒有添加觀察員來推回結果,因爲我希望首先得到這個結果。 矢量狀態定義:

typedef std::vector<double>state_type; 

再加ODE類:

class coupledODE : public Vehicle, public Road 
{ 
    public: 
     void operator()(state_type &x, state_type &dxdt, double t) 
     { 
      dxdt[0] = x[2]; 
      dxdt[1] = (1/mass)*(-(damping_f + damping_r)*x[2] - (stiffness_f + stiffness_r)*x[1] - (damping_r*rearLength - damping_f*frontLength)*x[4] - (stiffness_r*rearLength - stiffness_f*frontLength)*x[3] + stiffness_f*A*sin((radFreq)*t) + stiffness_r*A*sin((radFreq)*t - (2 * pi*(frontLength + rearLength))/L)); 
      dxdt[3] = x[4]; 
      dxdt[4] = (1/inertia)*(-(damping_f*pow(frontLength, 2) + damping_r*pow(rearLength, 2))*x[4] - (stiffness_f*pow(frontLength, 2) + stiffness_r*pow(rearLength, 2))*x[3] - (stiffness_r*rearLength - stiffness_f*frontLength)*x[2] - (stiffness_r*rearLength - stiffness_f*frontLength)*x[1] + stiffness_r*rearLength*A*sin((radFreq)*t - (2 * pi*(rearLength + frontLength))/L) - stiffness_f*frontLength*A*sin((radFreq)*t)); 
     } 
}; 

呼叫主:

state_type x(4); 
x[0] = car.x_init1; 
x[1] = car.x_init2; 
x[2] = car.x_init3; 
x[3] = car.x_init4; 

const double timeStep = car.dt; 
double tStart = car.t0; 
double t = tStart; 
double tEnd = car.tf; 

// Initialize odeint 
runge_kutta4<state_type>rk4; 
for (size_t i = 0; i < (tStart - tEnd)/timeStep; ++i, t += timeStep) 
{ 
    rk4.do_step(coupledODE(), x, t, timeStep); 
} 

的代碼編譯好,當我在MSVS '15構建它,但是當我運行它,我會在定義x[3]的初始值的行處發生異常。這個確切的格式適用於3個耦合方程,所以我對第四個元素導致問題的處理有些遺憾。

+0

不明確。這是有問題的一行:'x [4] = car.x_init4;'? – user4581301

+0

是的,但它應該是'x [3]'。我已糾正,但仍然收到下標錯誤。 – cl40

+0

當。非常容易的問題。沒有明顯的剩下。必須要求[mcve]。也就是說,如果你在'x [3] = car.x_init4;'上放置一個斷點,並在程序到達斷點時加入,你可能會得到更多有用的信息。 – user4581301

回答

1

由於下標在實際ODE eqtns中的錯誤 - 必須從x [0]開始並在x [3]結束。錯誤已通過修改方程式得到解決