4つの結合方程式を解くためにODEを実装しています。私の状態ベクトルの定義に問題があります。私は参考のために例をここに従っています(https://www.codeproject.com/articles/268589/odeint-v-solving-ordinary-differential-equations);私のコードとこれとの唯一の違いは、方程式の実際の定義であり、3の代わりに4つの要素を持つベクトルが必要だということです。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つの結合された方程式に対してうまく機能するので、4番目の要素で問題を引き起こしているものについては少し損失があります。
不明です。これは問題のある行です: 'x [4] = car.x_init4;'? – user4581301
はい、ただし、 'x [3]'にする必要があります。私はそれを修正しましたが、依然として添え字エラーを受けています。 – cl40
Dang。簡単な問題のためにはそんなに。何も明らかに残っていない。 [mcve]を求める必要があります。つまり、x [3] = car.x_init4;にブレークポイントを設定し、プログラムがブレークポイントに達すると、より有用な情報を得ることができます。 – user4581301