فهرست بستن

چند جمله‌ای ها در پایتون با کتابخانه numpy (قسمت اول)

چند جمله‌ای ها کاربرد ویژه‌ای در ریاضیات و مهندسی دارند. بیشتر این کاربرد مربوط به تقریب توابع در آنالیز عددی می باشد. در زبان برنامه نویسی پایتون با استفاده از کتابخانه محاسباتی numpy می توانید چند جمله‌ای ها را ایجاد کرده و از آنها استفاده کنید. این کتابخانه به کاربران این امکان را می دهد که با تعداد جملات مشخص داده ها را با چند جمله ای ها تقریب بزنند.

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

ماژول چند جمله‌ای ها از کتابخانه numpy به دو قسمت تقسیم می شود:

  • Polynomial Package
  • Poly1d

در بسته Polynomial شش کلاس چند جمله‌ای به قرار زیر موجود می باشد:

  • Polynomial: برای چند جمله ای های توانی
  • Chebyshev: برای چند جمله ای های چیبیشف
  • Legendre: برای چند جمله ای های لژاندر
  • Laguerre: چند جمله ای های لاگر
  • Hermite: چند جمله ای های هرمیت
  • HermiteE: چند جمله ای های هرمیت-E

حال با چند مثال نحوه استفاده ابتدائی از چند جمله ای ها را خواهیم دید. طبیعتا اولین مثال نحوه تعریف یک چند جمله می باشد. قطعه کد زیر را در نظر بگیرید:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
print(p)

کد بالا p را چنان تعریف می کند که ما چند جمله ای زیر را داشته باشیم:

p(x) = 1 + 2x + 3x^{2}

هر چند جمله ای دارای سه خصوصیت مهم می باشد که به قرار زیر است:

  • coef
  • window
  • domain

اولی ضرایب چند جمله ای می باشد. با دو تای بعدی هنگامی که از چند جمله ای ها به عنوان تقریب زننده استفاده می کنیم آشنا خواهیم شد.

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
print(p.coef)
print(p.domain)
print(p.window)

ما می توانیم چند جمله ای ها را به هم اضافه یا از هم کم کنیم. قطعه کد زیر را در نظر بگیرید:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
print(p + p)
print(p - p)

همچنین می توانیم آنها را به هم ضرب کرده و به توان عددی صحیح و مثبت برسانیم:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
print(p * p)
print(p ** 3)

خارج قسمت تقسیم چند جمله ای ها بر هم و باقیمانده آن نیز بصورت زیر قابل محاسبه می باشد:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
print(p // Polynomial([-1, 1]))
print(p % Polynomial([-1, 1]))

تقسیم چند جمله ای ها بر هم با خروجی خارج قسمت و باقیمانده نیز به شکل زیر انجام می پذیرد:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
quo, rem = divmod(p, Polynomial([-1, 1]))
print(quo)
print(rem)

برای محاسبه مقدار چند جمله ای به ازای x مشخص نیز به شکل زیر باید عمل نمود:

from numpy.polynomial import Polynomial
from numpy import arange
p = Polynomial([1,2,1])
x = arange(25).reshape(5,5)
print(p(x))

امکان جاگذاری چند جمله ای در چند جمله ای دیگر نیز در این کتابخانه فراهم شده است. مثال زیر را که در آن چند جمله ای p در خودش جاگذاری شده است در نظر بگیرید:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,1])
print(p(p))

ریشه های چند جمله ای توانی با فراخوانی تابع roots از کلاس Polynomial در دسترس خواهد بود. قطعه کد زیر را مشاهده نمایید:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
print(p.roots())

وقتی با چند جمله ای ها کار می کنید لازم نیست حتما تمام داده ها از نوع Polynomial تعریف گردند. در صورتی که بطور صحیح استفاده شوند می توان آن ها را به شکل عدد صحیح، لیست، آرایه یا چند تایی هم بکار برد. مثال زیر را ببینید:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
print(p + [1, 2, 3])
print([1, 2, 3] * p)
print(p / 2)

ذکر این نکته ضروری است که چند جمله ای هایی از نوع مختلف یا چند جمله ای هایی که در خصوصیات domain و window متفاوت می باشند قابلیت عملیات ریاضی مشترک را ندارند. (عملیاتی مثل ضرب و تقسیم و …)

مشتق و انتگرال چند جمله ای با فراخوانی تابع deriv و integ از شی Polynomial قابل محاسبه می باشد:

from numpy.polynomial import Polynomial
p = Polynomial([1,2,3])
print(p.integ())
print(p.deriv())

دفعات انتگرال و مشتق گیری می تواند به عنوان پارامتر ورودی هنگام فراخوانی به این دو تابع داده شود. برای ایجاد چند جمله از روی ریشه ها از دستور fromroots از شی Polynomial استفاده می گردد. این روش پیدا کردن ضرائب چند جمله ای می توان بسیار کاربردی باشد. کد زیر را اجرا نمایید:

from numpy.polynomial import Polynomial
p = Polynomial.fromroots([1, 2, 3])
print(p)

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

from numpy.polynomial import Polynomial, Chebyshev
p = Polynomial.fromroots([1, 2, 3])
print(p.convert(kind=Chebyshev))

با استفاده از این تابع تبدیل domain و window نیز امکان پذیر است. برای مشاهده شکل نمودار چند جمله ای های چیبیشف به صورت زیر می توان عمل نمود:

import matplotlib.pyplot as plt
from numpy.polynomial import Chebyshev
from numpy import linspace
x = linspace(-1, 1, 100)
for i in range(6): ax = plt.plot(x, Chebyshev.basis(i)(x), lw=2, label="$T_%d$"%i)
plt.legend(loc="upper left")
plt.show()

خروجی این کد بصورت شکل زیر خواهد بود:

حال در انتها نحوه تقریب زدن توابع را با هم می بینیم. در این مثال ما تابعی سینوسی را با مقادیر تصادفی در دامنه صفر تا ۲π ایجاد می نماییم. سپس با چند جمله ای های چیبیشف آن را تقریب می زنیم.

import numpy as np
import matplotlib.pyplot as plt
from numpy.polynomial import Chebyshev
np.random.seed(11)
x = np.linspace(0, 2*np.pi, 20)
y = np.sin(x) + np.random.normal(scale=.1, size=x.shape)
p = Chebyshev.fit(x, y, 5)
plt.plot(x, y, 'o')
xx, yy = p.linspace()
plt.plot(xx, yy, lw=2)
plt.show()

که خروجی آن بصورت زیر می باشد:

توضحات بیشتر و آشنایی با امکانات دیگر این کتابخانه را در بخش های بعدی این نوشته دنبال نمایید.