رفتن به مطلب
جامعهٔ برنامه‌نویسان ایران
کامبیز اسدزاده

توابع ریاضی ویژه در استاندارد ۱۷ از سی‌پلاس‌پلاس


پست های پیشنهاد شده

در این مقاله نیاز است بدانید که، کتابخانهٔ توابع ویژه ریاضی در اصل بخشی از کتابخانه TR1 ISO / IEC TR 19768: 2007 بود، سپس به عنوان یک استاندارد ISO مستقل، ISO / IEC 29124: 2010 منتشر شد و در نهایت از C++ 17 به استاندارد ایزو ادغام شد.

برای استفاده از توابع ریاضیاتی مانند هرمیتی، بسل و غیره کافی است فایل سرآیند <cmath> را فراخوانی کنید.

به عنوان مثال توابع چند‌جمله‌ای لگر به صورت زیر می‌توانند مورد استفاده قرار گیرند:

#include <cmath>
#include <iostream>

double L1(unsigned m, double x) { return -x + m + 1; }
double L2(unsigned m, double x) { return 0.5*(x*x-2*(m+2)*x+(m+1)*(m+2)); }

int main()
{
    // spot-checks
    std::cout << std::assoc_laguerre(1, 10, 0.5) << '=' << L1(10, 0.5) << '\n'
              << std::assoc_laguerre(2, 10, 0.5) << '=' << L2(10, 0.5) << '\n';
}

مثالی از کاربرد توابع چندجمله‌ای‌های لژاندر bd51c7228067db4bea119843fb19c6caab834954:

#include <cmath>
#include <iostream>
double P20(double x) { return 0.5*(3*x*x-1); }
double P21(double x) { return 3.0*x*std::sqrt(1-x*x); }
double P22(double x) { return 3*(1-x*x); }
int main()
{
    // spot-checks
    std::cout << std::assoc_legendre(2, 0, 0.5) << '=' << P20(0.5) << '\n'
              << std::assoc_legendre(2, 1, 0.5) << '=' << P21(0.5) << '\n'
              << std::assoc_legendre(2, 2, 0.5) << '=' << P22(0.5) << '\n';
}

نحوهٔ استفاده از توابع بتا 72079677c102d13255997ca503995071751bc415

#include <cmath>
#include <string>
#include <iostream>
#include <iomanip>

double binom(int n, int k) { return 1/((n+1)*std::beta(n-k+1,k+1)); }

int main()
{
    std::cout << "Pascal's triangle:\n";
    for(int n = 1; n < 10; ++n) {
        std::cout << std::string(20-n*2, ' ');
        for(int k = 1; k < n; ++k)
            std::cout << std::setw(3) << binom(n,k) << ' ';
        std::cout << '\n';
    }
}

اطلاعات بیشتر از این تابع، در این لینک.

نحوهٔ استفاده از توابع انتگرال بیضوی نوع اول 8c44bc76409dc7c70cedbd000891b672bede1487 :

#include <cmath>
#include <iostream>

int main()
{
    double hpi = std::acos(-1)/2;

    std::cout << "K(0) = " << std::comp_ellint_1(0) << '\n'
              << "π/2 = " << hpi << '\n'
              << "K(0.5) = " << std::comp_ellint_1(0.5) << '\n'
              << "F(0.5, π/2) = " << std::ellint_1(0.5, hpi) << '\n';
    std::cout << "Period of a pendulum length 1 m at 90° initial angle is "
              << 4*std::sqrt(1/9.80665)*
                 std::comp_ellint_1(std::pow(std::sin(hpi/2),2)) << " s\n";
}

اطلاعات بیشتر از این تابع، در این لینک.

نحوهٔ استفاده از توابع انتگرال بیضوی نوع دوم f1bcc3ab6912f07c1fefa24902e3c7b793b886fb :

#include <cmath>
#include <iostream>

int main()
{
    double hpi = std::acos(-1)/2;

    std::cout << "E(0) = " << std::comp_ellint_2(0) << '\n'
              << "π/2 = " << hpi << '\n'
              << "E(1) = " << std::comp_ellint_2(1) << '\n'
              << "E(1, π/2) = " << std::ellint_2(1, hpi) << '\n';
}

اطلاعات بیشتر از این تابع، در این لینک.

نحوهٔ استفاده از توابع انتگرال بیضوی نوع سوم 50b0c46b333ed1f25110f8fbfcf6d01ee7275277 :

#include <cmath>
#include <iostream>

int main()
{
    std::cout << std::fixed
              << "Π(0.5,0) = " << std::comp_ellint_3(0.5, 0) << '\n'
              << "K(0.5)   = " << std::comp_ellint_1(0.5) << '\n'
              << "Π(0,0)   = " << std::comp_ellint_3(0, 0) << '\n'
              << "π/2      = " << std::acos(-1)/2 << '\n'
              << "Π(0.5,1) = " << std::comp_ellint_3(0.5, 1) << '\n';
}

اطلاعات بیشتر از این تابع، در این لینک.

نحوهٔ استفاده از توابع بسل نوع اول ed47616b50abbef012a9a4e0069b50d4894ac320 :

#include <cmath>
#include <iostream>

int main()
{
    // spot check for ν == 0
    double x = 1.2345;
    std::cout << "I_0(" << x << ") = " << std::cyl_bessel_i(0, x) << '\n';
 
    // series expansion for I_0
    double fct = 1;
    double sum = 0;
    for(int k = 0; k < 5; fct*=++k) {
        sum += std::pow((x/2),2*k) / std::pow(fct,2);
        std::cout << "sum = " << sum << '\n';
    }        
}

اطلاعات بیشتر از این تابع، در این لینک.

نحوهٔ استفاده از توابع بسل نوع دوم ff32812f22090cd5898d99213a194f53c511387c :

#include <cmath>
#include <iostream>

int main()
{
    // spot check for ν == 0
    double x = 1.2345;
    std::cout << "J_0(" << x << ") = " << std::cyl_bessel_j(0, x) << '\n';
 
    // series expansion for J_0
    double fct = 1;
    double sum = 0;
    for(int k = 0; k < 6; fct*=++k) {
        sum += std::pow(-1, k)*std::pow((x/2),2*k) / std::pow(fct,2);
        std::cout << "sum = " << sum << '\n';
    }        
}

اطلاعات بیشتر از این تابع، در این لینک.

همچنین در مورد توابع دیگر مانند هرمیتی و غیره می‌توانید از مرجع آن استفاده کنید.

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

به گفتگو ملحق شوید

شما همین الآن می‌توانید مطلبی را ارسال و بعداً ثبت‌نام کنید. اگر حساب کاربری دارید، و با حساب کاربری خود مطلب ارسال کنید.
نکته: مطلب شما قبل از انتشار نیاز به بازبینی توسط میانجی‌گر‌ها دارد.

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از ۷۵ اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به عنوان یک لینک به جای

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.


  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...