برای محاسبه انتگرال در پایتون دو روش وجود دارد: «نمادین» یا تحلیلی و «عددی» یا تقریبی. اگر به یک فرمول ریاضی دقیق، انتگرال نامعین یا پاسخی به شکل کسری و رادیکالی نیاز دارید، کتابخانه SymPy مناسب است. برای توابع پیچیدهای که پاسخ تحلیلی ندارند، میتوانید از SciPy و NumPy استفاده کنید. این دو کتابخانه در پروژههای مهندسی و تحلیل داده نیز، زمانی که فقط یک مقدار عددی دقیق در بازهای مشخص میخواهید، محاسبات را با سرعت بالا انجام میدهند.
انتخاب روش به خروجی مورد نیاز پروژه شما بستگی دارد. پیادهسازی محاسبات ریاضی و انتگرالگیری از مهارتهای کاربردی در مسیر آموزش پایتون برای دانشجویان مهندسی، پژوهشگران علوم پایه و فعالان علم داده و هوش مصنوعی است تا مسائل پیچیده را بدون خطای انسانی حل کنند.
برای کدنویسی انتگرالهای نمادین و عددی، ابتدا ابزارهای موجود را مقایسه میکنیم. سپس کد محاسبه انتگرالهای نامعین، معین، ناسره، دوگانه و چندگانه و انتگرالگیری از نقاط داده گسسته را همراه با خروجی دقیق آنها مینویسیم.
مقایسه کتابخانههای پایتون برای انتگرالگیری؛ SymPy یا SciPy؟
پیش از شروع کدنویسی، کتابخانه را بر اساس صورتمسئله انتخاب کنید. اگر برای ورود به مباحث کدنویسی به مرور مفاهیم پایه انتگرال معین و نامعین نیاز دارید، مشاهده دورههای آموزش انتگرال به درک بهتر این الگوریتمها کمک میکند. سه کتابخانه اصلی پایتون برای انتگرالگیری اینها هستند:

- کتابخانه SymPy یک سیستم جبر رایانهای (CAS) برای محاسبات نمادین است. انتگرالها را بهصورت تحلیلی حل میکند و خروجی آن یک عبارت ریاضی (تابع) یا عدد دقیق نمادین است. این نوع خروجی برای تحلیلهای تئوری و آموزش کاربرد دارد.
- کتابخانه SciPy در ماژول scipy.integrate توابع آمادهای مانند quad، dblquad و tplquad دارد که انتگرالگیری عددی را با دقت بالا انجام میدهند. این کتابخانه برای پروژههای علمی و مهندسی با کرانهای مشخص انتگرال کاربرد دارد.
- کتابخانه NumPy ابزار مستقیمی برای انتگرالگیری نمادین ندارد، اما برای کار با آرایهها و دادههای بزرگ در روشهای عددی تقریبی، مانند روش مستطیلی، ذوزنقهای یا سیمپسون، سرعت بالایی دارد.
تفاوتهای فنی و کاربردی این سه ابزار را میتوانید در جدول زیر مقایسه کنید:
| کتابخانه / روش | نوع انتگرال | توابع و روشهای محاسبه | مزایا | محدودیتها | بهترین کاربرد |
|---|---|---|---|---|---|
| SciPy | عددی | quad, dblquad, tplquad, nquad, fixed_quad, simpson, cumulative_trapezoid | سرعت بالا، دقت قابل قبول و بالا، مناسب پروژههای مهندسی | نیاز به تعیین بازه مشخص، پیچیدگی در توابع چندمتغیره | حل عددی سریع، تحلیل دادهها و مسائل مهندسی |
| NumPy | عددی تقریبی | روش مستطیلی، ذوزنقهای، سیمپسون (کار با آرایهها) | سرعت بالا، مناسب برای دادههای بزرگ | دقت کمتر نسبت به توابع تحلیلی SciPy، محدود به انتگرالهای عددی | محاسبات روی آرایههای بزرگ و دادههای گسسته |
| SymPy | نمادین (تحلیلی) | integrate | نمایش دقیق تابع تحلیلی، حل انتگرال نامعین و معین | سرعت پایینتر در دادههای بزرگ، پیچیدگی در محاسبات چندگانه | تحلیل ریاضیاتی، مدلسازی تئوری و آموزش |
محاسبه نمادین انتگرال در پایتون با کتابخانه SymPy
اگر به فرمول تابع اولیه (پادمشتق) نیاز دارید یا میخواهید پاسخ انتگرال معین را بدون تقریب اعشاری، مثلاً به صورت [فرمول] یا [فرمول] ، به دست آورید، باید از SymPy استفاده کنید.
پیشنیازها؛ نصب و تعریف متغیرهای نمادین (Symbols)
کتابخانه SymPy بهطور کامل با پایتون نوشته شده است و فقط به کتابخانه mpmath وابسته است. mpmath محاسبات ممیز شناور را با دقت دلخواه انجام میدهد. برای نصب SymPy، دستور زیر را در ترمینال یا خط فرمان اجرا کنید:
pip install sympy
برخلاف سایر سیستمهای جبر رایانهای، در SymPy باید پیش از استفاده، متغیرهای نمادین را بهصورت صریح با کلاس Symbol یا تابع symbols تعریف کنید. طبق قواعد نحوه import در پایتون، میتوانید کل ماژول را با نام مخفف فراخوانی کنید یا فقط توابع مورد نیاز را وارد برنامه کنید:
from sympy import Symbol, symbols
# تعریف یک متغیر نمادین
x = Symbol('x')
# تعریف چند متغیر نمادین به صورت همزمان
x, y = symbols('x, y')
محاسبه انتگرال نامعین در SymPy
نتیجه انتگرال نامعین تابعی است که مشتق آن با تابع اولیه (انتگرالده) برابر است؛ مفهومی که پایه اصلی مباحث مشتق و انتگرال در ریاضیات را تشکیل میدهد.

