برنامه نویسی، ریاضی ۴۱۳ بازدید

بسط تیلور (سری تیلور | Taylor Series) روشی برای تخمین مقدار یک تابع با استفاده از مشتق مرتبه‌های مختلف آن تابع است. در این مقاله، آموزش پیاده‌سازی بسط تیلور در پایتون برای ۳ تابع پرکاربرد ارائه و نمودار حاصل از آن‌ها با نمودارهای واقعی مقایسه و مقدار خطا نیز محاسبه شده است.

بسط تیلور چیست؟

بسط تیلور روش هوشمندانه‌ای برای تخمین زدن هر تابع چند‌جمله‌ای با عبارت‌هایی به تعداد بی‌نهایت است. هر عبارت در چندجمله‌ای از مشتق‌های تابع در یک نقطه واحد برگرفته می‌شود. براساس سری تیلور ، می‌توان تابع $$ f_{(x)} $$ را حول نقطه $$ x = a $$ به صورت زیر تخمین زد:

$$ f_{(x)} = f_{(a)} + \frac{f’_{(a)}}{1!}(x-a)+ \frac{f”_{(a)}}{2!}(x-a)^2 \dots $$

می‌توان با استفاده از $$ \sum $$ آن را به صورت زیر نوشت:

$$ f_{(x)} = \sum_{n=0}^{\infty}{\frac{f^{(n)}_{(a)}}{n!}(x-a)^n} $$

براساس این رابطه، می‌توان برای توابع مختلف، تخمین چندجمله‌ای آن را پیدا کرد. برای مثال، بسط تیلور مربوط به برخی توابع پرکاربرد، حول $$ x = 0 $$ در زیر آورده شده است که به آن‌ها سری مک‌لورن نیز گفته می‌شود:

$$ e^x = \sum_{n=0}^{\infty}{\frac{x^n}{n!}} = 1 + x + \frac{x^2}{2!} \dots  $$

$$ \sin x = \sum_{n=0}^{\infty}{\frac{(-1)^n}{(2n + 1)!}}x^{2n+1} =x – \frac{x^3}{3!} + \frac{x^5}{5!} \dots  $$

$$ \cos x = \sum_{n=0}^{\infty}{\frac{(-1)^n}{(2n)!}}x^{2n} =1 – \frac{x^2}{2!} + \frac{x^4}{4!} \dots  $$

باید توجه داشت که براساس همین روابط می‌توان فرمول اویلر را نیز اثبات کرد. این رابطه به صورت زیر است:

$$ e^{ix} = cosx + i \space sinx $$

بسط تیلور
در این نمودار بسطر تیلور با جملات درجه 1 تا 13 برای تابع سینوسی را مشاهده می‌کنید که با افزایش درجه، عملکرد بهبود می‌یابد.

آموزش پیاده‌سازی بسط تیلور در پایتون

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

فراخوانی کتابخانه‌های مورد نیاز برای پیاده‌سازی بسط تیلور در پایتون

کتابخانه‌های مورد نیاز برای پیاده‌سازی بسط تیلور در پایتون شامل موارد زیرند:

  1. ماژول math برای اعمال و توابع ریاضی کاربرد دارد.
  2. کتابخانه numpy برای کار و عملیات روی آرایه‌ها استفاده می‌شود.
  3. کتابخانه matplotlib برای رسم نمودار به کار می‌رود.

کدهای مربوط به فراخوانی کتابخانه‌ها در ادامه آمده است:

import math as mt
import numpy as np
import matplotlib.pyplot as plt

ایجاد تابعی برای محاسبه $$ e^x $$ جهت پیاده‌سازی بسط تیلور در پایتون

اکنون لازم است تابعی تعریف شود که با دریافت مقدار $$x$$ و تعداد جمله‌ها در ورودی، مقدار $$ e^x $$ را در خروجی بازگرداند. تعریف (اعلان) این تابع در پایتون به صورت زیر انجام می‌شود:

def exponential(x:float, N:int=10):

