2

この質問は、 1次常微分方程式 (ODE)の積分に対するルンゲ クッタ公式の次の実装によって動機付けられます。

template <typename Field, typename Vector>
auto
runge_kutta(const Vector& y,
           std::function<Vector(Field, const Vector&)> rhs,
           Field t, Field delta_t)
{
  Vector k1 = rhs(t, y);
  Vector k2 = rhs(t + delta_t/2, y + delta_t/2*k1);
  Vector k3 = rhs(t + delta_t/2, y + delta_t/2*k2);
  Vector k4 = rhs(t + delta_t,   y + delta_t * k3);
  return y + delta_t/6*(k1 + 2*k2 + 2*k3 + k4);
}

これは、次のような機能を統合するために使用できます。

double f(double t, double y) { return y; }

しかし、上記のルンゲ クッタ コードは、高次の ODE または複数の従属変数を持つ ODE を解くためにも使用できます。このために、テンプレート パラメーター Vector は、適切に定義された算術演算子を含む数値 (または異なる種類のベクトル) のコンテナーである必要があります。

Vectorしたがって、次のプロパティを持つ型の実装を探しています。

  1. 型は、数値または異なる種類のベクトルのコンテナーです。
  2. 適切にオーバーロードされた演算子operator+operator-operator*およびoperator/
  3. これらの演算子を使用するために必要な呼び出しコードでの using 宣言はありません。
  4. 標準ライブラリが再利用されます。

私が思いついた最善の方法はstd::array、新しい名前空間での演算子を作成することです

namespace StackOverflow {

  template<typename Field, typename Element, std::size_t Dim>
  auto
  operator*(Field lhs, const std::array<Element, Dim>& rhs);

  // etc., etc.
}

呼び出しコードに適切な using 宣言がある (上記のポイント 2 に違反する)

using StackOverflow::operator+; ...

もう 1 つの可能性は、 から公に派生させることstd::arrayです。これは機能しますが、私が学んだように、これは C++ 言語標準によって明示的に禁止されています。

完全std::arrayに書き直さずに、上記の最初の 4 つのプロパティを保持して再利用することは可能ですか?std::array

4

0 に答える 0