در SymPy، تابع integrate(f, x) انتگرال را با استفاده از الگوریتم توسعهیافته ریش-نورمن (Risch-Norman) و تطبیق الگو محاسبه میکند. آرگومان اول، عبارت ریاضی است و آرگومان دوم متغیر انتگرالگیری را مشخص میکند:
import sympy as sym
x = sym.Symbol('x')
# ۱. انتگرال توابع چندجملهای
print("Polynomial:", sym.integrate(x2, x))
print("Polynomial 2:", sym.integrate(6 * x5, x))
# ۲. انتگرال توابع مثلثاتی و هیپربولیک
print("Trigonometric:", sym.integrate(sym.sin(x), x))
print("Hyperbolic:", sym.integrate(2 * x + sym.sinh(x), x))
# ۳. انتگرال توابع لگاریتمی و نمایی ترکیبی
print("Logarithmic:", sym.integrate(sym.log(x), x))
ans_exp = sym.integrate(sym.exp(x) * sym.sin(x) + sym.exp(x) * sym.cos(x), x)
print("Exponential:", ans_exp)
# ۴. انتگرال توابع خاص (مانند تابع خطا erf)
ans_special = sym.integrate(sym.exp(-x2) * sym.erf(x), x)
print("Special function:", ans_special)
خروجی اجرای این کد به شکل عبارات جبری دقیق است:
Polynomial: x3/3
Polynomial 2: x6
Trigonometric: -cos(x)
Hyperbolic: x2 + cosh(x)
Logarithmic: x*log(x) - x
Exponential: exp(x)*sin(x)
Special function: sqrt(pi)*erf(x)2/4
برای حفظ ماهیت نمادین عبارت، باید توابع ریاضی مانند sin، cos، exp، log و تابع خطای erf را از خود کتابخانه sympy فراخوانی کنید.
محاسبه انتگرال معین و انتگرالهای ناسره (بینهایت)
برای محاسبه انتگرال معین در بازه مشخص [فرمول] ، آرگومان دوم تابع integrate را به شکل تاپل سهتایی (متغیر, کران پایین, کران بالا) وارد کنید؛ یعنی (x, a, b).

