فهرست بستن

محاسبات ریاضی سمبولیک در پایتون با استفاده از کتابخانه Sympy

در کنار مجموعه کتابخانه‌های NumPy و SciPy که محاسبات علمی در پایتون را تسهیل نموده و روش‌های عددی متعددی را برای کاربران فراهم می‌آورند، کتابخانه SymPy امکان محاسبات سمبولیک را فراهم می‌آورد. این کتابخانه قابلیت محاسبات جبری، محاسبه حد، مشتق و انتگرال، حل معادلات و کار بر روی ماتریس‌ها را بصورت پارامتری برای ما به ارمغان می‌آورد. در این نوشته با ذکر چند مثال با این کتابخانه آشنا می‌شویم.

بسم الله الرحمن الرحیم

یک راست برویم سر اصل مطلب تا با چندین مثال کتابخانه SymPy و امکاناتی را که به ما می‌دهد بهتر بشناسیم.

  • استفاده بعنوان یک ماشین حساب:
import sympy as sp
a = sp.Rational(1, 2)
print(a ** 2)
print(a + a ** 5)
print(a / 3)

  • برای محاسبه مقدار عددی:
import sympy as sp
a = sp.pi
print(a ** 2)
print(a / 5)
print((a ** 2).evalf())

  • تعریف متغیرهای سمبلیک:
import sympy as sp
x = sp.Symbol("x")
y = sp.Symbol("y")
z = sp.Symbol("z")
print(x + y + z - 2 * x - 3 * y)

  • بسط عبارات جبری و جاگذاری متغیرها در عبارت سمبولیک:
import sympy as sp
x = sp.Symbol("x")
y = sp.Symbol("y")
z = sp.Symbol("z")
expr = (x + y + z) ** 3
print(sp.expand(expr))
print(expr.evalf(subs={x:1, y:2, z:-1}))

  • ساده سازی عبارات جبری:
import sympy as sp
x = sp.Symbol("x")
y = sp.Symbol("y")
print(sp.simplify((x + x * y) / x))

  • پیدا کردن حد توابع:
import sympy as sp
x = sp.Symbol("x")
print(sp.limit(sp.sin(x)/x, x, 0))

  • پیدا کردن حد در بینهایت:
import sympy as sp
x = sp.Symbol("x")
print(sp.limit(1/x, x, sp.oo))

  • پیدا کردن مشتق:
import sympy as sp
x = sp.Symbol("x")
print(sp.diff(sp.sin(sp.tan(x)), x))

  • بسط توابع:
import sympy as sp
x = sp.Symbol("x")
print(sp.series(sp.sin(sp.tan(x)), x))

  • انتگرال گیری سمبولیک:
import sympy as sp
x = sp.Symbol("x")
print(sp.integrate(sp.log(x), x))

  • محاسبه انتگرال معین:
import sympy as sp
x = sp.Symbol("x")
print(sp.integrate(sp.cos(x), (x, -sp.pi / 2, sp.pi / 2)))

  • محاسبه انتگرالهای ناسره:
import sympy as sp
x = sp.Symbol("x")
print(sp.integrate(sp.exp(-x ** 2), (x, -sp.oo, sp.oo)))

  • حل معادلات:
import sympy as sp

x = sp.Symbol("x")
y = sp.Symbol("y")

print(sp.solve(x ** 4 - 1, x))

print(sp.solve([x + 5 * y - 2, -3 * x + 6 * y - 15], [x, y]))

  • فاکتور برای چند جمله ای ها:
import sympy as sp

x = sp.Symbol("x")
f = x ** 4 - 3 * x ** 2 + 1

print(sp.factor(f))

print(sp.factor(f, modulus=5))

  • ماتریس ها:
import sympy as sp

x = sp.Symbol("x")
y = sp.Symbol("y")

A = sp.Matrix([[1, x], [y, 1]])
print(A ** 2)

  • معادلات دیفرانسیلی:
import sympy as sp

x = sp.Symbol("x")
f = sp.symbols("f", cls=sp.Function)

o = sp.dsolve(f(x).diff(x, x) + f(x), f(x))
print(o)

20 Comments

  1. امیرحسین

    سلام با تشکر از مطالب مفیدتون
    برای حل معادله های از درجه بالاتر به طور مثال حل معادله درجه دو چه راه حلی است ؟؟؟

    • ادمین

      خیلی ممنون، فکر نکنم منظورتان حل معادله جبری باشد چون خود مثال درجه چهار است. برای معادلات دیفرانسیلی مرتبه‌های بالاتر که احتمالا سوالتان مربوط به آن باشد، فرض کنیم معادله دیفرانسیل مثال به شکلی تغییر یابد که مشتق دوم f مد نظر باشد. برای اینکار از عبارت حاصل از f(x).diff(x, x) باز دیفرانسیل می گیریم به عبارتی:
      f(x).diff(x, x).diff(x, x)

  2. علی

    سلام ممنون بابت اموزشاتون سوالی که داشتم اینه که سینوس اینورس یا همون arcsin رو چجوری میشه تو پایتون نوشت

    • ادمین

      ضمن تشکر از جنبعالی. از کتابخانه math تابع asin یا گزینه بهتر، از کتابخانه numpy تابع arcsin.
      from numpy import arcsin
      print(arcsin(1))

  3. seyyed javad

    سلام.
    ممنون از شما و وقتي كه ميزاريد.
    ميخواستم بدونم براي انجام محاسبات انتگرال دو گانه و سه گانه از چه راه حلي ميشه استفاده كرد؟
    همچنين انتگرال هايي كه نياز به راه حل هاي جزء به جزء دارند (مثل (xcos(x)رو محاسباتش رو خودش داخل خود انتگرال معمولي مثل بالا، انجام ميده؟

    باتشكر

    • ادمین

      ۱) متغیرهای مختلف را تعریف کنید. تابعی که قرار است انتگرال گیری از آن انجام شود را بر اساس آن متغیرها بنویسید. سپس مشابه انتگرال معمولی انتگرال گیری کنید. با انتگرال گیری از پاسخ انتگرال گیری اول، تابع بدست آمده انتگرال دوگانه آن خواهد بود. دقت کنید که توانایی کتابخانه sympy محدود است و برای هر شکل از توابع خروجی موفقی نخواهید داشت. همچنین ذکر این نکته ضروری است که اگر در نهایت دنبال پاسخ عددی انتگرال در بازه مشخص هستید به هیچ وجه از sympy استفاده نکنید و به سمت integrate از scipy بروید.
      ۲) برای توابعی که پیچیدگی زیادی نداشته باشند بلی.

  4. سهراب

    باسلام و خسته نباشید
    میخواستم بپرسم چطوری میتونم کد حل انتگرال چندگانه از روش عددی را بنویسم.
    تا انتگرال ساده اش را رفتم ولی نمیدونم چطوری انتگرال دوم و مثلا سوم را براش اضافه کنم.
    ممنون از راهنماییتون

    • ادمین

      توضیح این مسئله در یک کامنت نمی گنجد بستگی دارد از پایه همه کار را می خواهید خودتان انجام دهید یا بر اساس بعضی از کارهای استاندارد روشتان را توسعه دهید. عدم وقوف کامل من بر مختصات کاری که انجام می دهید این ایده را به ذهن من متبادر می کند که شما عبارت داخل انتگرال اول را به شکل یک تابع سه متغیره نوشته اید. عبارت انتگرال اول توسط کد انتگرال ساده‌ای که نوشته اید به طور پارامتری قابل محاسبه است پس می توانید کل عبارتی که داخل انتگرال دوم است به شکل یک تابع دو ورودی از محاسبه‌گر انتگرالی که نوشته اید بنویسید. با به کار گیری دوباره محاسبه‌گر انتگرال عبارت داخل انتگرال سوم یک تابع با یک ورودی خواهد بود. پس یکبار دیگر استفاده از محاسبه کننده انتگرال ساده کار را تمام می کند. دقت کنید که منظور من در عبارات بالا از انتگرال اول داخلی‌ترین انتگرال و از انتگرال سوم، خارجی‌ترین انتگرال است. اگر اکانت گیت‌هاب دارید کد خود را آپلود کنید و آدرس را برای من بفرستید آن موقع بهتر می توانم راهنماییتان کنم.

    • ادمین

      حل دستگاه معادلات دیفرانسیلی در ویرایشهای ابتدایی این کتابخانه موجود نبود. نمی‌دانم به طور کامل اضافه شده یا خیر. از طریق issue فوق از مخزن کدهای sympy در github می‌توانید پیگیری کنید:
      https://github.com/sympy/sympy/issues/8193

    • ادمین

      سلام، برای مثال برای عبارت زیر:

      import sympy as sp

      x = sp.Symbol(“x”)
      f = sp.sin(sp.tan(x))

      می‌توان از این روش:

      d1f = f.diff()
      d2f = d1f.diff()

      یا این روش:

      d2f = sp.diff(f, x, 2)

      استفاده کرد.

  5. مهدی

    سلام . وقت بخیر
    ببخشید برای پایتون من کتابخانه ای به اسم sympy وجود نداره
    میشه راهنماییم کنید ؟
    تشکر

    • ادمین

      برای پایتون ۲ با دستور pip install sympy
      یا برای پایتون ۳ با دستور pip3 install sympy
      یا با آناکوندا با دستور conda install sympy

  6. محمد

    سلام
    میخوام سن پدر و پسری که مجموع سنشون ۶۰ و پدر ۵ برابر پسر سن داره با پایتون بدست بیارم
    میتونید راهنماییم کنید

  7. محمود

    سلام و تشکر از سایت خوب و مفیدتان. اگر یک سری عدد داشته باشیم و بخواهیم نمودار مشتق آنها را رسم کنیم چطور باید عمل کنیم؟ زمانی که یک تابع صریح برای مشتق گیری نداریم.

    • ادمین

      با عرض سلام،

      یک راه حل مناسب استفاده از تابع gradient از کتابخانه numpy می‌باشد. فرض کنید اعداد شما در متغیری با نام samples ذخیره شده است. اگر نمونه‌هایی که در دست دارید با فواصل واحد (بر اساس متغیری که مشتق‌گیری بر اساس آن انجام می‌گیرد، مثلا زمان) نمونه‌برداری شده باشند تابع به‌صورت gradient(samples) فراخوانی می‌گردد. ولی اگر نمونه‌برداری در فواصل غیر واحد و یا کلا غیر یکنواخت انجام شده باشد باید ورودی دومی را نیز هنگام فراخوانی این تابع مقداردهی نمایید که نشان دهنده فواصل نمونه‌برداری است. این ورودی می‌تواند یک اسکالر یا یک آرایه تک بعدی باشد. برای مثال زمانی که فواصل نمونه برداری نیم واحد باشد می‌توانید تابع را به این شکل فراخوانی نمایید gradient(samples, 0.5) و زمانی که فواصل نمونه‌برداری غیر یکنواخت باشد (فرض کنیم آرایه samples دارای ۶ نمونه است) فراخوانی می‌تواند برای مثال به صورت gradient(samples, [0.5, 0.7, 0.8, 0.9, 1.3, 1.5]) انجام گیرد. دقت کنید در این حالت آرایه دوم مقادیری هست که نمونه‌برداری‌ها در آن انجام گرفته است. مثال زیر به روشن‌تر شدن نحوه استفاده از این تابع کمک می‌کند:

      from numpy import (linspace, exp, gradient, sum, )
      import matplotlib.pyplot as plt

      t = linspace(0., 1., 11)
      f = exp(-2. * t)

      df = -2. * exp(-2. * t)
      gf = gradient(f, t)

      print(“Numerical gradient error:”, sum((df – gf) ** 2))

      plt.figure()
      plt.plot(t, df, label=”Real gradient”)
      plt.plot(t, gf, label=”Numerical gradient”)
      plt.grid(True)
      plt.legend()
      plt.show()

پاسخ دادن به ادمین لغو پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *