Saya menulis kode untuk melakukan integrasi Gaussian dengan n
poin, di mana n
adalah konstanta waktu kompilasi.
Untuk n
tertentu, saya tahu cara menghitung absis dan bobot. Perhitungan harus dilakukan dari awal untuk setiap n
yang berbeda.
Sekarang, saya melakukan sesuatu seperti ini:
// 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;
}
untuk digunakan seperti ini:
double i = gauss_quadrature<legendre<12>> (f);
Sekarang, saya dapat mengkhususkan diri pada satuan terjemahan koefisien untuk legendre<12>
, dengan melakukan
template <>
const legendre<12>::x[12] = { ... };
template <>
const legendre<12>::w[12] = { ... };
dan semuanya baik-baik saja, selama saya hanya menggunakan Gauss-Legendre 12 poin.
Sekarang, saya bereksperimen dengan jumlah poin yang berbeda, dan saya tahu cara menghasilkan bobot dan node. Misalnya, saya dapat memberikan rutinitas
void compute_legendre_coeffs (size_t n, double* w, double* x);
Dan :
- Saat saya memanggil
gauss_quadrature<legendre<n>>
, templatlegendre<n>
secara otomatis dibuat (inilah kasusnya). - Ketika
legendre<n>
dipakai untuk beberapa waktu kompilasin
, saya ingincompute_legendre_coeffs
di atas dipanggil di beberapa titik sebelum main sehingga memenuhi array anggotax
danw
. Bagaimana cara mencapainya?
Saya tahu harus mendefinisikan array terlebih dahulu:
template <size_t n>
const double legendre<n>::x[n] = {};
template <size_t n>
const double legendre<n>::w[n] = {};
tapi saya tidak bisa menemukan metode untuk menginisialisasinya. Adakah yang punya trik untuk melakukannya?
typedef const double (&arr_ref)[n];
danstatic arr_ref get_x(){ static const double x[n] = {}; static char c = (init(x),'0'); return x; }
. - person Xeo   schedule 04.12.2012n
dan array yang diketahui pada waktu kompilasi. - person Alexandre C.   schedule 04.12.2012main
, tetapi tepat sebelum penggunaan pertama. Benar? Jika demikian, Anda dapat membuat koefisienprivate
dan menawarkan pengaksesstatic
yang memastikan inisialisasi array - person David Rodríguez - dribeas   schedule 04.12.2012