در SymPy، ثابتهای ریاضی مانند عدد پی (pi) و بینهایت (oo) نیز تعریف نمادین دارند. بنابراین میتوانید انتگرالهای ناسره (Improper Integrals) با یک یا دو کران بینهایت را به شکل دقیق محاسبه کنید:
from sympy import Symbol, integrate, sin, cos, exp, pi, oo
x = Symbol('x')
# انتگرال معین با کرانهای عددی
res1 = integrate(x2, (x, 0, 2))
res2 = integrate(x3, (x, -1, 1))
# انتگرال معین با کران برحسب عدد پی (pi)
res3 = integrate(sin(x), (x, 0, pi / 2))
res4 = integrate(cos(x), (x, -pi / 2, pi / 2))
# انتگرالهای ناسره (کران بینهایت با نماد oo)
res5 = integrate(exp(-x), (x, 0, oo))
res6 = integrate(exp(-x2), (x, -oo, oo))
res7 = integrate(sin(x2), (x, -oo, oo))
print("Integral x^2 [0, 2]:", res1)
print("Integral x^3 [-1, 1]:", res2)
print("Integral sin(x) [0, pi/2]:", res3)
print("Integral cos(x) [-pi/2, pi/2]:", res4)
print("Improper exp(-x) [0, oo]:", res5)
print("Improper exp(-x^2) [-oo, oo]:", res6)
print("Improper sin(x^2) [-oo, oo]:", res7)
# تبدیل خروجی نمادین به عدد اعشاری با متد evalf()
print("Decimal value of res7:", res7.evalf())
خروجیها مقادیر دقیق کسری و رادیکالی هستند. در خط آخر، متد .evalf() عبارت نمادین را به عدد اعشاری (Floating-point) تبدیل میکند:
Integral x^2 [0, 2]: 8/3
Integral x^3 [-1, 1]: 0
Integral sin(x) [0, pi/2]: 1
Integral cos(x) [-pi/2, pi/2]: 2
Improper exp(-x) [0, oo]: 1
Improper exp(-x^2) [-oo, oo]: sqrt(pi)
Improper sin(x^2) [-oo, oo]: sqrt(2)*sqrt(pi)/2
Decimal value of res7: 1.25331413731550
محاسبه عددی انتگرال در پایتون با کتابخانه SciPy
در انتگرالگیری عددی، مقدار انتگرال را بهجای حل تحلیلی با روشهای تقریبی محاسبه میکنیم. این روشها از مباحث آموزش محاسبات عددی هستند. در پایتون، ماژول scipy.integrate ابزارهای متنوعی برای محاسبه انتگرالهای تکمتغیره، چندگانه و دادههای گسسته دارد.
انتگرال معین تکمتغیره با تابع quad
تابع quad ابزار استاندارد و عمومی محاسبه انتگرال معین توابع تکمتغیره در یک بازه مشخص است. ابتدا تابع ریاضی مورد نظر را طبق قواعد تعریف تابع در پایتون، با دستور def یا lambda بنویسید. سپس نام تابع و کران پایین و بالا را به quad(f, a, b) بدهید. کرانها میتوانند مثبت یا منفی بینهایت نیز باشند.
from scipy.integrate import quad
# تعریف تابع انتگرالده
def f(x):
return 3 * x2 + 1
# محاسبه انتگرال در بازه 0 تا 1
I, err = quad(f, 0, 1)
print("نتیجه انتگرال:", I)
print("تخمین خطای مطلق:", err)
این کد نتیجه انتگرال و تخمین خطای مطلق را چاپ میکند:
نتیجه انتگرال: 2.0
تخمین خطای مطلق: 2.220446049250313e-14
تابع quad در حالت پیشفرض یک تاپل با دو مقدار برمیگرداند. مقدار اول (I) نتیجه عددی انتگرال است و مقدار دوم (err) تخمین خطای مطلق محاسبه را نشان میدهد. در این مثال، تخمین خطا عددی نزدیک به صفر ( [فرمول] ) است.
انتگرال دوگانه و چندگانه با dblquad، tplquad و nquad
SciPy برای محاسبه انتگرال توابع چندمتغیره روی نواحی مستطیلی یا منحنی سه تابع مجزا دارد. هنگام محاسبه عددی مساحت یا حجم، تعیین دقیق ترتیب کرانهای متغیر داخلی و خارجی اهمیت زیادی دارد. منطق ریاضی این ترتیب در مباحث انتگرال دوگانه بررسی میشود.
ورودی اول dblquad یک تابع دومتغیره است. در این تابع، متغیر درونی [فرمول] آرگومان اول و متغیر بیرونی [فرمول] آرگومان دوم است. ورودیهای دوم و سوم dblquad کرانهای متغیر بیرونی ( [فرمول] ) و ورودیهای چهارم و پنجم کرانهای متغیر درونی ( [فرمول] ) هستند. کرانهای متغیر داخلی ( [فرمول] )، حتی اگر عدد ثابت باشند، میتوانند بهصورت تابعی از متغیر [فرمول] تعریف شوند. به همین دلیل، برای نوشتن کوتاه این کرانها از تابع لامبدا در پایتون (lambda) استفاده میکنیم:
from scipy.integrate import dblquad
# مثال ۱: انتگرال دوگانه با کرانهای متغیر (وابسته به x)
# کران بیرونی x از 0 تا 0.5 و کران درونی y از 0 تا 1-2x
area_curved = dblquad(lambda y, x: x * y, 0, 0.5, lambda x: 0, lambda x: 1 - 2 * x)
print("انتگرال دوگانه (کران متغیر):", area_curved)
# مثال ۲: انتگرال دوگانه با کرانهای ثابت (x از 0 تا 1 و y از 0 تا 2)
def f2(y, x):
return x * y
result_rect, error_rect = dblquad(f2, 0, 1, lambda x: 0, lambda x: 2)
print("انتگرال دوگانه (کران ثابت):", result_rect)
خروجی دو مثال به این شکل است:
انتگرال دوگانه (کران متغیر): (0.010416666666666668, 4.101620128472366e-16)
انتگرال دوگانه (کران ثابت): 1.0
برای محاسبه انتگرال سهگانه میتوانید از tplquad استفاده کنید. در این تابع، کرانهای متغیر سوم را بهصورت توابع lambda از دو متغیر قبلی، یعنی lambda x, y، مینویسید. برای انتگرالگیری در ابعاد دلخواه ( [فرمول] بعدی)، تابع nquad انعطاف بیشتری دارد و بازهها را به شکل یک لیست از لیستها دریافت میکند:
from scipy.integrate import tplquad, nquad
# مثال ۱: انتگرال سهگانه با tplquad
def f_triple(z, y, x):
return x + y + z
# بازهها: x از 0 تا 1، y از 0 تا 1، z از 0 تا 1
res_tpl, err_tpl = tplquad(
f_triple, 0, 1,
lambda x: 0, lambda x: 1,
lambda x, y: 0, lambda x, y: 1
)
print("نتیجه tplquad:", res_tpl)
# مثال ۲: انتگرال چندگانه با nquad
def f_multi(x, y, z):
return x * y * z
# ارسال مستقیم لیست بازهها برای هر متغیر
res_nquad = nquad(f_multi, [[0, 1], [0, 5], [0, 5]])
print("نتیجه nquad و خطا:", res_nquad)
اجرای دو مثال این خروجی را دارد:
نتیجه tplquad: 1.5
نتیجه nquad و خطا: (78.12499999999999, 8.673617379884033e-13)
انتگرالگیری به روش کوادراتور گاوسی با fixed_quad
تابع fixed_quad انتگرال معین یک تابع را به روش کوادراتور گاوسی (Gaussian quadrature)، با تعداد نقاط مشخص و ثابت، محاسبه میکند. برای تعیین تعداد نقاط، پارامتر n را مقداردهی کنید:
from scipy import integrate
def func(x):
return 3 * x3
# محاسبه انتگرال از 1.0 تا 2.0 با مرتبه ثابت n=2
B = integrate.fixed_quad(func, 1.0, 2.0, n=2)
print(B)
این تابع یک تاپل برمیگرداند که عضو دوم آن None است:
(11.25, None)
انتگرالگیری از دادههای گسسته (آرایهها) با simpson و cumulative_trapezoid
در بسیاری از آزمایشهای مهندسی و مسائل علم داده، فرمول ریاضی تابع را نداریم و فقط نقاط داده گسسته در اختیار ماست؛ یعنی آرایههای [فرمول] و [فرمول] . در این حالت، ابتدا دادهها را با آرایههای کتابخانه numpy در پایتون آماده میکنیم. سپس برای انتگرالگیری از توابع cumulative_trapezoid یا simpson در SciPy استفاده میکنیم:
import numpy as np
from scipy.integrate import cumulative_trapezoid, simpson
# تعریف نقاط داده گسسته [0, 1, 2, 3, 4]
x = np.arange(0, 5)
y = np.arange(0, 5)
# ۱. انتگرال تجمعی به روش ذوزنقهای
S_cum = cumulative_trapezoid(y, x)
print("مساحت تجمعی (گام به گام):", S_cum)
# ۲. انتگرال به روش سیمپسون
S_simp = simpson(y, x=x)
print("مساحت نهایی به روش سیمپسون:", S_simp)
خروجی اجرای این کد تفاوت عملکرد دو تابع را نشان میدهد:
مساحت تجمعی (گام به گام): [0.5 2. 4.5 8. ]
مساحت نهایی به روش سیمپسون: 8.0
تابع cumulative_trapezoid انتگرال تجمعی را با قاعده ذوزنقهای حساب میکند. خروجی آن آرایهای است که مجموع مساحت زیر منحنی را در هر گام نشان میدهد. تابع simpson با قاعده سیمپسون، کل مساحت زیر منحنی را بهصورت یک عدد نهایی برمیگرداند. این روش برای منحنیهای هموار دقت بیشتری نسبت به روش ذوزنقهای دارد.
پیادهسازی انتگرال عددی در پایتون بدون کتابخانه (روش مستطیلی)
شناخت منطق پایه انتگرالگیری عددی به درک بهتر عملکرد درونی کتابخانهها کمک میکند. در «روش مستطیلی» (Rectangular Integral Approximation)، برای محاسبه سطح زیر منحنی تابع پیوسته [فرمول] در بازه [فرمول] ، بازه را به [فرمول] قسمت مساوی تقسیم میکنیم. عرض هر مستطیل برابر با [فرمول] خواهد بود.