باید توجه داشت که برای آرگومان ورودی دوم یعنی «N» مقدار پیش‌فرض نیز تعیین شده است تا در صورتی که ورودی دریافت نشد، مقدار آن را به طور پیش‌فرض برابر با 10 قرار داده شود.

اکنون نیاز است متغیری تعریف شود تا مقدار خروجی را در خود ذخیره کند. این متغیر به تعداد «N» بار به‌روز‌رسانی خواهد شد. بنابراین کدهای مربوط به تعریف تابع «exponential» تا این مرحله به صورت زیر هستند:

def exponential(x:float, N:int=10):
    s = 0

اکنون باید یک حلقه تعریف شود تا نقش عملگر «$$ sum $$» را بازی کند. بنابراین تا اینجا تابع مورد نظر به صورت زیر خواهد بود:

def exponential(x:float, N:int=10):
    s = 0
    for n in range(N):

حال می‌توان رابطه مربوط به محاسبه $$ e^x $$ در داخل «$$ sum $$» را که پیش‌تر ارائه شد در داخل حلقه اضافه کرد. این رابطه به صورت $$ \frac{x^n}{n!} $$ است:

def exponential(x:float, N:int=10):
    s = 0
    for n in range(N):
        s += x**n / mt.factorial(n)

به این صورت، پس از N بار به‌روزرسانی مقدار S، مقدار نهایی $$ e^x $$ حاصل خواهد شد و می‌توان آن را در خروجی بازگرداند:

def exponential(x:float, N:int=10):
    s = 0
    for n in range(N):
        s += x**n / mt.factorial(n)
    return s

اکنون تابع محاسبه $$ e^x $$ کامل شده است و می‌توان مقادیر مختلف را به آن ارجاع داد و خروجی را با مقادیر اصلی مقایسه کرد.

آزمایش تابع $$ e^x $$ به وسیله ارجاع دادن مقادیر مختلف به آن و مقایسه خروجی با مقادیر اصلی

برای انجام این مقایسه، 100 نقطه از -2 تا +2 انتخاب می‌شوند و مقدار جواب تابع برای آن‌ها محاسبه می‌شود. بنابراین کدها به صورت زیر خواهند بود:

X = np.linspace(-2, +2, num=100)

Approximation = np.zeros(100)
for i,x in enumerate(X):
    Approximation[i] = exponential(x, 3)

Real = np.exp(X)

به این ترتیب، ابتدا مقادیر مختلف $$ x $$ تعریف می‌شوند؛ سپس مقدار تابع مربوطه تا 3 جمله محاسبه می‌شود. در نهایت نیز مقادیر واقعی محاسبه شده‌اند.

رسم نمودار تابع $$ e^x $$ و مقادیر اصلی در کنار هم برای انجام مقایسه

اکنون بهتر است دو نمودار مربوط به هر یک از مقادیر اصلی و مقادیر تخمینی با بسط تیلور (تابع $$ e^x $$) را روی یک صفحه و در کنار هم رسم کرد تا بتوان مقایسه لازم را انجام داد. کدهای مربوط به رسم نمودار مربوطه در ادامه آمده‌اند:

plt.plot(X, Real, c='r', lw=1.2, ls='-', label='Real')
plt.plot(X, Approximation, c='b', lw=1.2, ls='--', label='Approximation (3)')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

خروجی کدهای فوق به صورت زیر است:

رسم نمودار تابع تخمینی و مقادیر اصلی در کنار هم برای انجام مقایسه

تخمین با 3 جمله، با اینکه در بازه $$ x = – 0.5 $$ تا $$ x = + 0.5 $$ از دقت مناسبی برخوردار است، اما در باقی نقاط دقت خوبی ندارد. با افزایش N از 3 به 10، به نتیجه زیر حاصل خواهد شد:

رسم نمودار تابع تخمینی با تغییر N‌ از ۳ به ۱۰ و مقادیر اصلی در کنار هم برای انجام مقایسه

