ฉันกำลังเขียนโค้ดเพื่อดำเนินการการรวมแบบเกาส์เซียน ด้วย n
พอยต์ โดยที่ n
คือค่าคงที่ของเวลาคอมไพล์
สำหรับ n
ที่ระบุ ฉันรู้วิธีคำนวณ abscissas และน้ำหนัก การคำนวณจะต้องทำตั้งแต่เริ่มต้นสำหรับ 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] = { ... };
และทุกอย่างเรียบร้อยดี ตราบใดที่ฉันใช้ Gauss-Legendre 12 แต้มเท่านั้น
ตอนนี้ ฉันกำลังทดลองกับจำนวนจุดที่แตกต่างกัน และฉันรู้วิธีสร้างน้ำหนักและโหนด เช่น ฉันสามารถจัดทำกิจวัตรประจำวันได้
void compute_legendre_coeffs (size_t n, double* w, double* x);
และ :
- เมื่อฉันโทร
gauss_quadrature<legendre<n>>
เทมเพลตlegendre<n>
จะถูกสร้างอินสแตนซ์โดยอัตโนมัติ (ในกรณีนี้) - เมื่อ
legendre<n>
ถูกสร้างอินสแตนซ์สำหรับเวลาคอมไพล์n
บางเวลา ฉันต้องการให้เรียกcompute_legendre_coeffs
ข้างต้นที่จุดใดจุดหนึ่งก่อน main เพื่อให้มันเติมเต็มอาร์เรย์สมาชิกx
และw
ฉันจะบรรลุสิ่งนี้ได้อย่างไร
ฉันรู้ว่าต้องกำหนดอาร์เรย์ก่อน:
template <size_t n>
const double legendre<n>::x[n] = {};
template <size_t n>
const double legendre<n>::w[n] = {};
แต่ฉันไม่สามารถคิดวิธีเริ่มต้นได้ ใครมีเคล็ดลับในการทำเช่นนั้น?
typedef const double (&arr_ref)[n];
และstatic arr_ref get_x(){ static const double x[n] = {}; static char c = (init(x),'0'); return x; }
- person Xeo   schedule 04.12.2012n
และอาร์เรย์ที่รู้จักในเวลาคอมไพล์ - person Alexandre C.   schedule 04.12.2012main
จริงๆ แต่ก่อนการใช้งานครั้งแรก ขวา? หากเป็นกรณีนี้ คุณสามารถสร้างสัมประสิทธิ์private
และเสนอตัวเข้าถึงstatic
เพื่อให้แน่ใจว่าอาร์เรย์จะเริ่มต้นได้ - person David Rodríguez - dribeas   schedule 04.12.2012