ارتفاع (طول) هر مستطیل را از مقدار تابع در نقطه میانی هر بازه ( [فرمول] ) تعیین میکنیم. این نقطه از رابطه زیر به دست میآید:
[تصویر: ]
سپس مساحت همه مستطیلها را جمع میکنیم تا مقدار تقریبی انتگرال معین به دست آید:
[تصویر: ]
با افزایش تعداد مستطیلها ( [فرمول] )، دقت محاسبه بیشتر میشود. تبدیل این فرمول ریاضی به حلقه تکرار، تمرین مناسبی برای تقویت منطق الگوریتمی در مسیر آموزش برنامهنویسی است. این الگوریتم را برای تابع [فرمول] ، فقط با پایتون پایه و کتابخانه استاندارد math، به این شکل پیادهسازی کردهایم:
from math import *
def Integrate(n, a, b):
# تعریف تابع انتگرالده
def f(x):
return x2
value = 0
# حلقه تکرار برای جمع مقادیر تابع در نقاط میانی
for i in range(1, n + 1):
x_bar = a + ((2 * i - 1) / (2 * n)) * (b - a)
value = value + f(x_bar)
# ضرب مجموع ارتفاعها در عرض مستطیل (Delta x)
value2 = ((b - a) / n) * value
return value2
# مثال: محاسبه انتگرال x^2 در بازه 0 تا 2 با 1000 مستطیل
n = 1000
a = 0.0
b = 2.0
print("نتیجه انتگرال به روش مستطیلی:", Integrate(n, a, b))
خروجی کد عدد ۲.۶۶۶۶۶۶۰۰۰۰۰۰۰۰۰۳ است؛ تقریبی نزدیک به مقدار دقیق [فرمول] ( [فرمول] ). برای محاسبه انتگرال تابع دیگری مانند سینوس، کافی است عبارت جلوی return در تابع f(x) را به sin(x) تغییر دهید.
مثالهای کاربردی محاسبه انتگرال در پایتون
نحوه استفاده از کدهای انتگرالگیری را در سه مسئله علمی از هندسه، فیزیک و آمار بررسی میکنیم. سپس تابعی ترکیبی مینویسیم.
محاسبه مساحت، کار در فیزیک و احتمال در آمار
با تابع quad در کتابخانه SciPy میتوان محاسبات این سه مسئله را کدنویسی کرد:

