در این مطلب روشها و کدهایمتلبمحاسباتعددی را معرفی میکنیم. محاسباتعددی روشها و ویژگیهای متفاوتی دارند. در این مبحث ضمن معرفی این روشها، کدها و حل دستی برخی از آنها را معرفی میکنیم. اگر شما نیز برای حل مسائل ریاضی، مهندسی یا فیزیکی خود به حل عددی نیازمند هستید خواندن این مطلب را از دست ندهید.
محاسبات عددی در متلب
محاسبات عددی روشی برای حل مسائل پیچیده ریاضی است که فقط با استفاده از عملگرهای ساده ریاضی انجام میشود. این روش شامل فرمولبندی فیزیکی مدلهای ریاضی و موقعیتهایی است که میتوان با عملگرهای ریاضی حل کرد. برای محاسبات عددی نیاز به توسعه، تجزیه و تحلیل و استفاده از الگوریتمها است. این محاسبات شامل تعداد زیادی محاسبات ریاضی هستند و بنابراین به دستگاههای محاسباتی سریع و کارآمد احتیاج دارند. انقلاب میکروالکترونیک و متعاقب آن توسعه رایانههای شخصی ارزان و کم هزینه تأثیر به سزایی در استفاده از روشهای عددی برای حل مشکلات علمی داشته است. روشهای معادلات عددی برای حل حالتهای زیر اتفاق میافتد:
معادلات غیر خطی تک متغیره که حل تحلیلی و بسته ندارند و برای آنها باید از حل عددی استفاده کرد.
روش درونیابی و برازش برای پیدا کردن معادلاتی که دادههایی از آن را داریم.
حل عددی مشتقها و انتگرالهایی که حل تحلیلی و دقیقی ندارند.
حل عددی معادلات دیفرانسیل معمولی یا ODE
حل عددی دستگاه معادلات خطی یا غیرخطی. البته حل تحلیلی دستگاه معادلات خطی غالباً امکانپذیر است اما در حالتی که تعداد متغیرها و معادلات زیاد باشند حل تحلیلی این معادلات زمان زیادی میگیرد و در این حالت بهتر است به حل عددی روی بیاوریم.
حل عددی برای به دست آوردن ویژه مقادیر ماتریسها.
الگوریتم حداقل مربعات که مجموعهای از دادهها را با یک تابع نمایی، هایپربولیک یا … فیت میکند و به این ترتیب اطلاعات بیشتری از یک سیستم به دست میآوریم.
بهینه سازی عددی نیز برای بهینه کردن یک پارامتر در یک سیستم به کار میرود.
نکتهای که در محاسبات عددی مهم است میزان خطا در این محاسبات است که باید آن را نیز مد نظر قرار داد. در این مطلب چند روش محاسبه عددی در متلب را معرفی میکنیم و چند مثال از این روشها را حل میکنیم.
حل عددی دستگاه معادلات خطی
در روش حل عددی دستگاه معادلات خطی میتوان به روشهای تکراری و غیرتکراری در نرم افزار متلب اشاره کرد که به گروههای زیر تقسیمبندی میشوند:
روشهای غیرتکراری
کدهای متلب محاسبات عددی و روش گاوس ناقص
کدهای متلب محاسبات عددی و روش گاوس یا پیووتینگ
کدهای متلب محاسبات عددی و روش تجزیه LU
روشهای تکراری
کدهای متلب محاسبات عددی و روش ژاکوبی
کدهای متلب محاسبات عددی و روش گاوس-سیدال
در دستگاه معادلات خطی برای حل یک دستگاه باید تعداد ضرایب معلوم و مجهول با هم برابر باشند. برای حل این دستگاهها ابتدا آنها را به فرمت ماتریسی در میآوریم. در حقیقت دستگاه معادلات زیر را در نظر بگیرید:
برای حل این دستگاه معادلات خطی همان طور که گفتیم میتوان از روشهای مستقیم و غیرمستقیم استفاده کرد. در روشهای مستقیم پاسخ اعداد ثابتی هستند که این اعداد شامل خطاهای حاصل از گردکردن میباشند و در روشهای غیرمستقیم اصل بر حدسهای پی در پی برای پاسخ به مسئله طرح ریزی شده است. در بین روشهای مستقیم یا غیرتکراری حل عددی دستگاه معادلات خطی میتوان به روشهای زیر اشاره کرد:
کدهای متلب محاسبات عددی و روش معکوس ماتریس ضرایب
کدهای متلب محاسبات عددی و روش کرامر
کدهای متلب محاسبات عددی و روشهای حذفی که شامل روش ساده (ناقص) گاوس و روش گاوس است.
کدهای متلب محاسبات عددی و روش تجزیه
نکته مهم در استفاده از این روشها که در بالا بیان شد غیرصفر بودن دترمینان ماتریس ضرایب یا ماتریس A که در بالا معرفی کردیم است. در اینجا به بررسی روش حذف ساده (ناقص) گاوس میپردازیم.
روش ساده (ناقص) گاوس
یکی از محدودیتهای این روش این است که تنها در صورت غیر صفر بودن قطر اصلی ماتریس ضرایب این روش کاربرد دارد. در این روش باید یک ماتریس افزوده تشکیل دهیم که مجموع ماتریس ضرایب و ماتریس معلومات مسئله است. در ماتریس افزوده یک ستون به ماتریس ضرایب اضافه میشود که همان ماتریس معلومات مسئله است. برای درک این روش یک مثال را با این روش حل میکنیم و سپس آن را در متلب نیز اجرا خواهیم کرد.
فرض کنید چهار مجهول داریم که فرم ماتریسی آن به صورت زیر است:
میخواهیم این دستگاه چهار معادله و چهار مجهول را با روش ساده گاوس حل کنیم. روش کار به این صورت است که اگر $$a_{kk}$$ مخالف صفر باشد آن گاه این روش کاربرد دارد و ضرایب جدیدی تحت عنوان m برای $$k$$اُمین سطر از ماتریس افزوده به صورت زیر تعریف میکنیم:
که به راحتی مقادیر $$x_{3}$$، $$x_{2}$$، $$x_{1}$$ و $$x_{4}$$ قابل محاسبه است. همین روش را در متلب میتوان به صورت زیر نوشت اگر ماتریس ضرایب و مقادیر را مانند مثال بالا به عنوان ورودی بدهیم هر دو حالت جوابهای یکسانی را نشان میدهند.
function ngaussel(A,b)
n=length(b);
x=zeros(n,1);
fprintf('n');
disp('The augmented matrix is')
augm=[A b]
for k=1:n-1 for i=k+1:n m=A(i,k)/A(k,k); for j=k+1:n A(i,j)=A(i,j)-m*A(k,j); end A(i,k)=m; b(i)=b(i)-m*b(k); end
end
x(n)=b(n)/A(n,n);
for i=n-1:-1:1 S=b(i); for j=i+1:n S=S-A(i,j)*x(j); end x(i)=S/A(i,i);
end
%print the result
fprintf('n');
disp('The transformed upper triangular augmented matrix C is')
fprintf('n');
for i=1:n for j=1:n if(j<i)A(i,j)=0;end end
end
C=[A b]
fprintf('n');
disp('Back substitution gives the vector solution')
x
برای اجرای دستور گاوس در متلب کد بالا را در یک اسکریپت با نام تابع یعنی ngaussel ذخیره کنید و در صفحه کار متلب ماتریسهای A و b را تعریف کنید. با فراخوانی تابع این روش برای ماتریس ورودی شما اجرا شده و جواب نمایش داده میشود.
برای آشنایی بیشتر با محاسبات عددی در متلب، میتوانید فیلم آموزش محاسبات عددی با MATLAB را مشاهده کنید که توسط فرادرس ارائه شده، لینک این آموزش در ادامه آورده شده است.
درونیابی و برازش برای پیدا کردن صورت کلی توابعی است که دادههایی از آن را داریم. این دادهها میتوانند از آزمایش یا مشاهده به دست آمده باشند. در حقیقت n زوج داده داریم که به صورت $$(x_{i}, y_{i})$$ هستند و میخواهیم $$y(x)$$ را تخمین بزنیم.
این روش در حل عددی بسیار متداول و رایج است و باید دقت کرد که این درونیابی با عبور از منحنی یا Curve fitting متفاوت است. در حقیقت در روش عبور از منحنی، منحنی که از بیشترین دادهها عبور میکند در نظر گرفته میشود اما در درون یابی باید تابع به دست آمده شامل تمام نقاط و دادهها باشد. انواع روشهای درون یابی و برازش را میتوان به صورت زیر دستهبندی کرد:
کدهای متلب محاسبات عددی و روش لاگرانژ
کدهای متلب محاسبات عددی و روش تفاضلهای تقسیم شونده پیشرونده نیوتن
کدهای متلب محاسبات عددی و اسپلاینهای مرتبه دو و سه
کدهای متلب محاسبات عددی و برازش یا عبور از منحنی
در ادامه این مطلب با حل یک مثال روش لاگرانژ را توضیح میدهیم.
درون یابی به روش لاگرانژ
با حل یک مثال روش لاگرانژ را توضیح میدهیم. در این مثال میخواهیم برای نقاط $${(0,6), (1,0), (2,2)} چند جملهای مناسب را پیدا کنیم. برای به دست آوردن چند جملهای مورد نظر آن را به صورت زیر معرفی میکنیم:
function lagrange(x,y,a)
n=length(x);
p=0;
for k=1:n b(k)=1; d(k)=1; for j=1:n if j~=k b(k)=b(k)*(x(k)-x(j)); d(k)=d(k)*(a-x(j)); end end c(k)=y(k)/b(k); p=p+c(k)*d(k);
end
fprintf('n p(a)=%10.6f',p)
fprintf('n')
با تعریف بردارهای x ،y و مقدار a تابع به روش لاگرانژ محاسبه میشود و مقدار تابع به ازای a در خروجی چاپ میشود.
مشتق و انتگرالگیری عددی
مشتق و انتگرالگیری عددی زمانی مورد استفاده قرار میگیرد که تابع در دسترس نباشد و یا با یک تابع پیچیده رو به رو باشیم. روشهای مشتق گیری عددی شامل موارد زیر هستند:
بسط تیلور
فرمول ریچاردسون
روشهای انتگرال گیری عددی نیز به موارد زیر تقسیم میشوند:
روش نیوتن-کوتز
روش مجموع ریمان
روش قاعده ذوزنقهای
روش سیمپسون
الگوریتم رومبرگ
در ادامه این مطلب روش بسط تیلور را مورد معرفی و بررسی قرار میدهیم.
بسط تیلور
در ابتدا بسط تیلور توابع $$f(x+h)$$ را حول $$h=0$$ بررسی میکنیم و داریم:
بدین ترتیب میتوان فرمولهای تقریبی برای مشتق گیری مرتبه اول را به فرمهای زیر تعریف کرد:
تقریب اختلاف پیشرونده که به صورت زیر تعریف میشود:
$$f^prime(x)approx frac{f(x+h)-f(x)}{h}$$
همچنین تقریب اختلاف پسرو به شکل زیر است:
$$f^prime(x)approx frac{f(x)-f(x-h)}{h}$$
و تقریب اختلاف مرکزی نیز شکل زیر را میگیرد:
$$f^prime(x)approx frac{f(x+h)-f(x-h)}{2h}$$
با محاسبات میتوان دید که با توجه به این که $$h$$ همواره مقداری کوچکتر از یک دارد، خطای محاسباتی در روش مشتق گیری مرکزی از دو روش پیشرو و پسرو کمتر خواهد بود. همچنین مشتق دوم تابع $$f(x)$$ با توجه به روش مشتق گیری مرکزی حول نقطه $$h=0$$ به شکل زیر خواهد بود:
این روش را با یک مثال توضیح داده و آن را در متلب اجرا میکنیم. برای تابع $$f(x)=sin(x)$$ مقدار تخمینی مشتق دوم آن را به ازای مقدار $$x=0.8quad rad$$ و $$h=0.01$$ محاسبه کنید و خطای محاسبات را به دست آورید.
با استفاده از رابطه مشتق دوم از روش بسط تیلور مقدار تخمینی مشتق برابر با $$-0.6967009$$ خواهد شد. این در حالی است که مقدار واقعی از روابط تحلیلی مقداری برابر با $$-0.6967067$$ دارد. به این ترتیب مقدار خطا برابر با $$5.81e-6$$ خواهد بود.
با اجرای این برنامه نمودارها به صورت زیر نمایش داده میشوند:
همچنین میزان ارور یا خطا نیز برابر با $$0.0622$$ در خروجی چاپ میشود.
حل عددی معادلات دیفرانسیل معمولی
در این بخش حل عددی معادلات دیفرانسیل معمولی را بررسی و معرفی میکنیم. به صورت کلی روشهای حل عددی معادلات دیفرانسیل معمولی به صورت زیر معرفی میشوند:
کدهای متلب محاسبات عددی و روش اویلر (بسط تیلور مرتبه اول)
کدهای متلب محاسبات عددی و بسطهای تیلور مرتبههای بالاتر از 1
کدهای متلب محاسبات عددی و روش نقطه میانی
کدهای متلب محاسبات عددی و روش رانگ-کوتای مرتبه 2 و 4
کدهای متلب محاسبات عددی و روش آدامز-باشفورث
کدهای متلب محاسبات عددی و روش آدامز-مولتون
در ادامه روش اویلر را معرفی کرده و با استفاده از یک مثال و بررسی آن به صورت دستی و در متلب این روش را توضیح میدهیم.
روش اویلر
سادهترین شیوه تحلیلی از میان همه روشهای محاسباتی در حل معادلات دیفرانسیل معمولی روش اویلر است. معادلهای مانند زیر را در نظر بگیرید که مقدار اولیه آن برابر با $$y(a)=y_{0}$$ است و در بازه تقریبی $$[a,b]$$ تعریف میشود و داریم:
$$frac{dy}{dt}=f(t,y)$$
برای شروع از روش اویلر ابتدا بازه را به $$N$$ زیر بازه مساوی تقسیم کرده و نقاط شبکهای به صورت $$t_{i}=a+ih$$ به ازای $$i=0,1,2,…,N$$ تعریف میکنیم که $$h$$ یا گام حرکت برابر با $$h=frac{b-a}{N}$$ است. به این ترتیب بسط تیلور تابع $$y(t)$$ را حول $$t_{i}$$ مینویسیم و داریم:
معادله فوق به نام روش اویلر مشهور است. برای درک بیشتر موضوع مثال زیر را حل میکنیم و داریم:
$$y^{prime}=-6y$$
میدانیم که جواب این معادله دیفرانسیل برابر با $$y=exp(-6x)$$ است. بر اساس معادله اویلر داریم:
$$y_{i+1}=y_{i}+h(-6y_{i})$$
با نوشتن این تابع در متلب و برای گامهایی به طول $$0.1$$ و 10 گام و شرط اولیه $$y(1)=1$$ داریم:
h=0.1; % step's size
N=10; % number of steps
y(1)=1;
for n=1:N
y(n+1)= y(n)+h*(-6*y(n));
x(n+1)=n*h;
end
plot(x,y)
با اجرای این مثال نموداری به شکل زیر در خروجی ظاهر میشود:
با تغییر طول گام و تعداد گامها شکل نمودار به حالت منحنی یا curve نزدیکتر میشود و در این حالت خروجی به شکل زیر نمایش داده میشود:
حال اگر حل عددی اویلر را با مشتق مستقیم تابع در همان بازه رسم کنیم و با یکدیگر مقایسه کنیم نتایج به صورت زیر نمایش داده میشوند:
h1=0.01; % step's size
N1=100; % number of steps
y(1)=1;
for n=1:N1
y(n+1)= y(n)+h1*(-6*y(n));
x(n+1)=n*h1;
end
plot(x,y,'r')
hold on
x=0:0.001:1;
y=exp(-6.*x);
plot(x,y,'g'
حل عددی معادلات دیفرانسیل غیرخطی
معادلات دیفرانسیل آهنگ تغییرات یک کمیت را نمایش میدهند. در مطلب حل دستگاه معادلات دیفرانسیل غیر خطی در متلب | گام به گام در مورد حل تحلیلی این معادلات در متلب صحبت کردیم در این بخش از این مبحث حل عددی معادلات دیفرانسیل غیرخطی در متلب را بررسی و معرفی میکنیم.
به صورت کلی معادلات دیفرانسیل ترکیبی از توابع و مشتقات آنها هستند و بسیاری از مسائل فیزیکی و مهندسی را مدلسازی میکنند. این معادلات شامل شرایط اولیه یا شرایط مرزی هستند که با توجه با این شرایط این مسائل و معادلات مورد بررسی قرار میگیرند. انواع روشهای عددی معادلات دیفرانسیل غیر خطی به سه دسته کلی تقسیم میشوند:
روشهای ریشه یابی عددی دامنه محدود یا بسته
روشهای ریشه یابی عددی دامنه نامحدود یا باز
حل عددی دستگاه معادلات غیرخطی به روش نیوتن
روشهای ریشه یابی عددی دامنه محدود یا بسته را به دو روش نصف کردن یا Bisection و روش نابجایی یا موقعیت خطا میتوان انجام داد. همچنین روشهای ریشه یابی عددی دامنه نامحدود یا باز نیز به سه روش سکانت، نیوتون-رافسون و نقطه ثابت صورت میگیرد. در ادامه این بخش روش نصف کردن یا Bisection را معرفی میکنیم و آن را با حل یک مثال و بررسی آن در متلب توضیح خواهیم داد.
روش نصف کردن یا Bisection
روش نصف کردن برای هر تابع پیوستهای مورد استفاده قرار میگیرد. برای استفاده از این روش باید تابع را در بازهای در نظر بگیریم که ضرب مقادیر تابع در آن بازه کوچکتر از صفر و مشتق تابع مخالف صفر باشد. بدین ترتیب بازه تابع را نصف کرده و مقدار تابع را در آن نقطه به دست میآوریم و با توجه به شرایط آن را جایگزین مقدار اولیه یا نهایی بازه میکنیم یعنی داریم:
این کار را تا جایی ادامه میدهیم تا مقدار $$f(c)$$ به صفر نزدیک شود. این روش را برای پیدا کردن ریشه تابع $$x^2-3$$ در بازه $$[1,2]$$ استفاده میکنیم. بدین ترتیب داریم:
function c = bisectionMethod(f,a,b,error)%f=@(x)x^2-3; a=1; b=2; (ensure change of sign between a and b) error=1e-4
c=(a+b)/2;
while abs(f(c))>error
if f(c)<0&&f(a)<0
a=c;
else
b=c;
end
c=(a+b)/2;
end
با تعریف تابع و بازه آن و دقت نزدیک بودن جواب به صفر و اجرای این کد ریشه این تابع در خروجی نمایش داده میشود.
معرفی فیلم آموزش محاسبات عددی با MATLAB
مجموعه فرادرس در تولید و تهیه محتوای آموزشی خود اقدام به تهیه فیلم آآموزش محاسبات عددی با MATLAB کرده است. این مجموعه آموزشی از شش درس تشکیل شده و برای دانشجویان رشته علوم پایه و فنی مهندسی مفید است. پیشنیاز این درس آموزش برنامه نویسی متلب (MATLAB) است.
درس اول این مجموعه به خطاها و اشتباهات در محاسبات عددی اختصاص دارد. درس دوم شامل حل دستگاههای معادلات خطی به روش محاسبات عددی در متلب است. درس سوم به درونیابی و برازش در متلب میپردازد و درس چهارم به مشتق گیری و انتگرال گیری عددی در متلب اختصاص دارد. در درس پنجم در مورد حل عددی معادلات دیفرانسیل معمولی در متلب خواهید آموخت. در نهایت در درس ششم ریشه یابی عددی معادلات غیرخطی در متلب به روش عددی آموزش داده میشود.
برای دیدن فیلم آموزش محاسبات عددی با MATLAB + اینجا کلیک کنید.
جمع بندی
این مطلب به محاسبات عددی در متلب اختصاص داده شده است. در حقیقت روشها و کدهای متلب محاسبات عددی بسیار گسترده هستند و روشهای متفاوتی برای آنها وجود دارد. در این مطلب این روشها را به صورت فهرست وار معرفی کردیم و از هر کاربرد آن یک نمونه را با مثال و بررسی مثال در متلب توضیح دادیم.
اگر این مطلب برای شما مفید بوده است، آموزشها و مطالب زیر نیز به شما پیشنهاد میشوند: