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個耦合方程,所以我對第四個元素導致問題的處理有些遺憾。
不明確。這是有問題的一行:'x [4] = car.x_init4;'? – user4581301
是的,但它應該是'x [3]'。我已糾正,但仍然收到下標錯誤。 – cl40
當。非常容易的問題。沒有明顯的剩下。必須要求[mcve]。也就是說,如果你在'x [3] = car.x_init4;'上放置一個斷點,並在程序到達斷點時加入,你可能會得到更多有用的信息。 – user4581301