- در هندسه، مساحت زیر نمودار تابع [فرمول] را در بازه [فرمول] تا [فرمول] محاسبه میکنیم.
- در فیزیک، کار انجامشده توسط نیروی متغیر [فرمول] را هنگام جابهجایی جسم از نقطه [فرمول] تا [فرمول] متر به دست میآوریم.
- در آمار و احتمالات، احتمال رخداد [فرمول] را برای یک متغیر تصادفی پیوسته محاسبه میکنیم. تابع چگالی احتمال (PDF) این متغیر به فرم [فرمول] است و در بازه [فرمول] تعریف شده است. محاسبه سطح زیر نمودار توابع چگالی احتمال یکی از کاربردهای رایج انتگرال در مباحث آموزش علم داده با پایتون است.
from scipy import integrate
# ۱. محاسبه مساحت زیر منحنی f(x) = x^2 از 0 تا 3
area, _ = integrate.quad(lambda x: x2, 0, 3)
print("مساحت زیر منحنی:", area)
# ۲. محاسبه کار انجام شده توسط نیروی F(x) = 5x از 0 تا 4 متر
def F(x):
return 5 * x
work, _ = integrate.quad(F, 0, 4)
print("کار انجام شده (ژول):", work)
# ۳. محاسبه احتمال x <= 0.5 برای تابع چگالی احتمال pdf(x) = 3x^2
def pdf(x):
return 3 * x2
probability, _ = integrate.quad(pdf, 0, 0.5)
print("احتمال وقوع x <= 0.5:", probability)
خروجی هر سه مسئله به این صورت است:
مساحت زیر منحنی: 9.0
کار انجام شده (ژول): 40.0
احتمال وقوع x <= 0.5: 0.125
نوشتن تابع هوشمند برای ترکیب روش نمادین و عددی
اگر پروژه هم به تحلیل فرمولی، یعنی انتگرال نامعین، و هم به محاسبات سریع انتگرال معین نیاز دارد، میتوانید SymPy و SciPy را در یک تابع واحد ترکیب کنید. تابع smart_integral بررسی میکند که کاربر بازهای (bounds) تعیین کرده است یا نه. اگر بازه وجود داشته باشد، انتگرال را به روش عددی با quad محاسبه میکند. در غیر این صورت، تابع نمادین را با SymPy برمیگرداند:
from sympy import symbols, integrate
from scipy import integrate as sci_integrate
def smart_integral(func, var, bounds=None):
# اگر کرانهای انتگرال مشخص شده باشند -> روش عددی با SciPy
if bounds:
result, error = sci_integrate.quad(func, bounds[0], bounds[1])
return f"نتیجه عددی: {result}"
# اگر بازه مشخص نباشد -> روش نمادین (نامعین) با SymPy
else:
x = symbols(var)
result = integrate(func(x), x)
return f"نتیجه نمادین: {result}"
# تعریف تابع با lambda
f = lambda x: x2
# تست تابع در دو حالت معین و نامعین
print(smart_integral(f, 'x', bounds=(0, 2)))
print(smart_integral(f, 'x'))
تابع در دو حالت معین و نامعین این نتایج را برمیگرداند:
نتیجه عددی: 2.6666666666666665
نتیجه نمادین: x3/3

