برازش منحنی در متلب – هر رابطهای را که میخواهید برازش دهید.
در ادامه مباحث درون یابی و بحث برازش منحنی در این مطلب قصد داریم با انواع روشهای برازش منحنی در متلب یا همان Curve Fitting در متلب به طور کامل آشنا شویم.
همانطور که میدانید در بسیاری از مواقع دادههای را خواهیم داشت و میخواهیم یک رابطه که میتواند هر تابعی باشد را به آن برازش دهیم .
در این مطلب قصد داریم به شما روشها و دستوراتی را آموزش دهیم تا بتوانید که هر برازش منحنی در متلب را انجام دهید.
تفاوتی که بین بحث درون یابی و برازش منحنی در متلب وجود دارد این است که در درون یابی در متلب معمولا بین هر دو نقطه یک رابطه و یا یک تابع مشخص برازش میدهند تا بتوانند نقاط بین هر دو نقطه را با آن رابطه موردنظر درون یابی کنند اما در بحث برازش منحنی در متلب یا همان Curve Fitting در متلب برای همهی نقاط موجود یک رابطه fit میشود و خوب قطعا در این مورد خطاهایی بین مقدار پیشبینی شده و مقدار هدف وجود خواهد داشت.
اگر میخواهید متلب را بصورت پایهای و اصولی یاد بگیرید، به شما توصیه میکنیم به صفحه آموزش « برنامه نویسی متلب » مراجعه نموده و از دیگر آموزشهای متلب گام98 استفاده نمایید.
برازش منحنی در متلب با توابع چندجملهای – دستور polyfit در متلب
اولین دستوری که میخواهیم برای بحث برازش منحنی در متلب معرفی نماییم، دستور polyfit در متلب میباشد که برای تخمین توابع یا همان Curve Fitting در متلب برای توابع چندجملهای مورد استفاده قرار میگیرد.
برای استفاده از این دستور در ورودی اول مقدار متغیر مستقل (x)، در ورودی دوم مقدار متغیر وابسته (y) و همچنین در ورودی سوم درجه چندجملهای که میخواهیم به نقاط fit کنیم را مشخص میکنیم.
به عنوان مثال عدد 1 یعنی یک خط به نقاط برازش میدهیم.
به عنوان مثال اول یک نمونه مثال از راهنمای نرمافزار متلب آوردهایم که میخواهیم بر روی دادههای تعریف شده یک رابطه خطی برازش نماییم:
1 2 3 4 5 6 7 8 9 10 11 |
x = 1:50; y = -0.3*x + 2*randn(1,50); p = polyfit(x,y,1); f = polyval(p,x); plot(x,y,'rd') hold on; plot(x,f,'-cy','LineWidth',2) legend('Target','linear fit') R=corr(y',f'); title([' R = ' num2str(R)], ,'fontsi',20,'interpreter','latex') |
همانطور که در مثال بالا مشاهده میکنید برای دادههای موجود یک رابطه خطی برازش کردهایم و سپس آنها را ترسیم نمودهایم. همچنین ضریب R که نشان دهنده میزان تطابق دادهها و رابطه برازش شده میباشد با استفاده از دستور corr محاسبه شده است.
خروجی دستور polyfit در متلب در واقع همان ضرایب چندجملهای رابطه برازش شده میباشد که در حالت fitting خطی دو خروجی شیب و عرض از مبدا خواهد داشت که برای محاسبه مقادیر متناظر با x با این رابطه از دستور polyval استفاده شده است.
حل یک مثال کاربردی از دستور polyfit در متلب
در ادامه مبحث برازش محنی در متلب میخواهیم مثالی کاربردی از دستور polyfit در متلب ارائه نماییم.
فرض کنید دادههایی از پروفیل سرعت در عمق در دو حالت کم رسوب (uc) و پررسوب (us) از جریان سیال داریم و میخواهیم با استفاده از دستور polyfit یک رابطه خطی به آنها برازش دهیم.
لازم به ذکر است که پروفیل سرعت در عمق تقریبا به صورت لگاریتمی میباشد به همین دلیل ورودی ما به دستور مقادیر (ln(z خواهد بود که بتوانیم عملا با لگاریتمی کردن محور افقی یک رابطه خطی از پروفیل سرعت داشته باشیم. کد این دستور و نمودار مربوطه آن به صورت زیر میباشد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
z=[0.6 1.2 1.8 2.4 3 4.6 6.9 9.1 12.2 13.7 15.2 16.2]'; uc=[70.9 77.3 82.3 84.9 88.4 92.7 98.1... 102.6 105.4 105.3 104.8 103.9]'; us=[57.6 64.9 74.3 79.8 83.8 91.6 97.6... 104.7 107.0 107.0 105.7 104.8]'; zz=(0.1:0.1:17); p1=polyfit(log(z),uc,1); uuc=polyval(p1,log(zz)); p2=polyfit(log(z),us,1); uus=polyval(p2,log(zz)); % Draw diagrams subplot(2,1,1) semilogx(z,uc,'d','MarkerSize',10,'MarkerFaceColor','m') hold on; semilogx(zz,uuc,'LineWidth',3) xlabel('z','fontsi',20,'interpreter','latex') ylabel('u_clear','fontsi',20,'interpreter','latex') subplot(2,1,2) semilogx(z,us,'d','MarkerSize',10,'MarkerFaceColor','m') hold on; semilogx(zz,uus,'LineWidth',3) xlabel('z','fontsi',20,'interpreter','latex') ylabel('u_sediment','fontsi',20,'interpreter','latex') |
نکته مهم : لازم به ذکر است که دستور polyfit در متلب در حالت کلی دارای سه خروجی میباشد که خروجی اول با توجه به نکات قبلی همان ضرایب چندجملهای میباشد؛ خروجی دوم یک ساختار میباشد که مقدار خطا را تخمین میزند و همچنین خروجی سوم برای نرمال کردن مقادیر x به کار میرود که در واقع مقدار میانگین و انحراف معیار دادههای متغیر مستقل را نشان میدهد.
برازش منحنی در متلب – دستور cftool در متلب
در ادامه مبحث curve fitting در متلب اگر بخواهیم برازش منحنی در متلب را بدون کد نویسی انجام دهیم از دستور cftool که مخفف عبارت Curve Fitting tool میباشد استفاده میکنیم.
با توجه به تصویر زیر فقط کافی است که مقدار متغیر مستقل (x data) و متغیر وابسته (y data) را آن بدهیم و همچنین در قسمت وسط نوع تابعی که میخواهیم به آن برازش دهیم را مشخص نماییم.
در این مثال میخواهیم با استفاده از دادههای مثال اول دستور polyfit همین برازش را با منحنی درجه 2 انجام دهیم:
همانطور که ملاحظه مینمایید در قسمت سمت راست بالای صفحه تنظیماتی را برای رسم نمودار وجود دارد از جمله تنظیمات گریدبندی ، رسم کانتور و … که میتوانید این تنظیمات را تغییر دهید.
قسمت جالب این دستور این است که میتوانیم توزیعهای مختلفی را نوار ابزار قسمت بالا بر روی دادهها fit نماییم.
به عنوان نمونه میتوانیم انواع توزیعهای نرمال، ویبول، exp را برروی دادهها برازش دهیم.
دستور cftool در متلب – برازش با استفاده از رابطه دلخواه
اما قسمت بسیار جالبتر این دستور این است که میتوانیم در قسمت انتخاب توزیعها گزینه custom Equation را انتخاب نموده و توزیع موردنظر خود را به آن برازش نماییم که خیلی از مواقع پیش میآید که ما رابطه موردنظر را داریم و میخواهیم آن را بر روی دادهها برازش نماییم در این مواقع میتوانیم از این بخش استفاده کنیم.
به عنوان مثال میخواهیم یک رابطه دلخواه را به دادههای قبلی برازش دهیم:
با توجه به تصویر بالا در قسمت سمت چپ میتوانید مقدار ضرایب بدست آمده و همچنین مقدار توابع عملکرد رابطه را ملاحظه نمایید.
در ادامه بحث برازش منحنی درمتلب در قسمت بعد با دستور fit میخواهیم بصورت کاملا دلخواه و مشابه با دستور cftool هر توزیعی که میخواهیم را برازش نماییم.
Curve Fitting در متلب – دستور fit در متلب
در ادامه مبحث curve fitting در متلب به کاملترین دستور برای انجام برازش منحنی در متلب میرسیم. دستور fit در متلب یک دستور بسیار کلی برای هر نوع برازش منحنی و یا حتی درون یابی در متلب میباشد. این دستور محدودیتهای دستورات قبلی را ندارد.
نحوه کار با این دستور به این صورت است که در ورودی اول ماتریس یا بردار متغیرهای مستقل ، در ورودی دوم بردار متغیرهای وابسته ، در ورودی سوم نوع رابطه یا مدلی که میخواهیم با استفاده از آن برازش را انجام دهیم، وارد میکنیم.
همچنین در ورودیهای بعدی تنظیمات مشخصی را برای انجام دادن fitting وارد خواهیم کرد.
برای این دستور چندین مثال خواهیم زد تا بتوانیم به راحتی هر نوع توزیع را که میخواهیم حتی برای حالت سه بعدی به دادهها برازش نماییم.
در ابتدا چند مورد از مثالهای راهنمای متلب را بیان خواهیم کرد:
در ابتدا با استفاده از دادههای Census که در محیط متلب تعریف شده است میخواهیم یک عبارت درجه 2 به آن برازش نماییم. کد این تمرین و نمودار آن بصورت زیر میباشد:
1 2 3 |
load census; f=fit(cdate,pop,'poly2'); plot(f,cdate,pop) |
لازم به توضیح است که برای رسم نمودارهای نقاط و تابع برازش شده از دستور plot استفاده شده است که در ورودی اول تابع fit داده شده و در ورودیهای بعد مختصات نقاط داده شده است.
همانطور که ملاحظه میکنید در اکثر اوقات برای به نمایش گذاشتن نتایج از دستورات رسم نمودار استفاده میشود. اگر میخواهید ترسیم نمودار با متلب بصورت دوبعدی و سه بعدی و اصلاح آن را به راحتی فرابگیرید، وارد صفحه « ویرایش نمودار در متلب » بشوید.
برازش منحنی با دستور fit در متلب- مثال سهبعدی
در مثال بعدی با استفاده از دستور fit در متلب میخواهیم یک fitting سه بعدی انجام دهیم:
1 2 3 4 |
load franke T = table(x,y,z); f = fit([T.x, T.y],T.z,'linearinterp'); plot( f, [T.x, T.y], T.z ) |
در این مثال چون در فضای سه بعدی هستیم متغیرهای مستقل شامل 2 بردار میباشد که بصورت ماتریس خواهد بود و متغیر وابسته شامل یک بردار میباشد.
در این مثال برای برازش از روش درون یابی خطی استفاده شده است. همچنین از دستور table نیز برای جدولی شدن دادهها استفاده شده است.
فرض کنید که بخواهیم تنظیمات بیشتری برروی حل اعمال کنیم به عنوان نمونه برای مثال اول اینکار را انجام خواهیم داد و برای منحنی درجه 2 و3 برازش را انجام خواهیم داد:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
load census plot(cdate,pop,'ko') fo = fitoptions('Method','NonlinearLeastSquares',... 'Lower',[0,0],... 'Upper',[Inf,max(cdate)],... 'StartPoint',[1 1]); ft = fittype('a*(x-b)^n','problem','n','options',fo); [curve2,gof2] = fit(cdate,pop,ft,'problem',2); [curve3,gof3] = fit(cdate,pop,ft,'problem',3); hold on plot(curve2,'r') plot(curve3,'g') legend('Data','n=2','n=3') hold off |
توضیحاتی درباره کد بالا:
در قسمت fitoptions در ابتدا نوع روش fitting انتخاب شده، در ادامه حد بالا و پایین ضرایب، نقاط شروع برای محاسبه ضرایب تعیین شده است.
در قسمت fittype نوع تابع چند جملهای مشخص شده و در واقع مقدار n درجه چندجملهای را مشخص میکند.
همچنین در اینجا دو خروجی از دستور fit گرفته شده که خروجی اول همان اطلاعات مدل شامل ضرایب بدست آمده که در اینجا 2 ضریب a و b بوده و دیگر اطلاعات میباشد و خروجی دوم شامل محاسبه شاخصهای عملکرد مدل برازش شده میباشد که میتوانید از آنها استفاده کنید.
برازش منحنی با استفاده از یک تابع دلخواه
در ادامه بحث برازش منحنی درمتلب همانطور که گفته شد در بسیاری از مواقع نیاز داریم تا یک رابطه مشخص را برای داده موجود برازش نماییم. در این موارد کافی است که این مدل را بصورت یک تابع تعریف نماییم که در آن متغیر مستقل با x مشخص میشود.
به عنوان مثال برای مقادیر زیر میخواهیم curve fitting در متلب را با دستور fit انجام دهیم:
1 2 3 4 5 6 7 |
z=[0.6 1.2 1.8 2.4 3 4.6 6.9 9.1 12.2 13.7 15.2 16.2]'; uc=[70.9 77.3 82.3 84.9 88.4 92.7 98.1... 102.6 105.4 105.3 104.8 103.9]'; model=@(m,b,x) m*log(x)+b; f=fit(z,uc,model,'StartPoint',[4 0.5]); plot(f,z,uc) |
در گام98، ما انواع پروژه های آماده متلب را برای شما در زمنیههای مختلف (بخصوص مهندسی) را قرار دادهایم که شما میتوانید با مراجعه به صفحه « پروژه متلب » از محصولات که با بالاترین کیفیت و دقت کدنویسی شدهاند، استفاده نمایید.
برازش منحنی درمتلب بدون استفاده از دستورات curve fitting
در ادامه curve fitting درمتلب برای یک رابطه مشخص مهم آن است که بتوانیم ضرایب تعریف شده در رابطه را با توجه دادههای موجود بدست آوریم. در واقع مجهولات ما ضرایب آن رابطه میباشند.
به عنوان یک مثال میخواهیم یک رابطه درجه 2 برای دادههای فرضی زیر را برازش نماییم. برای این منظور ابتدا ماتریس ضرایب تعریف شده و سپس با ضرب کردن معکوس ماتریس ضرایب در مقدار متغیرهای وابسته ضرایب مجهول بدست میآیند و میتوانیم رابطه را ترسیم نماییم:
1 2 3 4 5 6 7 8 9 10 |
y=[ 0.75 5 20 28 31 36 40 43]'; x=[ 1 2 3 4 5 6 7 8]'; % c1+c2*x+c3*x*x A=[ones(size(y)) x x.^2]; a=pinv(A)*y; yfit=a(1)+a(2)*x+a(3)*x.^2; plot(x,y,'o'); hold on plot(x,yfit,'r') |
لازم به توضیح است که در نمودار بالا چون رابطه fit شده برای همان نقاط مشخص x ترسیم شده شکل بصورت خطوط شکسته دیده میشود در حالی که شما میتوانید با در نظر گرفتن نقاط بیشتری برای متغیر مستقل نمودار را دقیقتر ترسیم نمایید.
با این شیوه نیز میتوانید انواع روابط را برازش دهید.
این مقاله آموزشی به کوشش تیم تولید محتوای علمی و نرمافزاری گام98 در راستای ارتقای دانش شما در استفاده از نرمافزار متلب تولید شده است. درصورتی مفید بودن این مقاله آن را به دوستان و آشنایان خود معرفی نمایید.
مطالب زیر را حتما مطالعه کنید
کار با بردارها در متلب
آموزش کامل انواع دستورات توزیعهای آماری در متلب
در این مقاله قصد داریم انواع دستورات مهم توزیع های آماری در متلب را به همراه رسم انواع توزیعها و برازش با استفاده از توزیع های آماری بیان نماییم.
آموزش صفر تا 100 تحلیل المان میله به روش اجزا محدود
در ادامه دومین سری از آموزشهای روش المان محدود در این مقاله تحلیل المان میله به روش اجزا محدود را همراه با مثال به طور صفر تا صدی آموزش خواهیم داد.
آموزش جامع و کامل تحلیل المان فنر به روش اجزا محدود
در اولین مجموعه از مقالات آموزشی روش اجزا محدود، آموزش جامع و کامل تحلیل المان فنر به روش المان محدود را همراه با مثال برای شما عزیزان بیان خواهیم کرد.
روش اجزا محدود – Finite Element Method
روش اجزا محدود یک روش عددی برای حل مسائل مهندسی و فیزیکی میباشد. در این مقاله به طورکلی با کاربرد، تاریخچه و مراحل حل این روش آشنا خواهیم شد.
آموزش جامع انواع دستورات توزیع نرمال در متلب
در این مقاله انواع دستورات توزیع نرمال در متلب را به شما آموزش میدهیم.همچنین نحوه کار با توزیع های نرمال تک متغیره و چند متغیره را با جزئیات خواهید آموخت.
7 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام در صورتی که تابعی که میخواهیم برازش کنیم یک تابع با ضرایب نمادین باشد
آنگاه باید از چه دستوری استفاده کنیم ؟
مثلا:
Y=a+bx
در صورتی که a و b عدد باشند میتوان با دستور polyfit استفاده کرد در غیر اینصورت چی ؟؟
ممنونم
با سلام و احترام
در استفاده از این دستور بایستی a و b عدد (مقدار معلوم) باشند و نه بصورت تحلیلی و نمادین.
موفق باشید.
با سلام و وقت بخیر
من میخوام یک رابطه بین چندین پارامتر (به صورت زیر) بدست بیارم. xها رو دارم و میخوام a, b, c و … رو بدست بیارم. میشه بنده رو راهنمایی بفرمایید
…z=a*x1^b*x2^c*x3^d
با سلام و درود
شما میتوانید از دستور nlinfit برای برازشهای چندبعدی در متلب استفاده کنید.
سلام و عرض ادب
برای برازش با تابعی که شامل یک قسمت انتگرالی نیز هست چکار باید کرد؟
ممنون
سلام و عرض ادب
دوست عزیز منظورتون رو خیلی دقیق متوجه نشدم. اگر تابعی که میخواهید بگیرید شامل انتگرال هست، خب ابتدا انتگرال رو محاسبه کنید تا شکل نهایی تابع بدست بیاد. بعد تابع رو به دستور fit برای برازش بدید.
برای اینکه بهتر بتونیم پاسخ سوالتون رو بدیم، توصیه میشه که در گروه تلگرامی پرسش و پاسخ متلب که رایگان هم هست، عضو بشید. سوالتون رو مطرح کنید تا پاسخ داده بشه.
آدرس گروه تلگرام: https://t.me/matlab_discussion
موفق باشید.