در بسیاری از زمینههای علمی، ممکن است بخواهیم رابطه میان دو متغییر را با استفاده از نتایج آزمایش تجربی بدست آوریم که این عمل با برازش منحنی یا فیت کردن منحنی (Curve Fitting) به دادههای آزمایش انجام میپذیرد. با وجود اینکه رگرسیون (Regression) با برازش منحنی متفاوت است، اما گاهی اوقات از این عبارت برای برازش یا فیت کردن منحنی استفاده میشود. نرمافزار متلب (MATLAB) یکی از بهترین انتخابها برای برازش منحنی یا فیت کردن منحنی و همچنین انواع مختلف رگرسیون است که در این آموزش، به طور خاص به معرفی تابع polyfit نرمافزار متلب خواهیم پرداخت.
برازش منحنی (فیت کردن منحنی یا رگرسیون)
برازش منحنی یا فیت کردن منحنی به معنای گذراندن یک منحنی از میان مجموعهای از نقاط است. منحنی برازش شده، لزوماً از تمامی نقاط عبور نمیکند و برای یافتن آن، از معیارها و روشهای مختلفی میتوان استفاده کرد. یکی از رایجترین روشها، روش حداقل مربعات (Least Squares) است. در روش حداقل مربعات، فاصله منحنی با پارامترهای مجهول نسبت به هر نقطه محاسبه شده و سپس پارامترهای مجهول به گونهای استخراج میشوند که مجموع مربع این فواصل، حداقل گردد. فاصله منحنی از نقاط، در واقع انحراف منحنی برازش شده از نقاط یا همان خطا را نشان میدهد که در این روش حداقل میشود.
مجموعه نقاطی که برای برازش منحنی استفاده میشوند معمولاً به صورت تجربی استخراج شدهاند و رابطه میان دو متغییر را نشان میدهند که یک متغییر مستقل و دیگری یک متغییر وابسته به متغییر مستقل (تابعی از متغییر مستقل) است. به عنوان مثال، نیروی تولید شده در یک فنر، تابعی از جابجایی انتهای فنر (تغییر طول فنر) است. هرچه جابجایی انتهای فنر (در جهت کشش یا فشار) بیشتر باشد، نیروی تولید شده توسط فنر نیز بیشتر خواهد بود. در این مثال، جابجایی انتهای فنر متغییر مستقل و نیروی تولید شده توسط فنر که تابعی از جابجایی انتهای فنر است، متغییر وابسته میباشد. در ادامه، برای درک بهتر این آموزش، از مثال فنر استفاده خواهد شد.
لازم به یادآوری است که رابطه نیرو و جابجایی فنرهای معمولی، به صورت خطی و مطابق رابطه (1) در نظر گرفته میشوند که در آن u جابجایی انتهای فنر یا تغییر طول فنر، F نیروی تولید شده توسط فنر و k ضریب سختی فنر (Stiffness) است.
F=ku (1)
حال فرض کنید میخواهیم ضریب سختی یک فنر را بدست آوریم. برای یافتن ضریب سختی یک فنر، جابجاییهای معینی را به انتهای فنر اعمال کرده و نیروی آن را اندازهگیری میکنیم. در این مثال فرض کنید 5 جابجایی با مقادیر 1، 2.5، 3، 3.5، 4.2 سانتیمتر اعمال شده و نیروی حاصل از این جابجاییها به ترتیب 13، 30، 41، 44.5، 55.3 نیوتن اندازهگیری شدهاست. حال مقادیر جابجایی و نیروی اندازهگیری شده را در یک بردار سطری به ترتیب کنار یکدیگر مینویسیم. بردار u شامل مقادیر جابجایی و بردار F شامل مقادیر متناظر نیرو است.
u=[1 2.5 3 3.5 4.2]
F=[13 30 41 44.5 55.3]
در شکل 1، دادههای آزمایش نمایش داده شدهاند. همانطور که در شکل 1 مشاهده میشود، محور افقی جابجایی (متغییر مستقل) و محور عمودی نیروی فنر (متغییر وابسته) را نمایش میدهد.
شکل 1 – دادههای آزمایش
شکل 1 با استفاده از کد زیر در نرمافزار متلب ترسیم شدهاست.
clear; clc; close all;
u=[1,2.5,3,3.5,4.2];
F=[13,30,41,44.5,55.3];
plot(u,F,'ro','LineWidth',2,'MarkerSize',8,'LineStyle','none')
xlim([0 5]);
ylim([0 60]);
xlabel('u (cm)','FontSize', 12);
ylabel('F (N)','FontSize', 12);
grid on;
در ادامه، با استفاده از تابع polyfit نرمافزار متلب، یک منحنی به دادههای آزمایش برازش شده و ضریب سختی فنر استخراج میشود. لازم به ذکر است که این تنها یک مثال ساده برای درک بهتر مفهوم برازش منحنی است که از آن میتوان در مسائل مختلف و پیچیده استفاده نمود.
تابع polyfit نرمافزار متلب
تابع polyfit یکی از توابع موجود در نرمافزار متلب است که از آن میتوان برای برازش منحنی چندجملهای (Polynomial) به دادهها استفاده نمود. از این تابع برای برازش سایر منحنیها مانند سینوس، نمایی (Exponential) و ... نمیتوان استفاده کرد. فرم کلی یک چندجملهای از درجه n به صورت رابطه (2) است.
y\left( x \right) =a_nx^n+a_{n-1}x^{n-1}+...+a_2x^2+a_1x+a_0 (2)
در رابطه (2)، x متغییر مستقل، y متغییر وابسته و ضرایب پارامترهای چندجملهای هستند. هرچه درجه چندجملهای بیشتر باشد، تعداد پارامترهای آن نیز بیشتر شده و میتواند انحنای بیشتری به خود بگیرد. به عنوان مثال، اگر n=1 باشد، چندجملهای یک خط راست است و اگر n=2 باشد، چندجملهای تبدیل به یک سهمی میشود. هرچه درجه چندجملهای بیشتر باشد، تعداد قلهها و درههای نمودار آن نیز بیشتر میشود.
هنگامی که بخواهیم یک چندجملهای را به دادههای خود برازش کنیم، ابتدا باید درجه چندجملهای را مشخص کنیم. در بسیاری از موارد، بر اساس مطالعات قبلی، درجه چندجملهای مورد نظر مشخص است. به عنوان مثال، برای استخراج ضریب سختی یک فنر که جابجایی و نیروی آن را داریم، از چندجملهای درجه 1 استفاده میشود. زیرا از قبل میدانیم که رابطه نیرو و جابجایی به صورت خطی مطابق رابطه (1) بیان میشود.
تابع polyfit نرمافزار متلب دارای 3 ورودی x، y و n است و به صورت زیر نوشته میشود.
a = polyfit(x,y,n)
در تابع polyfit ورودیهای x و y به ترتیب بردار متغییرهای مستقل و وابسته هستند. در مثال فنر، ورودیهای x و y به ترتیب بردارهای جابجایی \left( u \right) و نیرو \left( F \right) هستند. همچنین ورودی n، درجه چندجملهای مورد نظر را مشخص میکند. در مثال فنر، مقدار ورودی n برابر با 1 در نظر گرفته میشود. تابع polyfit پارامترهای چندجملهای را با توجه به دادهها و به روش حداقل مربعات محاسبه کرده و آنها را در متغییر a ذخیره میکند. متغییر a یک بردار است که پارامترهای چندجملهای برازش شده را به صورت زیر دربرمیگیرد.
a=\left[ a_n\,\,\,\,a_{n-1}\,\,\,\,...\,\,\,\,a_1\,\,\,\,a_0 \right]
برای یافتن ضریب سختی فنر، یک منحنی درجه 1 (یک خط راست) به دادههای آزمایش برازش میشود. شیب خط حاصل (ضریب x منحنی فیت شده) برابر با ضریب سختی فنر خواهد بود. برای یافتن ضریب سختی فنر مثال بالا، کد زیر نوشته میشود.
clear; clc; close all;
u=[1,2.5,3,3.5,4.2];
F=[13,30,41,44.5,55.3];
a=polyfit(u,F,1);
Stiffness=a(1,1) %N/cm
SIStiffness=a(1,1)*100 %N/m
با اجرای کد بالا، متغییر a محاسبه میشود که یک بردار با دو درایه است؛ درایه اول شیب خط و درایه دوم عرض از مبدا آن است. در این مثال، درایه اول برابر با ضریب سختی فنر است که در واحد SI برابر با 1325 نیوتن بر متر میباشد. شکل 2 دادههای آزمایش و منحنی برازش شده (خط فیت شده) را نمایش میدهد.
شکل 2 – دادههای آزمایش و خط برازش شده
شکل 2 با استفاده از کد زیر رسم شدهاست. در این کد، منحنی فیت شده به کمک تابع polyval ترسیم شدهاست. تابع polyval دو ورودی دارد؛ ورودی اول ضرایب منحنی مورد نظر و ورودی دوم، یک بردار با تعداد درایه دلخواه است که تابع polyval منحنی را به ازای آن مقادیر محاسبه میکند و خروجی آن، یک بردار است که مقادیر محاسبه شده در آن ذخیره میشود.
clear; clc; close all;
u=[1,2.5,3,3.5,4.2];
F=[13,30,41,44.5,55.3];
a=polyfit(u,F,1);
p1=plot(u,F,'ro','LineWidth',2,'MarkerSize',8,'LineStyle','none')
xlim([0 5]);
ylim([0 60]);
xlabel('u (cm)','FontSize', 12);
ylabel('F (N)','FontSize', 12);
grid on;
hold on;
FCurve=polyval(a,u);
p2=plot(u,FCurve,'b','LineWidth',2)
legend([p1(1,1),p2(1,1)],'Experimental Data','Fitted Curve');
باید توجه داشت که در این مثال، هیچ اشکالی ندارد که درایههای بردار u تکراری شود. اگر برای یک جابجایی معین چندین بار آزمایش تکرار شده باشد و چندین مقدار نیروی برای یک جابجایی معین اندازهگیری شده باشد، درایههای بردار u تکراری میشود. به عنوان مثال فرض کنید برای جابجاییهای 1، 2.5 و 3 سانتیمتر به ترتیب 3، 2 و 4 بار آزمایش تکرار شده باشد. در این حالت کد زیر نوشته میشود.
clear; clc; close all;
u=[1,1,1,2.5,2.5,3,3,3,3,3.5,4.2];
F=[13,13.2,12.5,30,31.6,41,41.3,42,39.8,44.5,55.3];
a=polyfit(u,F,1);
p1=plot(u,F,'ro','LineWidth',2,'MarkerSize',8,'LineStyle','none')
xlim([0 5]);
ylim([0 60]);
xlabel('u (cm)','FontSize', 12);
ylabel('F (N)','FontSize', 12);
grid on;
hold on;
uCurve=[0,1,2,3,4,5];
FCurve=polyval(a,uCurve);
p2=plot(uCurve,FCurve,'b','LineWidth',2)
legend([p1(1,1),p2(1,1)],'Experimental Data','Fitted Curve');
با اجرای کد بالا، ضریب سختی فنر 1339 نیوتن بر متر محاسبه میشود. در شکل 3 دادههای آزمایش و خط برازش شده نمایش داده شدهاست.
شکل 3 – دادههای آزمایش و خط برازش شده
دیدگاه بگذارید