ポイントとのガウス積分を実行するコードを書いています。ここで、コンパイル時定数です。n
n
与えられた について、n
横座標と重みを計算する方法を知っています。計算は、それぞれの異なる に対してゼロから行う必要がありますn
。
今、私はこれらの行に沿って何かをします:
// Several structs like this one (laguerre, chebyshev, etc).
template <size_t n>
struct legendre
{
static const size_t size = n;
static const double x[n];
static const double w[n];
};
template <typename Rule, typename F>
double gauss_quadrature (F&& f)
{
double acc = 0;
for (size_t j = 0; j < Rule::size; j++)
acc += Rule::w[j] * f (Rule::x[j]);
return acc;
}
次のように使用します。
double i = gauss_quadrature<legendre<12>> (f);
legendre<12>
これで、次のようにして、 の係数を変換単位に特化できます。
template <>
const legendre<12>::x[12] = { ... };
template <>
const legendre<12>::w[12] = { ... };
12 ポイントの Gauss-Legendre のみを使用する限り、すべて問題ありません。
現在、さまざまな数のポイントを試しており、重みとノードを生成する方法を知っています。たとえば、ルーチンを提供できます
void compute_legendre_coeffs (size_t n, double* w, double* x);
と :
- を呼び出す
gauss_quadrature<legendre<n>>
と、テンプレートlegendre<n>
が自動的にインスタンス化されます (これが該当します)。 legendre<n>
がいくつかのコンパイル時にインスタンス化されるとき、上記を main の前のある時点で呼び出して、メンバー配列とメンバー配列を埋めるn
ようにしたいと思います。compute_legendre_coeffs
x
w
どうすればこれを達成できますか?
最初に配列を定義する必要があることはわかっています。
template <size_t n>
const double legendre<n>::x[n] = {};
template <size_t n>
const double legendre<n>::w[n] = {};
しかし、それらを初期化する方法が思いつきません。誰もそうするためのトリックを持っていますか?