همان‌طور که مشاهده می‌شود، با افزایش N از 3 به 10، دقت بسیار خوبی به دست می‌آید. برای محاسبه میزان «خطای درصد میانگین مطلق» (Mean Absolute Percentage Error | MAPE)، می‌توان به صورت زیر عمل کرد. پیش از ارائه کدها ابتدا رابطه MAPE به عنوان یادآوری در ادامه آمده است:

$$MAPE(A,B) = 100 \times \sum{| \frac{A_i – B_i}{A_i}|}$$

کدهای مربوط به پیاده‌سازی رابطه فوق برای محاسبه MAPE در پایتون به صورت زیر است:

MAPE = 100 * np.mean( np.abs( np.divide(Real - Approximation, Real) ) )

print(f'{MAPE = } %')

خروجی کدهای فوق به صورت زیر خواهد بود:

MAPE = 0.008044139334499392 %

همان‌طور که ملاحظه می‌شود، این خروجی عدد بسیار کوچکی است. می‌توان برای توابع سینوس و کسینوس نیز بسط تیلور را پیاده‌سازی کرد. این کار در ادامه انجام شده است.

معرفی فیلم های آموزش محاسبات عددی فرادرس

فیلم های آموزش محاسبات عددی فرادرس

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

در زمان انتشار این نوشته، ۱۰ دوره آموزشی مختلف در بسته آموزش محاسبات عددی فرادرس گنجانده شده است که در مجموع بیش از ۷۰ ساعت محتوای آموزش ویدیویی را شامل می‌شوند. در برخی از دوره‌های این مجموعه تنها مباحث نظری مطرح شده‌اند. این در حالی‌ست که در برخی از سایر دوره‌های این مجموعه علاوه بر مفاهیم تئوری، پیاده سازی با یک زبان برنامه نویسی از جمله پایتون هم انجام شده است.

پیاده سازی بسط تیلور در پایتون برای تابع‌های سینوس و کسینوس

در این بخش کدهای مربوط به پیاده‌سازی بسط تیلور در پایتون برای تابع‌های سینوس و کسینوس ارائه شده‌اند. پیاده سازی بسط تیلور در پایتون برای تابع سینوس به صورت زیر است:

def sin(x:float, N:int=10):
    s = 0
    for n in range(N):
        s += (-1)**n * x**(2*n + 1) / mt.factorial(2*n + 1)
    return s

بنابراین، تابع مربوطه تعریف شده است و به درستی کار می‌کند. حالا باید نموداری را مشابه بخش‌های قبل برای مقایسه پیاده‌سازی تیلور با داده‌های واقعی رسم کرد. این نمودار در تصویر زیر نشان داده شده است:

نمودار مقایسه‌ای جهت پیاده سازی بسط تیلور در پایتون برای تابع سینوس

به این صورت، مشاهده می‌شود که با استفاده از 6 جمله، می‌توان بازه بین $$ x = -4 $$ تا $$ x = +4 $$ را به خوبی تخمین زد. به شیوه مشابه این پیاده‌سازی برای تابع کسینوس به صورت زیر است:

def cos(x:float, N:int=10):
    s = 0
    for n in range(N):
        s += (-1)**n * x**(2*n) / mt.factorial(2*n)
    return s

تصویر مقایسه خروجی تابع فوق با مقادیر اصلی در ادامه آمده است:

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

مقدار خطای درصد میانگین مطلق برای تابع کسینوس به صورت زیر است:

MAPE = 2.161881549770154 %

باید توجه داشت که برای محاسبه نسبت‌های مثلثاتی زاویه‌های مختلف، تنها باید مقدار نسبت‌ها را برای زاویه‌های $$ 0$$ تا $$ \frac{\pi}{2}$$ رادیان محاسبه کرد و مقدار این نسبت برای زاویه‌های دیگر می‌تواند با استفاده از روابط خاصی محاسبه شود.

Radian

اکنون در ادامه آموزش پیاده سازی بسط تیلور در پایتون به بهینه‌سازی توابع نوشته شده پرداخته شده است.

بهینه سازی توابع پیاده سازی سری تیلور در پایتون

