|
محاسبات عددی با استفاده از متلب |
|
فهرست :
مقدمهای بر محاسبات سمبولیک در متلب: مشتق حد انتگرال سری حل معادلات دیفرانسیل محاسبات عددی با استفاده از متلب: درون یابی یک بعدی درون یابی دو بعدی انتگرال گیری عددی
انتگرال گیری یگانه انتگرال گیری دوگانه انتگرال گیری سه گانه حل عددی معادلات دیفرانسیل معمولی
|
مشتق ، حد ، انتگرال و حل معادلات دیفرانسیل
محاسبه مشتق :
فرم کلی دستور به این صورت است:
>> syms x
>> f = تابع مورد نظر
>> diff ( f , متغیر مشتق,مرتبه ی مشتق)
نکته :syms از واژه ی symbol به معنای نمادین گرفته شده است و در خط اول ، این
دستور یک متغیر نمادین تعریف می کند.( و نه متغیر عادی )
مثال :1
>> syms x
>> f = sin (x )
>>diff ( f , x , 1 )
ans =
cos ( x )
مثال 2 :
>> syms x
>> f = x * exp ( x )
>> diff ( f , x , 5 )
ans =
5*exp ( x ) + x * exp ( x )
مثال 3 :
>> syms x
>> f =
>> diff ( f , x , 2 )
ans =
-1-cos ( x ) ^ 2 / sin ( x ) ^ 2
محاسبه حد :
>> syms x
>> f = تابع مورد نظر
>> limit ( f , x , a ) =
مثال 1 :
>> syms x
>> f = ( 1 + 1 / x ) ^ x
>> limit ( f , x , inf )
ans =
exp ( 1 )
مثال 2 :
>> syms x
>> f = ( 2 * x ^ 2 + 1 ) / ( x ^ 2 – 1 )
>> limit ( f , x , inf )
ans = 2
محاسبه انتگرال:
>> syms x
>> f = تابع مورد نظر
>> int ( f , x ) =
■ برای محاسبه انتگرال معین از دستور زیر استفاده می کنیم:
int ( f , x , a , b ) =
مثال 1:
>> syms x
>> f = sin ( x ) * x
>> int ( f , x )
ans =
sin ( x ) – x * cos ( x )
مثال 2:
>> syms x
>> f = exp ( x ) * ( sin ( x ) + cos ( x ) )
>> int ( f , x )
ans =
-exp ( -x ) * cos ( x )
مثال 3 :
>> syms x
>> f = sin ( sqrt ( x ) ) ;
>> int ( f , x , -2 * pi , 2 * pi )
ans = ? !
نکته: تبدیل پر کاربرد فوریه : که به زبان ساده به معنی استخراج مولفه های سینوسی از یک سیگنال می باشد ، از همین خاصیت کلیدی استفاده میکند.
■ برای محاسبه مجموع دنباله از دستور روبرو استفاده می کنیم :
symsum ( f , n , a , b )
■ برای محاسبه سری تیلور از دستور روبرو استفاده می کنیم :
taylor ( f , b , a )
یاد آوری : سری تیلور بسط هر تابع را حول نقطه a بدست می دهد :
نکته : در دستور بالا اگر a را بکار نبریم سری مک لوران محاسبه می شود.
نکته : با اجرای دستور taylortool یک محیط گرافیکی برای محاسبه سری
تیلور فراخوانی می شود.
حل معادلات دیفرانسیل:
dsolve ( ' Dامn y = تابع بر حسب متغیر ها ' , ' شرایط اولیه ' )
مثال 1: حل معادله دیفرانسیل با شرایط اولیه ی :
>> dsolve ( ' Dy = 1 + y ^ 2 ' , ' y ( 0 ) = 1 ' )
ans=
tan ( t + 1 / 4 * pi )
مثال 2: حل معادله دیفرانسیل با شرایط اولیه ی و :
>> dsolve ( ' D 2 y = cos ( 2 * x ) – y ' , ' y ( 0 ) = 1 ' , ' D y ( 0 ) = 0 ' , ' x ' )
ans =
( 1 / 2 * sin ( x ) + 1 / 6 * sin ( 3 * x ) ) * sin ( x ) + ( 1 / 6 * cos ( 3 * x ) – 1 / 2
* cos ( x ) ) * cos ( x ) + 4 / 3 * cos ( x )
>> simplify ( ans )
ans =
-2 / 3 * cos ( x ) ^ 2 + 4 / 3 * cos ( x ) + 1 / 3
نکته : چون مشتق بر حسب x است آن را به عنوان آخرین آرگومان در نظر می گیریم.
نکته : دستور simplify برای ساده کردن عبارت حاصل به کر می رود.
مثال 3: حل معادله دیفرانسیل با شایط اولیه ی ، و :
>> dsolve ( ' d 3 y = y ' , ' y(0) ' , ' D y(0) = -1 ' , ' D 2 y(0) = pi ' )
ans =
(-1 / 3 + 1 / 3 * pi ) * exp ( t ) – 1 / 3 * ( 1 + pi ) * 3 ^ ( 1 / 2 ) * exp ( -1 / 2 * t )
* sin ( 1 / 2 * 3 ^ (1 / 2 ) * t ) + ( 1 / 3 – 1 / 3 * pi ) * exp ( - 1 / 2 * t ) * cos ( 1 / 2 * 3
^ ( 1 / 2 * 3 ^ ( 1 / 2 ) * t )
Interpolation :
درون یابی یک بعدی :
یک سری از نقاط که تابع آنها را بر حسب هم نداریم،با درون یابی میخواهیم تابع آنها را بیابیم.
Interp1 : دستوری است که درون یابی یک بعدی انجام میدهد.که به صورت زیر تعریف میشود.
(yi=interp1(x,y,xi,'method'
yi : مقدار درون یابی شده
: xمتغییر مستقل
:yمتقییر وابسته
xi: مقداری که میخواهیم در آن درون یابی انجام شود
method : روش های درون یابی که به سه دسته تقسیم می شوند:
1-linear : به صورت خطی درونیابی می کند.
2-spiline : به صورت یک چند جمله ای درجه 3 درون یابی می کند.
3-nearest :با توجه به اینکه نقطه مورد نظر به کدام قسمت نزدیک تر است درون یابی می کند.
t(دما) |
h(ساعت) |
20 21 21.7 22.3 24 |
8 9 10 11 12 |
مثال:دمای ساعتهای مشخصی را داریم و می خواهیم دما را در ساعتی دلخواه (که در جدول نیست) بدست بیاوریم.
دما در ساعت 9.11 چیست؟
حل:
>>h=8:12
>>t=[20 21 21.7 22.3 24];
>>ti=interp1(h,t,9.11)
>>ti=21.071
نکته:وقتی هیچ روشی را ذکر نمی کنیم،درون یابی بصورت خطی انجام میشود.
>>ti=interp1(h,t,9.5,'nearest')
>>ti=21
>>ti=interp1(h,t,9.5,'spiline')
>>ti=21.093
درون یابی دو بعدی :
متلب با ترکیب دو درون یابی یک بعدی ، درون یابی دو بعدی برای ما انجام می دهد.
Interp2 : دستوری است که برای ما درون یابی دو بعدی انجام میدهد.
zi=interp2(x,y,z,xi,yi,'method')
zi : مقدار درون یابی شده
: xمتغییر مستقل
:yمتغییر مستقل
z : متغییر وابسته
xi: مقداری که میخواهیم در آن درون یابی انجام شود
yi : مقداری که میخواهیم در آن درون یابی انجام شود
method : روش های درون یابی که به سه دسته تقسیم می شوند:
1-linear : به صورت خطی درونیابی می کند.
2-spiline : به صورت یک چند جمله ای درجه 3 درون یابی می کند.
3-nearest :با توجه به اینکه نقطه مورد نظر به کدام قسمت نزدیک تر است درون یابی می کند.
مثال: با توجه به جدول زیر مقدار z را در x=1.8 و y=0.66 بدست آورید.
0.9 |
0.6 |
0.1 |
y x |
3 4.2 6 |
2.8 3.7 5.1 |
2 3.1 4.5 |
1 2 3 |
>>x=[1 2 3];
>>y=[0.1 0.6 0.9];
>>z=[ 2 2.8 3 ; 3.1 3.7 4.2 ; 4.5 5.1 6];
>> zi=interp2(x,y,z,1.8,0.66)
>>zi=3.86
>> zi=interp2(x,y,z,1.8,0.66,'spiline')
>>zi=??
>> zi=interp2(x,y,z,1.8,0.66,'nearest')
>>zi=??
انتگرال گیری عددی:
متلب دو روش برای انتگرال گیری عددی دارد:
1-Recursive adaptive simpson
2-recursive adaptive lobtto
انتگرال گیری یگانه :
روش اول : Recursive adaptive simpson
I=quad(function name,a,b)
Function name : اسم تابع مورد نظر
a,b : حد پایین و حد بالا
نکته:هرگاه بخواهیم یک سری اعمال روی تابع انجام دهیم باید تابع را بصورت m فایل تعریف کنیم.
مثال:
حالا در محیط editor L, را تعریف می کنیم.
Editor: |
function g=prog1(x) y=sqrt((cos(x).^2+(sin(2.*x)).^2+x); |
حال در محیط command window داریم:
>>L=quad(@prog1,0,2*pi)
>>L=?
نکته:در محاسبات عددی هرگاه خواستیم به متلب بگوئیم با یک تابع سروکار داریم از @ استفاده می کنیم.
روش دوم : recursive adaptive lobtto
I=quadl(function name ,a ,b , tolerance)
Function name : نام تابع مورد نظر
a,b : حد پایین و حد بالا
tolerance : دقت مورد نظر
همان طور می بینیم تفاوت این روش با روش قبل ، تنها در دقت محاسبه است.
نکته:اگر tolerance وارد نکنیم،متلب به صورت پیش فرض دقت را 10^(-6) در نظر می گیرد.
>>L=quadl(@prog1,0,2*pi,10^(-8))
L=?
انتگرال گیری دوگانه:
با دستور زیر می توان انتگرال دوگانه را محاسبه کرد.
dblquad(function name,xl,xu,yl,yu,tolerance)
Function name : نام تابع مورد نظر
xl,xu,yl,yu: حد پایین و حد بالا
tolerance : دقت مورد نظر
مثال : انتگرال زیر را حساب کنید.
Editor: |
ابتدا تابع را در محیط editor تعریف می کنیم.
function z=prog2(x,y) z=(cos(x*.y)+x*.sin(y) ; |
نکته:همانطور که میبینید در تابعprog2 ،آرگومان ورودی اول x و آرگومان ورودی دوم y است.پس در دستور dblquad ابتدا حد بالا و پائین x، و بعد حد بالا و پائین y را می نویسیم.
حال در محیط command window مقدار انتگرال را محاسبه می کنیم.
>>g=dblquad(@prog2,-pi,3*pi,0,pi)
>>g=?
انتگرال گیری سه گانه :
با دستور زیر می توان انتگرال سه گانه را محاسبه کرد.
triplquad(function name,xl,xu,yl,yu,zl,zu,tolerance)
Function name : نام تابع مورد نظر
xl,xu,yl,yu,zl,zu: حد پایین و حد بالا
tolerance : دقت مورد نظر
مثال:انتگرال زیر را حساب کنید.
ابتدا تابع را در محیط editor تعریف می کنیم.
function s=prog3(x,y,z) s=(exp(x).*z.*siny+x.*y.*z); |
Editor: |
حال در محیط command window داریم:
>>s=tripquad(@prog3,0,1,-1,2,0,1)
>>s=?
Ordinary Differentional Equation:
حل عددی معادلات دیفرانسیل معمولی:
ما در اینجا روش حل عددی معادلات دیفرانسل معمولی مقدار اولیه (initial value problem) را ذکر می کنیم.
فرم معادلاتی که متلب حل می کند به صورت زیر است:
برای حل این نوع معادله دیفرانسیل باید با تغییر متغییر معادله مرتبه n را به n معادله مرتبه یک تبدیل کنیم.
فرم کلی دستور :
[X Y]=SOLVER(function name,span,initial value)
: function nameنام تابعی که در محیط editor تعریف کرده ایم.
Span : بازه ای که می خواهیم در آن معادله دیفرانسیل را حل کنیم.
initial value :مقادی اولیه معادله دیفرانسیل.
SOLVER : روش های حلی است که ما می توانیم با آن معادله دیفرانسیل را حل کنیم که به دو دسته تقسیم می شوند.1-روش های single step 2-روشهای multi step
1-روش های single step : در این روش با استفاده از اطلاعات یک نقطه قبلی معادله حل می شود.
این روش به دو دسته تقسیم می شود:
· ode23 : که با تقریب دوم رانگه کوتا حساب می کند.
· ode45 : که با تقریب چهارم رانگه کوتا حساب می کند.
2-روش های Multi step : در این روش برای حل از اطلاعات چند نقطهی قبل استفاده میشود.
که به سه دسته زیر تقسیم می شود:
· ode113 : به روش adams-bushfroth حساب می کند.
· ode15s : به روش numerical dever حساب می کند.
· : ode23s به روش rosenbrook حساب میکند.
مثال:معادله زیر را به روش تقریب چهارم رونگه کوتا محاسبه کنید.
حل:
ابتدا معادله مرتبه 3 بالا را به سه معادله مرتبه 1 با توجه به تغییر متغییر گفته شده در قبل به سه معادلهی مرتبه 1 تبدیل میکنیم،که خواهیم داشت.
حال در محیط editor تابع زیر را تعریف می کنیم.
|
Editor |
Function dy=odefun(x,y) dy=[y(2);y(3);3*y(1)*y(3)-y(2)*sin(x)]; |
|
نکته:در تعریف آرگومان ورودی تابع (odefun) حتما اول متغییر مستقل(x) باید وارد شود و بعد متغییر وابسته(y) را وارد کنیم.
نکته:در تعریف آرگومان خروجی تابع (odefun) یک ماتریس ستونی که سطر ها به ترتیب معادلات می باشند ایجاد می کنیم.
>>[X Y]=ode45(@odefun,[0 1],[0;-1;1]);
>>X=
>>Y=
نکته :
: X بازه مورد نظر است که متلب آنرا بطور خودکار به صورت یک ماتریس ستونی تقسیم بندی میکند.
Y : یک ماتریس است که سه ستون دارد،ستون اول جواب معادله دیفرانسیل)، ستون دوم ، ستون سوم می باشد.
همانطور که میدانیم ستون اول Y جواب معادله دیفرانسیل می باشد.
نظرات شما عزیزان: