در کنار مجموعه کتابخانههای 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)
سلام با تشکر از مطالب مفیدتون
برای حل معادله های از درجه بالاتر به طور مثال حل معادله درجه دو چه راه حلی است ؟؟؟
خیلی ممنون، فکر نکنم منظورتان حل معادله جبری باشد چون خود مثال درجه چهار است. برای معادلات دیفرانسیلی مرتبههای بالاتر که احتمالا سوالتان مربوط به آن باشد، فرض کنیم معادله دیفرانسیل مثال به شکلی تغییر یابد که مشتق دوم f مد نظر باشد. برای اینکار از عبارت حاصل از f(x).diff(x, x) باز دیفرانسیل می گیریم به عبارتی:
f(x).diff(x, x).diff(x, x)
سلام ممنون بابت اموزشاتون سوالی که داشتم اینه که سینوس اینورس یا همون arcsin رو چجوری میشه تو پایتون نوشت
ضمن تشکر از جنبعالی. از کتابخانه math تابع asin یا گزینه بهتر، از کتابخانه numpy تابع arcsin.
from numpy import arcsin
print(arcsin(1))
سلام.
ممنون از شما و وقتي كه ميزاريد.
ميخواستم بدونم براي انجام محاسبات انتگرال دو گانه و سه گانه از چه راه حلي ميشه استفاده كرد؟
همچنين انتگرال هايي كه نياز به راه حل هاي جزء به جزء دارند (مثل (xcos(x)رو محاسباتش رو خودش داخل خود انتگرال معمولي مثل بالا، انجام ميده؟
باتشكر
۱) متغیرهای مختلف را تعریف کنید. تابعی که قرار است انتگرال گیری از آن انجام شود را بر اساس آن متغیرها بنویسید. سپس مشابه انتگرال معمولی انتگرال گیری کنید. با انتگرال گیری از پاسخ انتگرال گیری اول، تابع بدست آمده انتگرال دوگانه آن خواهد بود. دقت کنید که توانایی کتابخانه sympy محدود است و برای هر شکل از توابع خروجی موفقی نخواهید داشت. همچنین ذکر این نکته ضروری است که اگر در نهایت دنبال پاسخ عددی انتگرال در بازه مشخص هستید به هیچ وجه از sympy استفاده نکنید و به سمت integrate از scipy بروید.
۲) برای توابعی که پیچیدگی زیادی نداشته باشند بلی.
باسلام و خسته نباشید
میخواستم بپرسم چطوری میتونم کد حل انتگرال چندگانه از روش عددی را بنویسم.
تا انتگرال ساده اش را رفتم ولی نمیدونم چطوری انتگرال دوم و مثلا سوم را براش اضافه کنم.
ممنون از راهنماییتون
توضیح این مسئله در یک کامنت نمی گنجد بستگی دارد از پایه همه کار را می خواهید خودتان انجام دهید یا بر اساس بعضی از کارهای استاندارد روشتان را توسعه دهید. عدم وقوف کامل من بر مختصات کاری که انجام می دهید این ایده را به ذهن من متبادر می کند که شما عبارت داخل انتگرال اول را به شکل یک تابع سه متغیره نوشته اید. عبارت انتگرال اول توسط کد انتگرال سادهای که نوشته اید به طور پارامتری قابل محاسبه است پس می توانید کل عبارتی که داخل انتگرال دوم است به شکل یک تابع دو ورودی از محاسبهگر انتگرالی که نوشته اید بنویسید. با به کار گیری دوباره محاسبهگر انتگرال عبارت داخل انتگرال سوم یک تابع با یک ورودی خواهد بود. پس یکبار دیگر استفاده از محاسبه کننده انتگرال ساده کار را تمام می کند. دقت کنید که منظور من در عبارات بالا از انتگرال اول داخلیترین انتگرال و از انتگرال سوم، خارجیترین انتگرال است. اگر اکانت گیتهاب دارید کد خود را آپلود کنید و آدرس را برای من بفرستید آن موقع بهتر می توانم راهنماییتان کنم.
مختصر و مفید
سلام وقتتون بخیر
معادله dx/dt=1-1/y, x(0)=1,
dy/dt=1/x-1, y(0)=1,
t=1
x=1,y=2 رو با چه syntax ایی بنویسم ممنون از شما
حل دستگاه معادلات دیفرانسیلی در ویرایشهای ابتدایی این کتابخانه موجود نبود. نمیدانم به طور کامل اضافه شده یا خیر. از طریق issue فوق از مخزن کدهای sympy در github میتوانید پیگیری کنید:
https://github.com/sympy/sympy/issues/8193
باسلام اگه میشه کد مشتق گرفتن برای مراتب بالاتر هم توضیح بدید
سلام، برای مثال برای عبارت زیر:
x = sp.Symbol(“x”)
f = sp.sin(sp.tan(x))
میتوان از این روش:
d2f = d1f.diff()
یا این روش:
استفاده کرد.
سلام . وقت بخیر
ببخشید برای پایتون من کتابخانه ای به اسم sympy وجود نداره
میشه راهنماییم کنید ؟
تشکر
برای پایتون ۲ با دستور pip install sympy
یا برای پایتون ۳ با دستور pip3 install sympy
یا با آناکوندا با دستور conda install sympy
سلام
میخوام سن پدر و پسری که مجموع سنشون ۶۰ و پدر ۵ برابر پسر سن داره با پایتون بدست بیارم
میتونید راهنماییم کنید
دستگاه معادلات رو تشکیل میدید، بعد با استفاده از تابع solve حل میکنید.
x, y = symbols(“x y”)
eq = [x + y – 60, 5 * x – y]
print(solve(eq))
دمت گرم
ادمین جان یه دونه ای
سلام و تشکر از سایت خوب و مفیدتان. اگر یک سری عدد داشته باشیم و بخواهیم نمودار مشتق آنها را رسم کنیم چطور باید عمل کنیم؟ زمانی که یک تابع صریح برای مشتق گیری نداریم.
با عرض سلام،
یک راه حل مناسب استفاده از تابع gradient از کتابخانه numpy میباشد. فرض کنید اعداد شما در متغیری با نام samples ذخیره شده است. اگر نمونههایی که در دست دارید با فواصل واحد (بر اساس متغیری که مشتقگیری بر اساس آن انجام میگیرد، مثلا زمان) نمونهبرداری شده باشند تابع بهصورت gradient(samples) فراخوانی میگردد. ولی اگر نمونهبرداری در فواصل غیر واحد و یا کلا غیر یکنواخت انجام شده باشد باید ورودی دومی را نیز هنگام فراخوانی این تابع مقداردهی نمایید که نشان دهنده فواصل نمونهبرداری است. این ورودی میتواند یک اسکالر یا یک آرایه تک بعدی باشد. برای مثال زمانی که فواصل نمونه برداری نیم واحد باشد میتوانید تابع را به این شکل فراخوانی نمایید gradient(samples, 0.5) و زمانی که فواصل نمونهبرداری غیر یکنواخت باشد (فرض کنیم آرایه samples دارای ۶ نمونه است) فراخوانی میتواند برای مثال به صورت gradient(samples, [0.5, 0.7, 0.8, 0.9, 1.3, 1.5]) انجام گیرد. دقت کنید در این حالت آرایه دوم مقادیری هست که نمونهبرداریها در آن انجام گرفته است. مثال زیر به روشنتر شدن نحوه استفاده از این تابع کمک میکند:
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()