برازش منحنی در متلب | دستور polyfit و fit متلب
به نام خدا و سلام.
به جلسه سی و هفتم از سری جلسات آموزش متلب خوش آمدید. آموزش نرم افزار متلب از وبسایت متلبپلاس بصورت حرفهای ارائه میشود. در این جلسه به آموزش برازش منحنی در متلب میپردازیم. برازش منحنی در متلب، در 3 بخش ارائه میشود. برازش منحنی با دستور polyfit در متلب، با دستور fit در متلب و ابزار گرافیکی curve fitting در متلب (cftool). در این جلسه به طور کامل به همهی این موارد میپردازیم.
با متلب پلاس همراه باشید.
برازش منحنی چیست؟
در این جلسه انواع روشهای برازش منحنی در متلب یا همان Curve Fitting در متلب به طور کامل معرفی میشود. اما بهتر است در ابتدای صحبت، به معنی برازش منحنی بپردازیم. منظور از برازش منحنی، فیت کردن یک تابع به یک سری نقاط (داده) است. به عبارت دیگر، اگر نقاط x و y را داشته باشیم، معادله خط را بدست آوریم. برازش منحنی، یک تابع به ما ارائه میکند که همهی نقاط را پوشش دهد. برازش منحنی برای پیدا کردن یک تابع برای دادههای آزمایشگاهی بسیار مفید است. البته تابع بدست آمده دقت 100 درصدی ندارد اما تا حد بسیار زیادی قابل قبول است. در متلب برای بدست آوردن معادله خط، 3 روش کلی وجود دارد. دستور polyfit، دستور fit و ابزار cftool متلب.
در ادامهی آموزش متلب، هر 3 روش برازش منحنی در متلب با حل مثال کاربردی ارائه میشود.
برازش منحنی با دستور polyfit در متلب
دستور polyfit در متلب یک تابع چند جمله ای به دادهها فیت میکند. طرز نوشتن این دستور در متلب بصورت polyfit(x,y,n) است. که در آن x و y دادههای ما و n مرتبه چند جمله ای است. منظور از مرتبه چند جمله ای، بیشترین توان در چند جمله ای است. اگر n برابر با یک باشد، تابع خطی ax+b بر دادههای ما فیت میشود. برای درک بهتر به مثال زیر دقت کنید.
7 نقطه از x و y داریم. میخواهیم معادله خط این نقاط را در متلب محاسبه کنیم. معادله خط از نوع خطی (مرتبه 1) است. برای این کار از دستور polyfit بصورت زیر استفاده میکنیم.
x = [1 2 4 7 9 12 15];
y = [4 7 14 19 21 26 35];
p = polyfit(x,y,1)
پس از اجرای دستور بالا، داریم:
p =
2.0447 3.3947
مشاهده میکنیم که خروجی بصورت 2 عدد است. در واقع به این نقاط، معادله خط ax+b (یا چند جمله ای مرتبه یک p1x+p2) فیت شدهاست. ضریب اول، ضریب x و ضریب دوم نیز مقدار ثابت است. برای درک بهتر از برازش منحنی انجام شده، خط و دادهها را رسم میکنیم. برای رسم تابع جدید، بایستی نقاط x را درون این تابع جایگذاری کنیم. برای اینکار از دستور polyval استفاده میکنیم. توضیحات کامل درباره کار با چند جمله ایها در متلب، در جلسه 33 ام ارائه شد. برای مشاهده روی عبارت قرمز رنگ کلیک نمائید.
x = [1 2 4 7 9 12 15];
y = [4 7 14 19 21 26 35];
p = polyfit(x,y,1);
y1 = polyval(p,x);
plot(x,y,'o','MarkerFaceColor','y','MarkerEdgeColor','k')
hold on
plot(x,y1,'b','linewidth',1.5)
legend('Original Data','polyfit- n=1')
مشاهده میشود که نمودار جدید با دادههای اصلی تطابق نسبتا خوبی دارد. برای رسم نمودار در متلب از دستور plot استفاده کردیم. نقاط اصلی بصورت دایرهی توپر با رنگ زرد و منحنی برازش شده با خط آبی نمایش داده شده. برای مشاهده جزئیات بیشتر درباره رسم انواع نمودار در متلب، روی عبارت قرمز رنگ قبل کلیک نمائید.
در مثال زیر یک مسئلهی برازش منحنی دیگر را با دستور polyfit در متلب حل میکنیم.
حل مثال کاربردی از دستور polyfit در متلب
در این مثال دادههای ما براساس تابع سینوس میباشند. میخواهیم یک منحنی چند جمله ای مرتبه 3 بر آنها فیت کنیم.
x = 0:0.1:2*pi;
y = sin(x) ;
p = polyfit(x,y,3);
y1 = polyval(p,x);
plot(x,y,'o','MarkerFaceColor','y','MarkerEdgeColor','k')
hold on
plot(x,y1,'b','linewidth',1.5)
legend('Original Data','polyfit, n=3')
پس از اجرای کد بالا، داریم.
تطابق بسیار خوبی با دادههای اصلی مشاهده میشود. اما هنوز هم در برخی نقاط فاصله بین دادهی اصلی و نمودار برازش شده دیده میشود. برای بهتر شده نمودار، مرتبه چند جمله ای فیت شده را از 3 به 5 افزایش میدهیم.
x = 0:0.1:2*pi;
y = sin(x) ;
p = polyfit(x,y,5);
y1 = polyval(p,x);
plot(x,y,'o','MarkerFaceColor','y','MarkerEdgeColor','k')
hold on
plot(x,y1,'b','linewidth',1.5)
legend('Original Data','polyfit, n=5')
میبینیم که دقت نمودار فیت شده بسیار زیاد شد.
محاسبه دقت برازش منحنی (R2)
برای محاسبه دقت منحنی برازش شده با تابع اصلی، از دستور corr(y1,y2) استفاده میشود. که y1 و y2 مربوط به تابع اولیه و فیت شدهاند. اگر پاسخ corr را به توان 2 برسانیم، در واقع R2 را محاسبه کردهایم. برای درک بهتر، مقدار R2 را برای مثال قبل محاسبه میکنیم.
x = 0:0.1:2*pi;
y = sin(x) ;
p = polyfit(x,y,5);
y1 = polyval(p,x);
R = corr(y',y1');
R^2
ans =
1.0000
مقدار یک به معنای دقت صد درصد است.
کار با دستور polyfit در متلب را با حل چند مثال توضیح دادیم. دستور polyfit به دادهها فقط نمودارهای چند جمله ای فیت میکند. در ادامه دستور fit معرفی میشود. این دستور میتواند تابع دلخواه شما را به دادهها فیت کند.
برازش منحنی با دستور fit در متلب
دستور fit در متلب برای برازش منحنی با هر نوع تابع دلخواه میباشد. طرز نوشتار دستور fit در متلب بصورتهای زیر است.
#1
f = fit(x,y,fitType)
#2
f = fit(x,y,fitType,fitOptions)
#3
f = fit([x,y],z,fitType)
#4
[f, gof] = fit(x,y,fitType)
فرم اول: دادههای x و y به همراه نوع تابع را به عنوان ورودی میگیرد. نوع تابع میتواند چند جمله ای، توانی، کسری، مثلثاتی، نمایی، گاوسی، اسپلاین، دلخواه و… باشد.
فرم دوم: در این طرز نوشتار، علاوه بر دادههای x و y و نوع تابع، بایستی تنظیمات برازش (فیتینگ) را نیز وارد کنیم. این ویژگی به ما امکان استفاده از قابلیتهای پیشرفته دستور fit در متلب را میدهد.
فرم سوم: در این فرم، میتوان دادههای سه بعدی را با دستور fit فیت کرد. این طرز نوشتار، یک منحنی سه بعدی (z برحسب x و y) میدهد.
فرم چهارم: در این نوشتار، دو خروجی داریم. خروجی اول (f) تابع فیت شده و خروجی دوم (gof) جزئیات دقت فیت را میدهد. مثلا معیار آر اسکوئر (R2) که همواره در برازش منحنی بررسی میشود جزو خروجیهای gof است.
دقت کنید که x و y (و یا هر برداری) در دستور fit باید بصورت ستونی باشد. اگر بردار سطری دارید، با استفاده از ‘ آن را ترانهاده کنید تا ستونی شود.
حال انواع مختلف تابع (Fit Type) که میتوان با fit محاسبه کرد را معرفی میکنیم. بطور کلی نوع تابع میتواند توزیع وایبول، نمایی، فوریه، گاوسی، چند جملهای، توانی، کسری، مثلثاتی، اسپلاین یا دلخواه باشد. برای اینکه تابع خوبی بر دادهها فیت کنیم لازم است تا نوع تابع را بدرستی انتخاب کنیم.
برازش منحنی با توزیع وایبول
توزیع وایبول (Weibull) در تجزیه و تحلیل دادههای قابلیت اطمینان و عمر (نرخ شکست) استفاده میشود. متلب در جعبه ابزار برازش منحنی، توزیع وایبول دو پارامتری را ارائه میکند. رابطه توزیع وایبول با 2 پارامتر بصورت زیر است.
برای فیت کردن تابع براساس توزیع وایبول، بهتر است نقطه شروع (حدس اولیه) برای a و b را نیز وارد کنیم. در غیراینصورت متلب از 2 عدد تصادفی برای شروع استفاده میکند. دستور برازش منحنی با توزیع وایبول در متلب بصورت زیر است.
f = fit(x,y,'weibull','startpoint',[a b])
که x و y براساس توزیع وایبول با نقاط شروع a و b فیت میشوند.
برازش منحنی با تابع نمایی
تابع نمایی یک ترم و دو ترم در متلب بطور پیشفرض تعریف شدهاست. فرمول تابع نمایی برای برازش منحنی در متلب بصورت زیر است.
برای درک بهتر، یک مثال از بدست آوردن معادله خط با تابع نمایی در متلب ارائه میکنیم. مقدار x را از صفر تا 5 درنظر میگیریم. مقادیر y نیز بصورت مجموع تابع نمایی 2e0.2x و یک عدد تصادفی تعریف میشوند. در واقع y همان تابع نمایی است که کمی از مقدار واقعی خود منحرف شده. حال با استفاده از دستور fit در متلب، یک معادله خط برای این نقاط محاسبه میکنیم.
x = (0:0.1:5)';
y = 2*exp(-0.2*x) + 0.1*randn(size(x));
f = fit(x,y,'exp1')
f =
General model Exp1:
f(x) = a*exp(b*x)
Coefficients (with 95% confidence bounds):
a = 2.026 (1.991, 2.061)
b = 0.194 (0.1892, 0.1989)
مشاهده میکنید که ضرایب a و b بدرستی محاسبه شدهاند. اگر این نمودار را رسم کنیم.
plot(f,x,y)
title('Curve Fitting, Exponential Models')
نمودار فیت شده دقت نسبتا خوبی نسبت به دادههای اصلی دارد.
برازش منحنی با تابع فوریه
سری فوریه مجموع توابع سینوس و کسینوس است که یک سیگنال تناوبی را توصیف میکند. به دو صورت مثلثاتی یا نمایی نمایش داده میشود. تولباکس برازش منحنی متلب سری فوریه مثلثاتی را ارائه میدهد. فرمول سری فوریه در حالت کلی بصورت زیر است.
که در آن a0 یک عدد ثابت، w فرکانس سیگنال، n تعداد ترمها (جملات) در سری فوریه است. برای برازش منحنی در متلب با سری فوریه، عبارت ‘fourier1’ تا ‘fourier8’ را در دستور fit مینویسیم. عدد جلوی عبارت ‘fourier’ به معنای تعداد جملات (برای دقت بیشتر) است.
برای درک بهتر، یک مثال از برازش منحنی با سری فوریه در متلب ارائه میکنیم. مقدار x را از صفر تا 2پی درنظر میگیریم. مقادیر y نیز بصورت مجموع سینوس 2x و یک عدد تصادفی تعریف میشوند. در واقع y همان تابع سینوس 2x است که کمی از مقدار واقعی خود منحرف شده. حال با استفاده از دستور fit در متلب، یک معادله خط برای این نقاط محاسبه میکنیم.
x = (0:0.05:2*pi)';
y = sin(2*x) + 0.1*randn(size(x));
f = fit(x,y,'fourier1')
f =
General model Fourier1:
f(x) = a0 + a1*cos(x*w) + b1*sin(x*w)
Coefficients (with 95% confidence bounds):
a0 = -0.01488 (-0.03308, 0.003328)
a1 = -0.03386 (-0.08412, 0.01639)
b1 = 0.9994 (0.9735, 1.025)
w = 2.008 (1.994, 2.022)
نمودار منحنی فیت شده را رسم کنیم.
plot(f,x,y)
title('Curve Fitting, Fourier Series')
نمودار فیت شده دقت خوبی نسبت به دادههای اصلی دارد.
برازش منحنی با توزیع گاوسی
از مدل گاوسی برای فیت کردن نمودارهای شبیه قله (زنگوله شکل یا bell shape) استفاده میشود. رابطه مدل گاوسی بصورت زیر است.
که در آن a دامنه، b مرکز قله، c مرتبط با پهنای قله و n تعداد جملات در مدل گاوسی است. برای برازش منحنی در متلب با تابع گاوسی، عبارت ‘gauss1’ تا ‘gauss8’ را در دستور fit مینویسیم. عدد جلوی عبارت ‘gauss’ به معنای تعداد جملات است.
برای درک بهتر، یک مثال از برازش منحنی با تابع گاوسی در متلب ارائه میکنیم. در این مثال دادههای اصلی بصورت یک سهمی درجه 2 با ضریب منفی میباشند. مقدار x را از صفر تا 6 درنظر میگیریم. مقادیر y نیز بصورت سهمی درجه 2 با ضریب منفی بعلاوه یک عدد تصادفی تعریف میشوند. در واقع y همان سهمی برعکس است که کمی از مقدار واقعی خود منحرف شده. حال با استفاده از دستور fit در متلب، یک معادله خط برای این نقاط محاسبه میکنیم.
x = (0:0.05:6)';
y = 10 - (x - 3).^2 + 0.1*randn(size(x));
f = fit(x,y,'gauss1')
f =
General model Gauss1:
f(x) = a1*exp(-((x-b1)/c1)^2)
Coefficients (with 95% confidence bounds):
a1 = 10.42 (10.25, 10.58)
b1 = 3.003 (2.97, 3.035)
c1 = 2.512 (2.458, 2.567)
حال نمودار فیت شده را رسم کنیم.
plot(f,x,y)
title('Curve Fitting, Gaussian Models')
نمودار فیت شده دقت خوبی نسبت به دادههای اصلی دارد.
برازش منحنی با مدل چند جمله ای
برازش منحنی polyfit با استفاده از توابع چند جمله ای به طور کامل در ابتدای این جلسه تشریح شد. اما دستور fit امکانات بیشتری برای برازش منحنی چند جمله ای در اختیار ما میگذارد. رابطهی چند جمله ای برای برازش منحنی در حالت دو بعدی بصورت زیر است.
اما برای برازش منحنی سه بعدی با چند جمله ایها در متلب، رابطهی کلی بصورت زیر است.
برای درک بهتر، یک مثال از برازش منحنی سه بعدی با چند جمله ای در متلب ارائه میکنیم. در این مثال دادههای اصلی را از حافظهی متلب فراخوانی میکنیم. این نقاط مربوط به یک رویه سه بعدی است. حال با استفاده از دستور fit در متلب، معادله صفحه برای این نقاط محاسبه میکنیم.
load franke;
f_surf = fit([x,y],z, 'poly55','Normalize','on');
plot(f_surf, [x,y],z)
title('3d-Curve Fitting, Polynomial Surface')
دقت کنید که آپشن Normalize را روشن میکنیم. این آپشن برای مقیاس دهی مقادیر است. تعداد ضرایب خروجی فیتینگ نیز زیاد است. به همین دلیل آنها را نمایش نمیدهیم. نمودار صفحه فیت شده بر دادهها بصورت زیر است.
برازش منحنی با تابع توانی
در نرم افزار متلب به طور پیشفرض 2 نوع سری توانی ارائه شدهاست. نوع یک جمله ای و دو جمله ای. در زیر هردوی این عبارتها ارائه شدهاست.
مدلهای سری توانی انواع دادهها را توصیف میکنند. برای مثال، سرعت مصرف واکنشدهندهها در یک واکنش شیمیایی به طور کلی با غلظت واکنشدهنده به مقداری توان متناسب است. برای درک بهتر، یک مثال از برازش منحنی با سری توانی در متلب ارائه میکنیم. در این مثال دادههای اصلی بصورت یک تابع توانی axb+c میباشند. به این مقادیر یک عدد تصادفی اضافه میشود تا کمی از مقدار واقعی خود منحرف شود. حال با استفاده از دستور fit در متلب، یک معادله خط برای این نقاط محاسبه میکنیم.
x = (0.05:0.05:10)';
y = 10 + 3*x.^0.5 + 0.1*randn(size(x));
f = fit(x,y,'power2')
f =
General model Power2:
f(x) = a*x^b+c
Coefficients (with 95% confidence bounds):
a = 3.045 (2.924, 3.167)
b = 0.496 (0.4835, 0.5084)
c = 9.955 (9.827, 10.08)
حال نمودار فیت شده را رسم کنیم.
plot(f,x,y)
title('Curve Fitting, Power Series')
برازش منحنی با تابع کسری
مدلهای تابع کسری بصورت نسبت چند جملهای تعریف میشوند. فرم کلی این مدلها مطابق زیر است.
n توان چند جمله ای صورت و m توان چند جمله ای مخرج است. برای درک بهتر، یک مثال از برازش منحنی با تابع کسری در متلب ارائه میکنیم. دادههای اصلی بصورت تابع x+sin(x) تقسیم بر x2+1 است. در واقع صورت این کسر چند جمله ای نیست. اما بازهم میتوان تابع کسری به آن فیت کرد.
x = (0:0.05:5)';
y = (x + sin(x))./(x.^2 + 1);
f = fit(x,y,'rat12');
plot(f,x,y)
title('Curve Fitting, Rational Polynomials')
برازش منحنی با تابع سینوس (مثلثاتی)
مدل مجموع توابع سینوس برای برازش دادههای تناوبی استفاده میشود. رابطهی این مدل بصورت زیر است.
که در آن a دامنه، b فرکانس، و c ثابت فاز برای هر ترم موج سینوسی است. n تعداد عبارتهای سری است که بین 1 تا 8 میباشد. اگر به رابطه مجموع توابع سینوس دقت کنید، شباهت زیادی به سری فوریه دارد. در واقع سری فوریهای که ترم کسینوس آن صفر باشد. برای درک بهتر، یک مثال از برازش منحنی با تابع سینوس در متلب ارائه میکنیم. دادههای اصلی بصورت تابع 4sin(x+0.5) بعلاوه یک مقدار تصادفی است. افزودن مقدار تصادفی به این دلیل است که مقادیر کمی با تابع اصلی متفاوت باشند.
x = (0:0.05:6)';
y = 4*sin(x+0.5)+ 0.1*randn(size(x));
f = fit(x,y,'sin1')
f =
General model Sin1:
f(x) = a1*sin(b1*x+c1)
Coefficients (with 95% confidence bounds):
a1 = 4.002 (3.978, 4.026)
b1 = 1.001 (0.9978, 1.005)
c1 = 0.4933 (0.4801, 0.5064)
ضرایب تابع بدرستی محاسبه شدهاند. اگر نمودار فیت شده را رسم کنیم، داریم:
برازش منحنی با اسپلاین
در برخی موارد ممکن است به تابع پارامتری برای دادهها نیاز نداشته باشیم. بلکه فقط فیت شدن یک نمودار به دادهها را بخواهیم. در این شرایط از اسپلاینها استفاده میکنیم. در این حالت تابعی برای نمودار داده نمیشود. نوع تابع اسپلاین در دستور fit بصورت spline و یا smoothing spline است.
برای درک بهتر، یک مثال از برازش منحنی با اسپلاین در متلب ارائه میکنیم.
x = (0:0.05:1)';
y = 0.5*sin(x.^2) + 0.05*randn(size(x));
f = fit(x,y,'smoothingspline');
g = fit(x,y,'spline');
plot(x,y,'o','MarkerFaceColor','y','MarkerEdgeColor','k')
hold on
plot(f)
plot(g,'k')
legend('Original Data','Smoothing Spline','Spline')
title('Curve Fitting, Spline')
برازش منحنی با تابع دلخواه
گاهی ممکن است بخواهیم به دادهها نموداری فیت کنیم که معادله آن دلخواه باشد. البته که توابع پیشفرضی که در موارد بالا معرفی شد، بخش زیادی را پوشش میدهد. اما امکان وارد کردن تابع بصورت دستی (دلخواه) نیز در برازش منحنی متلب فراهم است. برای این کار، دو روش داریم:
برای درک بهتر مثال از برازش منحنی با تابع دلخواه ارائه میکنیم. دادههایی که مجموع عدد ثابت (1) و سینوس و سینوس هایپربولیک اند. فرم کلی این تابع را در دستور fit مینویسیم تا ضرایب را محاسبه کند.
x = (0:0.1:4)';
y = 3*sinh(-0.5*x) + 2*sin(x) - 1 ;
fitfun = fittype(@(a,b,c,d,x) a*sinh(b*x) + c*sin(x) - d);
f = fit(x,y,fitfun)
f =
General model:
f(x) = a*sinh(b*x)+c*sin(x)-d
Coefficients (with 95% confidence bounds):
a = -3 (-3, -3)
b = 0.5 (0.5, 0.5)
c = 2 (2, 2)
d = 1 (1, 1)
ضرایب بدرستی محاسبه شدهاند. شکل نمودار اصلی و نمودار فیت شده نیز بصورت زیر است.
plot(f,x,y)
legend('Original Data','Custom function')
title('Curve Fitting, Custom function')
این کد را بصورت زیر هم میتوان نوشت:
x = (0:0.1:4)';
y = 3*sinh(-0.5*x) + 2*sin(x)-1 ;
f = fit(x,y,'a*sinh(b*x) + c*sin(x) - d')
به این ترتیب میتوان تابع دلخواه را برای برازش منحنی وارد کرد.
مثال کاربردی از برازش منحنی با fit در متلب
حال که همهی توابع را معرفی کردیم، یک مثال کاربردی از برازش منحنی حل میکنیم. در این مثال برازش منحنی با تابع دلخواه دادهها را انجام میدهیم. همچنین دقت برازش نیز محاسبه میشود.
x = ([1800 1820 1840 1860 1880 1900 1920 1940 1960 1980 2000])';
y = ([5.3 9.6 17.1 31.4 50.2 76 105.7 131.7 179 226.5 248.7])';
[f1, gof1] = fit(x,y,'a*(x-b)^2')
ضرایب و دقت برازش منحنی بصورت زیر است.
f1 =
General model:
f1(x) = a*(x-b)^2
Coefficients (with 95% confidence bounds):
a = 0.005419 (0.004696, 0.006143)
b = 1781 (1769, 1793)
gof1 =
struct with fields:
sse: 355.3009
rsquare: 0.9954
dfe: 9
adjrsquare: 0.9949
rmse: 6.2831
حال توان تابع دلخواه را از 2 به 3 تغییر میدهیم.
[f2, gof2] = fit(x,y,'a*(x-b)^3')
f2 =
General model:
f2(x) = a*(x-b)^3
Coefficients (with 95% confidence bounds):
a = 1.079e-05 (7.814e-06, 1.376e-05)
b = 1709 (1686, 1733)
gof2 =
struct with fields:
sse: 652.5471
rsquare: 0.9915
dfe: 9
adjrsquare: 0.9906
rmse: 8.5150
در نهایت نمودار دادههای اصلی و دو برازش منحنی را روی هم رسم میکنیم.
plot(x,y,'o')
hold on
plot(f1,'k')
plot(f2,'r')
legend('Original Data','n=2','n=3')
ابزار curve fitting در متلب (cftool)
تا اینجا توضیحات کاملی برای برازش منحنی با کدنویسی دستور fit و polyfit ارائه کردیم. این موارد نیاز به کدنویسی و رعایت اصول را داشت. اما در این بخش به آموزش برازش منحنی بدون نیاز به کدنویسی میپردازیم. استفاده از ابزار (اَپ) cftool یا curve fitting متلب. با این ابزار میتوان بدون کدنویسی و بصورت کاملا گرافیکی، برازش منحنی در متلب را انجام داد. برای دسترسی به این ابزار 2 روش داریم. روش اول، رفتن به سربرگ APPS متلب و انتخاب نرم افزار Curve Fitting. و روش دوم اجرای دستور cftool در پنجره فرمان.
پس از بازکردن cftool با محیط زیر روبرو میشویم.
در این ابزار، ابتدا دادههای موردنظر برای برازش انتخاب میشوند. سپس نوع تابع و جزئیات آن را انتخاب میکنیم. به همین راحتی، برازش منحنی انجام میشود.
مثال برازش منحنی دو بعدی با cftool در متلب
در ویدئوی زیر یک مثال از برازش منحنی دادههای دو بعدی در متلب با ابزار cftool ارائه میکنیم. در این مثال ابتدا بردارهای x و y را در Command window تعریف کرده و سپس در cftool فراخوانی میکنیم. به ویدئوی زیر دقت کنید.
مثال برازش منحنی سه بعدی با cftool در متلب
در ویدئوی زیر یک مثال از برازش منحنی دادههای سه بعدی در متلب با ابزار cftool ارائه میکنیم. ابتدا ماتریسهای x و y و z را در Command window تعریف کرده و سپس در cftool فراخوانی میکنیم. به ویدئوی زیر دقت کنید.
تمرینات این جلسه
در انتهای این جلسه 3 تمرین متلب مربوط به مباحث این جلسه ارائه شده است. لطفا این تمرینها را حل کرده و با پاسخ آن مقایسه کنید. پاسخ تمرینات متلب این جلسه در کانال تلگرام متلب پلاس منتشر میشود. از آیکونهای سمت راست صفحه میتوانید در این کانال عضو شوید.
تمرین اول) دادههای زیر را درنظر گرفته و یک نمودار با تابع گاوسی به آن فیت کنید. مقدار R2 را نیز محاسبه کنید.
x = [0,5], y = 4 – (x-2.5)2 + random
تمرین دوم) برازش منحنی را برای نمودار سینوس 3x (بعلاوه یک عدد تصادفی کوچک) انجام دهید. بازه x از صفر تا π باشد و چند جمله ای مرتبه 5 به آن فیت کنید. ضمناً مقدار R2 نیز محاسبه شود. این تمرین را با دستور fit انجام دهید.
تمرین سوم) با استفاده از دستور fit برازش منحنی دادههای زیر را انجام دهید. تابع موردنظر برای برازش را از نوع سری فوریه درنظر بگیرید. ضمناً مقدار R2 نیز محاسبه شود.
x = [0, 2π], y = sinh(sin(x)) – 2x3
جمعبندی
جلسه سی و هفتم از سری جلسات آموزش متلب به پایان رسید. این جلسه درباره برازش منحنی در متلب (Curve fitting) صحبت کردیم. از برازش منحنی چند جمله ایها با دستور polyfit آغاز کردیم تا ابزار گرافیکی cftool متلب. همچنین جزئیات کامل با حل مثال از دستور fit که کاملترین دستور برازش منحنی در متلب است ارائه شد. ابزار گرافیکی cftool نیز به طور کامل با حل دو مثال (دو بعدی و سه بعدی) معرفی شد. توابع مناسب برای برازش منحنی که به طور پیشفرض در متلب وجود دارد نیز معرفی و جزئیات آنها بیان شد. در انتها چند تمرین برای یادگیری بیشتر به شما واگذار کردیم که پاسخ آنها در کانال تلگرامی متلب پلاس وجود دارد. بی صبرانه منتظر نظرات، سوال و ابهامات شما عزیزان هستیم. سعی میکنیم تا هرگونه سوال یا ابهامی که در این باره دارید را پاسخ دهیم.
توصیه میشود که حتما تمرینات این جلسه را انجام بدید و اگر سوال و ابهامی دارید در بخش نظرات (پایین همین صفحه) به ما بگید. از فهرست سمت راست هم میتونید به بقیه جلسات دسترسی داشته باشید.
14 Comments
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام و عرض ادب لطفا در مورد برنامه زیر که خطای آن نیز اعلام شده راهنمایی بفرمایین
syms A1 A2 Eg Eb R L n k
E=input(‘Enter E=’);
k=input(‘Enter nmax=excitonc state max n=’);
x = ‘x.xlsx’;
x = xlsread(x);
y = ‘y.xlsx’;
y = xlsread(y);
%c=A2*2*pi*Eb^(3/2)/(x*L)*symsum((1/n^3)*sech((x-Eg+Eb/n^2)/L),n,1,k);
[f,gof]=fit(x,y,’A1.*2.*pi.*sqrt(Eb)./(x.*L)*(1+10.*R.*(E-Eg)+126.*R^2.*(E-Eg)^2)./((1-exp(-2.*pi.*sqrt(Eb./(E-Eg))).*cosh((x-E)./L))-1./cosh(a./L)+A2.*2.*pi.*Eb^(3/2)/(x.*L)*symsum((1/n^3)*sech((x-Eg+Eb/n^2)./L),n,1,7)’);
plot(x,y,’o’)
hold on
plot(f,’k’)
خطا:
>> fit2
Enter E=100
Enter nmax=excitonc state max n=2
Error using fittype/testCustomModelEvaluation
Expression
A1.*2.*pi.*sqrt(Eb)./(x.*L)*(1+10.*R.*(E-Eg)+126.*R^2.*(E-Eg)^2)./((1-exp(-2.*pi.*sqrt(Eb./(E-Eg))).*cosh((x-E)./L))-1./cosh(a./L)+A2.*2.*pi.*Eb^(3/2)/(x.*L)*symsum((1/n^3)*sech((x-Eg+Eb/n^2)./L),n,1,7)
is not a valid MATLAB expression, has non-scalar coefficients, or cannot be evaluated:
Error in fittype expression ==>
A1.*2.*pi.*sqrt(Eb)./(x.*L).*(1+10.*R.*(E-Eg)+126.*R.^2.*(E-Eg).^2)./((1-exp(-2.*pi.*sqrt(Eb./(E-Eg))).*cosh((x-E)./L))-1./cosh(a./L)+A2.*2.*pi.*Eb.^(3./2)./(x.*L).*symsum((1./n.^3).*sech((x-Eg+Eb./n.^2)./L),n,1,7)
??? Error: This statement is incomplete.
Error in fittype>iCreateFittype (line 373)
testCustomModelEvaluation( obj );
Error in fittype (line 330)
obj = iCreateFittype( obj, varargin{:} );
Error in fit>iFit (line 165)
model = fittype( fittypeobj, ‘numindep’, size( xdatain, 2 ) );
Error in fit (line 116)
[fitobj, goodness, output, convmsg] = iFit( xdatain, ydatain, fittypeobj, …
Error in fit2 (line 9)
[f,gof]=fit(x,y,’A1.*2.*pi.*sqrt(Eb)./(x.*L)*(1+10.*R.*(E-Eg)+126.*R^2.*(E-Eg)^2)./((1-exp(-2.*pi.*sqrt(Eb./(E-Eg))).*cosh((x-E)./L))-1./cosh(a./L)+A2.*2.*pi.*Eb^(3/2)/(x.*L)*symsum((1/n^3)*sech((x-Eg+Eb/n^2)./L),n,1,7)’);
Caused by:
Error using fittype/evaluate>I_ERROR_FCN_
Error in fittype expression ==>
A1.*2.*pi.*sqrt(Eb)./(x.*L).*(1+10.*R.*(E-Eg)+126.*R.^2.*(E-Eg).^2)./((1-exp(-2.*pi.*sqrt(Eb./(E-Eg))).*cosh((x-E)./L))-1./cosh(a./L)+A2.*2.*pi.*Eb.^(3./2)./(x.*L).*symsum((1./n.^3).*sech((x-Eg+Eb./n.^2)./L),n,1,7)
??? Error: This statement is incomplete.
>>
سلام و عرض ادب
در برازش منحنی مجاز به استفاده از متغیرهای سیمبولیک نیستیم. اگر به مثالهای همین آموزش دقت کنید اشتباه تون رو متوجه خواهید شد.
توصیه میکنم در گروه پرسش و پاسخ نرم افزار متلب عضو بشید و در اونجا سوالاتتون رو مطرح بفرمایید.
لینک عضویت👇
https://t.me/matlab_discussion
سلام
خداخیرتون بده
سلام علیرضا عزیز
خیلی ممنونیم ازت.
موفق باشی.
سلام وقتتون بخیر ممنون بابت مطالبی که داخل سایت قرار دادین خیلی مفید هست. من یک سری داده ها از تست دارم وبا روش smoothingspline در محیط editor متلب کد مربوط اش رو نوشتم، اما وقتی اعداد منحنی رو چک میکنم با p، default خودش (p = 0.5190) منحنی را رسم میکند. چگونه میتوان با p = 0.6402 منحنی را رسم کرد. سپاس
سلام و عرض ادب
خیلی ممنون از شما.
برای تغییر پارامترهای پیشفرض توابع متلب باید از هندل ها استفاده کنید. در واقع با فراخوانی تابع بصورت خاص، این امکان وجود داره ک هر پارامتری رو تغییر بدیم. به راهنما (Help) متلب مراجعه کنید و سینتکس فراخوانی پیشرفته توابع (هر تابعی رو که دوست دارید مثل همین smoothingspline) رو ببینید.
موفق باشید.
سلام. وقتتون بخیر. ممنون بابت مطالب عالیتون. یه سوالی داشتم من یه تعداد داده دارم و یه فرمول میخوام برای نمودار اون داده ها فرمول رو فیت کنم و باید بعضی پارامتر های اون فرمول رو پیدا کنم. ممنون میشم راهنماییم کنید.
سلام و عرض ادب
خیلی خوشحالیم که از مطالب ارائه شده راضی بودید.
پاسخ سوالتون دقیقا میشه همین جلسهای که توش هستیم.
چند روش برای بدست آوردن ضرایب ارائه شده که میتونید مطالعه کنید. اگر درباره هر روش ابهام یا سوالی داشتید در خدمتیم.
ممنون از پاسختون ولی من فرمول رو دارم خودم . فقط میخوام ضرایب اون فرمول رو با توجه به داده هام پیدا کنم.
سلام مجدد
خب این مورد هم در انواع گفته شده وجود داره. چک کنید.
سلام و وقت بخير
تشكر براي مطالب خوبي كه در اختيار علاقمندان ميگذاريد. يك سوال داشتم براي پيدا كردن بهترين تابع توزيع يك سري داده، آيا برنامه متلب دستور و يا روشي دارد؟ منظورم فرم توزيع هست مثل توزيع نرمال يا گاما …
سلام و عرض ادب
مواردی که در همین جلسه گفته شده جواب سوالتون هست. میتونید روشهای گفته شده رو روی دادههاتون امتحان کنید تا ببینید بهترین تطابق رو با چه تابعی داره.
موفق باشید.
سلام، خسته نباشید.
من دادههام رو با استفاده از cftool فیت کردم ولی میخواستم مقادیر Y دادهها رو استخراج کنم تا بتوانم نمودار رو را توی Origin Pro رسم کنم. آیا راهی هست که بتونیم مقادیر Y نمودار برازش شده رو به ازای x های دلخواه استخراج کنیم؟
سلام و عرض ادب
برای بدست آوردن مقادیر Y بایستی مقادیر x دلخواه رو بعنوان ورودی به تابع برازش شده بدید. تابع برازش شده در ابزار cftool نمایش داده میشه که میتونید اون رو در محیط Command Window بصورت تابع تعریف کرده و مقداردهی کنید.
موفق باشید.