مشتق در متلب — راهنمای کاربردی
در آموزشهای پیشین مجله فرادرس، با مفهوم مشتق و روشهای مختلف مشتقگیری آشنا شدیم. در این آموزش با روش محاسبه مشتق در متلب آشنا میشویم.
مشتق در متلب
همانطور که میدانیم، متلب یک زبان برنامهنویسی عددی است. البته میتوان از «جعبهابزار ریاضیات نمادین» (Symbolic Math Toolbox) آن برای محاسبه نمادین مشتق نیز استفاده کرد. در کل، میتوان گفت که رایجترین توابع محاسبه مشتق در متلب این دو مورد هستند:
- ()diff
- ()polyder
در ادامه، از طریق چند مثال با این روش استفاده از این دستورها آشنا میشویم.
مثال اول محاسبه مشتق در متلب
برای مثال، میخواهیم با استفاده از دستور ()diff مشتق توابع زیر را محاسبه کنیم:
$$ \large f = \cos ( 8 x ) , \;\; g = e ^ x \sin ( 5 x ) ,\;\; h = \frac {2 x ^2 + 1 } { 3 x } . $$
بدین منظور از دستور syms استفاده کرده و ابتدا توابع را تعریف میکنیم. سپس، برای محاسبه مشتق از دستور diff استفاده میکنیم و برنامه زیر را مینویسیم:
1syms x
2f = cos(8*x)
3g = sin(5*x)*exp(x)
4h =(2*x^2+1)/(3*x)
5diff(f)
6diff(g)
7diff(h)
با اجرای این برنامه در متلب، جواب زیر را خواهیم داشت:
f = cos(8*x) g = sin(5*x)*exp(x) h = (2*x^2 + 1)/(3*x) ans = -8*sin(8*x) ans = 5*cos(5*x)*exp(x) + sin(5*x)*exp(x) ans = 4/3 - (2*x^2 + 1)/(3*x^2)
همانگونه که میبینیم، نتایج مطابق مطابق انتظار و به صورت زیر هستند:
$$ \large \begin {align*}
f' & = - 8 \sin ( 8 x ) \\
g' & = 5 e ^ x \cos ( 5 x ) + e ^ x \sin ( 5 x ) \\
h' & = \frac 43 + \frac { 2 x ^ 2 + 1 } { 3 x ^ 2 }
\end {align*} $$
مثال دوم محاسبه مشتق در متلب
همانطور که میدانیم، مشتق یک عدد ثابت صفر است، اما گاهی پیش میآید که به دلایلی بخواهیم مشتق یک عدد را با استفاده از متلب محاسبه کنیم، بدین منظور، باید کد زیر را بنویسیم (مثلاً برای عدد ۵):
1constant = sym('5');
2diff(constant)
که با اجرای آن، نتیجه به صورت زیر خواهد بود:
ans = 0
مشتق دوم در متلب
برای محاسبه مشتق مرتبه دوم تابع $$ f $$ در متلب، از دستور "(diff(f,2" استفاده میکنیم. البته میتوانیم دو بار از "diff" نیز به صورت "((diff(diff(f" استفاده کنیم. دو دستور نتیجه یکسانی خواهند داشت.
برای مثال، مشتق دوم تابع $$g= e ^ x \cos x $$ به صورت زیر محاسبه میشود:
1g = exp(x)*cos(x);
2diff(g,2)
یا
1g = exp(x)*cos(x);
2diff(diff(g))
که در هر دو صورت، پاسخ به شکل زیر خواهد بود:
ans = -2*exp(x)*sin(x)
مشتق جزئی در متلب
برای محاسبه مشتق جزئی یک عبارت با بیش از یک متغیر در متلب، باید متغیری را که میخواهیم نسبت به آن مشتق بگیریم، مشخص کنیم. برای محاسبه مشتق جزئی نیز از تابع "diff" در متلب استفاده میکنیم.
برای مثال، فرض کنید میخواهیم مشتق تابع $$ f = \cos ( x , y ) $$ را نسبت به متغیر $$ x $$ (یعنی $$\frac {\partial f } {\partial x } $$) محاسبه کنیم. بدین منظور، کد زیر را مینویسیم:
1syms x y
2f = sin(x*y)
3diff(f,x)
با اجرای این برنامه، جواب زیر را خواهیم داشت:
f = sin(x*y) ans = y*cos(x*y)
مشتق ماتریس در متلب
برای مشتقگیری از ماتریس نیز به راحتی میتوانیم از دستور "diff" استفاده کنیم. برای مثال، فرض کنید ماتریس زیر را داریم:
$$ \large A = \begin {bmatrix}
\cos (4 x) & 3 x \\
x & \sin ( 5 x )
\end {bmatrix} $$
برای محاسبه مشتق درایههای این ماتریس نسبت به متغیر $$ x $$، کد زیر را در متلب مینویسیم:
1syms x
2A = [cos(4*x) 3*x ; x sin(5*x)]
3diff(A)
که جواب آن به شکل زیر است:
A = [ cos(4*x), 3*x] [ x, sin(5*x)] ans = [ -4*sin(4*x), 3] [ 1, 5*cos(5*x)]
مشتق چندجملهای در متلب
یک چندجملهای را میتوان به صورت زیر نوشت:
$$ \large y ( x ) = a _ 0 x ^ n + a _ 1 x ^ { n - 1 } + \cdots + a _ { n - 1 } x + a _ n $$
در این حالت، میتوانیم از دستور ()polyder استفاده کنیم.
برای مثال، فرض کنید میخواهیم مشتق تابع زیر را به دست آوریم:
$$ \large f ( x ) = x ^ 3 + 2 x ^ 2 - x + 3 $$
بدین منظور، از دستورات زیر استفاده میکنیم:
1p = [1 2 -1 3];
2polyder(p)
که جواب آن به صورت زیر خواهد بود:
ans = 3 4 -1
و این یعنی، مشتق برابر است با:
$$ \large f' (x ) = 3 x^ 2 + 4 x - 1 $$
البته دقت کنید که میتوانستیم از دستور diff نیز برای محاسبه مشتق این چندجملهای استفاده کنیم.
مشتق عددی در متلب
همانطور که میدانیم، مشتق تابع $$ f ( x )$$ به صورت زیر تعریف میشود:
$$ \large f' ( x ) = \frac { d f ( x ) } { d x } = \lim _{\Delta x \to 0 } \frac { f ( x + \Delta x ) - f ( x ) } { ( x + \Delta x ) - x } $$
الگوریتمهای عددی برای محاسبه مشتق یک تابع لازم است شیب تابع را برای محدوده مشخصی از مقادیر $$ x $$ تخمین بزنند. برای محاسبه مشتق عددی سه روش رایج به نامهای «تفاضل پسرو» (Backward Difference)، «تفاضل پیشرو» (Forward Difference) و «تفاضل مرکزی» (Central Difference) وجود دارد.
فرمول تفاضل رو به عقب:
فرمول تفاضل رو به جلو:
فرمول تفاضل مرکزی:
برای تخمین مشتق دوم به سادگی دو بار از یکی از الگوریتمهای بالا استفاده میکنیم. برای مثال، مشتق دوم با استفاده از روش تفاضل رو به عقب به صورت زیر خواهد بود:
$$ \large f^ {\prime \prime} (x_k) \approx \frac { f' ( x _ { k }) - f' ( x _ {k-1})} { x _ {k} - x _ { k -1} } $$
برای آشنایی کامل با مشتقگیری عددی در متلب، پیشنهاد میکنیم به مطلب «مشتق گیری عددی — به زبان ساده (+ دانلود فیلم آموزش گام به گام)» مراجعه کنید.
برای محاسبه مشتق عددی به صورت سادهتر میتوانیم از تابع (diff(x در متلب استفاده کنیم که تفاوت بین مقادیر مجاور بردار x را محاسبه میکند. بردار (ماتریس) خروجی حاصل از تابع (diff(x یک درایه (ردیف) کمتر از x دارد.
اگر نمونههای $$ f ( x ) $$ در y وجود داشته باشند، مشتق را میتوان به صورت زیر تخمین زد:
1deriv_y = diff(y)./diff(x);
مقادیر متناظر $$ x $$ از بردار x اصلی با اصلاح مقدار اولیه یا نهایی به دست میآیند. به عبارت بهتر، اصلاح مقدار نهایی در نتیجه تخمین تفاضل رو به جلو است و اصلاح مقدار اولیه در نتیجه تخمین تفاضل رو به عقب است.
برای مثال، میخواهیم مشتق تابع زیر را در متلب رسم کنیم:
$$ \large f (x ) = 5 \cos ( 10 x ) + x ^ 3 - 2 x ^ 2 - 6 x + 10 $$
بدین منظور، کد زیر را مینویسیم:
1x = 0:.01:4;
2y = 5*cos(10*x) + x.^3 - 2*x.^2 - 6*x +10;
3plot(x,y)
4deriv_y = diff(y)./diff(x);
5xd = x(2:length(x)-1);
6figure
7xd = x(2:length(x)); % Backward difference x values
8plot(xd,deriv_y)
اگر برنامه بالا را اجرا کنیم، به دو شکل زیر خواهیم رسید.
اگر به صورت دستی از عبارت بالا مشتق بگیریم، خواهیم داشت:
$$ \large f' (x ) = - 50 \sin ( 10 x ) + 3 x ^ 2 - 4 x - 6 $$
در برنامه فوق از روش تفاضل رو به عقب استفاده کردهایم.
سلام
چطور میتوانیم به عنوان مثال از تابع f(x)=x^2 که x تابع زمان هست نسبت به زمان مشتق بگیریم؟