ฉันต้องการรวมตัวเลขเข้ากับ boost::math::quadrature::trapezoidal(g, a, b, 1e-6);
ที่นี่ ฉันกำลังรวมฟังก์ชัน g(x) ปัญหาคือว่าผมต้องทำอินทิกรัลสองเท่า นอกจากนี้ ฉันมีตัวแปร 4 ตัวในฟังก์ชันที่ฉันต้องการรวมเข้าด้วยกัน 2 รายการที่ฉันผ่านขณะอินทิเกรต (m,n) และอีก 2 รายการเป็นตัวแปรอินทิเกรต (r,z) นี่คืออินทิกรัลที่ฉันต้องการคำนวณ:
$$ \int_0^b\int_0^af(r,z)\sin{(\frac{n\pi}{a}z)}J_0(\frac{\alpha_{ 0,m}}{b}r)dzdr $$
ฉันเห็นตัวอย่างนี้ ดำเนินการรวมตัวเลข 2 มิติด้วย Boost Cpp และ สังเกตเห็นว่าเขาใช้ฟังก์ชันแลมบ์ดาเพื่อแยกอินทิแกรนด์หลักออกเป็น 2 จนถึงตอนนี้ฉันจัดการสิ่งนี้แล้ว
double integrate(int m, int n)
{
auto f1 = [](double r, double z, int m, int n) { return integrand(r,z,m,n); };
auto f = [&](double r, m) {
auto g = [&](double z, n) {
return f1(r, z);
};
//return gauss_kronrod<double, 61>::integrate(g, 0, a, 5);
return boost::math::quadrature::trapezoidal(g, 0, a, 1e-6);
};
double error;
//double Q = gauss_kronrod<double, 15>::integrate(f, 0, b, 5, 1e-9, &error);
double Q = boost::math::quadrature::trapezoidal(f, 0, b, 1e-6);
//std::cout << Q << ", error estimated at " << error <<std::endl;
return Q;
}
การใช้งานฟังก์ชัน $f(r,z)$ และส่วนที่เหลือของอินทิกรัลมีดังต่อไปนี้
double initial(double r, double z, int m, int n)
{
return std::sin(M_PI*n*z/a)*std::cyl_bessel_j(0, boost::math::cyl_bessel_j_zero(0,m)*r/b);
}
double integrand(double r,double z,int n,int m)
{
return initial(r,z,m,n)*std::sin(M_PI*n*z/a)*std::cyl_bessel_j(0, boost::math::cyl_bessel_j_zero(0,m)*r/b);
}
โดยปกติแล้ว Initial จะไม่ต้องการพวกมันและตัวแปร n ตัว แต่ในกรณีนี้ ฉันต้องทำการทดสอบบางอย่าง
ปัญหาคือฉันไม่เข้าใจว่าจะแยกฟังก์ชันของฉันเหมือนในตัวอย่างสำหรับปัญหาของฉันและดำเนินการบูรณาการอย่างไร เนื่องจากบูสต์ยอมรับฟังก์ชันตัวแปรเพียง 1 รายการเท่านั้น
กรุณาช่วย