به دلیل وجود حلقه و محاسبه عبارت‌های توان‌دار و فاکتوریل‌دار در توابع پیاده‌سازی شده در این مقاله، زمان اجرای آن‌ها ممکن است بسیار زیاد باشد. این مشکل می‌تواند با تعریف یک متغیر کمکی رفع شود. در این بخش به بهینه‌سازی توابع پیاده‌سازی سری تیلور در پایتون پرداخته شده است.

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

$$ e^x = \sum_{n=0}^{\infty}{J_{(n)}}= \sum_{n=0}^{\infty}{\frac{x^n}{n!}}= J_{(0)} + J_{(1)} + J_{(2)} \dots = 1+x+ \frac{x^2}{2!} \dots$$

حال می‌توان بین jها رابطه زیر را مطرح کرد:

$$ J_{(n+1)} = \frac{x^{n+1}}{(n+1)!} = \frac{x}{n+1} \times \frac{x^n}{n!} = \frac{x}{n+1} \times J_{(n)} $$

بنابراین، می‌توان به جای محاسبه هر جمله از ابتدا، آن را از روی آخرین جمله ساخت:

def exponential2(x:float, N:int=10):
    s = 0
    j = 1
    for n in range(N):
        s += j
        j *= x/(n+1)
    return s

به این صورت، حجم محاسبات تابع بسیار کاهش پیدا می‌کند؛ به طوری که زمان محاسبه برای 10000 داده از 0.79 ثانیه به 0.59 ثانیه کاهش پیدا می‌کند. حال اگر به جای 10 جمله از 30 جمله استفاده شود، این زمان از 6.00 ثانیه به 1.71 ثانیه کاهش پیدا می‌کند که نشان دهنده کارآمد بودن این نوع پیاده‌سازی در جملات بالاتر است.

معرفی فیلم های آموزش پیاده سازی بسط تیلور در پایتون

در این بخش از مقاله آموزش پیاده سازی بسط تیلور در پایتون تعدادی از دوره‌های آموزشی فرادرس معرفی شده‌اند. این دوره‌های آموزشی بیش‌ترین ارتباط را با مفاهیم مطرح شده در این مقاله دارند.

فیلم آموزش محاسبات عددی در پایتون Python

فیلم آموزش محاسبات عددی در پایتون Python

در فصل چهارم دوره آموزش محاسبات عددی در پایتون فرادرس با عنوان «حل عددی معادلات دیفرانسیل معمولی» به روش بسط تیلور در پایتون پرداخته شده است. طول مدت کل این دوره آموزشی تقریباً سه ساعت و مدرس آن دکتر یاسین بهروزی است. این دوره در کل شامل ۷ فصل می‌شود. از جمله سایر سرفصل‌های این دوره می‌توان به تعیین ریشه در پایتون، درون‌یابی در پایتون، مشتق‌گیری و انتگرال‌گیری عددی در پایتون، حل عددی دستگاه معادلات خطی و سایر موارد اشاره کرد.

فیلم های آموزش پایتون فرادرس

فیلم های آموزش پایتون فرادرس

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

جمع‌بندی

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

اگر این مطلب برای شما مفید بوده است، آموزش‌ها و مطالب زیر نیز به شما پیشنهاد می‌شوند:

بر اساس رای ۹ نفر
آیا این مطلب برای شما مفید بود؟
شما قبلا رای داده‌اید!
اگر بازخوردی درباره این مطلب دارید یا پرسشی دارید که بدون پاسخ مانده است، آن را از طریق بخش نظرات مطرح کنید.

«سید علی کلامی هریس»، دانشجوی سال چهارم داروسازی دانشگاه علوم پزشکی تهران است. او در سال 1397 از دبیرستان «پروفسور حسابی» تبریز فارغ‌التحصیل شد و هم اکنون در کنار تحصیل در حوزه دارو‌سازی، به فعالیت در زمینه برنامه‌نویسی، یادگیری ماشین و تحلیل بازارهای مالی با استفاده از الگوریتم‌های هوشمند می‌پردازد.