سوالات متداول
۱. چگونه خطاهای عددی در محاسبه انتگرال در پایتون را کاهش دهیم؟
برای کاهش خطای تقریب در روشهای عددی، میتوانید در الگوریتمهای پایه تعداد تقسیمات بازه ( [فرمول] ) را افزایش دهید؛ یعنی بازهها را کوچکتر کنید. راه دیگر، استفاده از توابع دقیقتر SciPy مانند quad، روش سیمپسون (simpson) و روشهای کوادراتور گاوسی بهجای روشهای ساده مستطیلی و ذوزنقهای است.
۲. برای محاسبه انتگرال در پایتون، کتابخانه SymPy مناسبتر است یا SciPy؟
انتخاب کتابخانه به خروجی مورد نیاز شما بستگی دارد. SciPy برای محاسبات عددی سریع و دقیق در بازههای مشخص مناسب است. اگر به حل تحلیلی، انتگرال نامعین و دریافت یک فرمول ریاضی در خروجی نیاز دارید، باید از SymPy استفاده کنید.
۳. آیا میتوان انتگرالهای چندگانه را با کتابخانه NumPy محاسبه کرد؟
NumPy تابع مستقیم و آمادهای برای حل انتگرالهای چندگانه ندارد. برای محاسبه دقیق انتگرالهای دوگانه، سهگانه و چندبعدی، بهتر است از توابع dblquad، tplquad و nquad در کتابخانه SciPy استفاده کنید.
