使用Matlab进行拟合是图像处理中线条变换的一个重点内容,本文将详解Matlab中的直线拟合和曲线拟合用法。
关键函数:
fittype
Fit type for curve and surface fitting
Syntax
ffun = fittype(libname)
ffun = fittype(expr)
ffun = fittype({expr1,...,exprn})
ffun = fittype(expr, Name, Value,...)
ffun= fittype({expr1,...,exprn}, Name, Value,...)
/***********************************线性拟合***********************************/
线性拟合公式:
- coeff1 * term1 + coeff2 * term2 + coeff3 * term3 + ...
复制代码 其中,coefficient是系数,term都是x的一次项。
线性拟合Example:
Example1: y=kx+b;
法1:
- x=[1,1.5,2,2.5,3];y=[0.9,1.7,2.2,2.6,3];
- p=polyfit(x,y,1);
- x1=linspace(min(x),max(x));
- y1=polyval(p,x1);
- plot(x,y,"*",x1,y1);
复制代码 结果:p = 1.0200 0.0400
即y=1.0200 *x+ 0.0400
法2:
- x=[1;1.5;2;2.5;3];y=[0.9;1.7;2.2;2.6;3];
- p=fittype("poly1")
- f=fit(x,y,p)
- plot(f,x,y);
复制代码 运行结果:
- x=[1;1.5;2;2.5;3];y=[0.9;1.7;2.2;2.6;3];
- p=fittype("poly1")
- f=fit(x,y,p)
- plot(f,x,y);
- p =
- Linear model Poly1:
- p(p1,p2,x) = p1*x + p2
- f =
- Linear model Poly1:
- f(x) = p1*x + p2
- Coefficients (with 95% confidence bounds):
- p1 = 1.02 (0.7192, 1.321)
- p2 = 0.04 (-0.5981, 0.6781)
复制代码
Example2:y=a*x + b*sin(x) + c
法1:
- x=[1;1.5;2;2.5;3];y=[0.9;1.7;2.2;2.6;3];
- EXPR = {"x","sin(x)","1"};
- p=fittype(EXPR)
- f=fit(x,y,p)
- plot(f,x,y);
复制代码
运行结果:
- x=[1;1.5;2;2.5;3];y=[0.9;1.7;2.2;2.6;3];
- EXPR = {"x","sin(x)","1"};
- p=fittype(EXPR)
- f=fit(x,y,p)
- plot(f,x,y);
- p =
- Linear model:
- p(a,b,c,x) = a*x + b*sin(x) + c
- f =
- Linear model:
- f(x) = a*x + b*sin(x) + c
- Coefficients (with 95% confidence bounds):
- a = 1.249 (0.9856, 1.512)
- b = 0.6357 (0.03185, 1.24)
- c = -0.8611 (-1.773, 0.05094)
复制代码
法2:
- x=[1;1.5;2;2.5;3];y=[0.9;1.7;2.2;2.6;3];
- p=fittype("a*x+b*sin(x)+c","independent","x")
- f=fit(x,y,p)
- plot(f,x,y);
复制代码
运行结果:
- x=[1;1.5;2;2.5;3];y=[0.9;1.7;2.2;2.6;3];
- p=fittype("a*x+b*sin(x)+c","independent","x")
- f=fit(x,y,p)
- plot(f,x,y);
- p =
- General model:
- p(a,b,c,x) = a*x+b*sin(x)+c
- Warning: Start point not provided, choosing random start
- point.
- > In fit>iCreateWarningFunction/nThrowWarning at 738
- In fit>iFit at 320
- In fit at 109
- f =
- General model:
- f(x) = a*x+b*sin(x)+c
- Coefficients (with 95% confidence bounds):
- a = 1.249 (0.9856, 1.512)
- b = 0.6357 (0.03185, 1.24)
- c = -0.8611 (-1.773, 0.05094)
复制代码
/***********************************非线性拟合***********************************/
Example:y=a*x^2+b*x+c
法1:
- x=[1;1.5;2;2.5;3];y=[0.9;1.7;2.2;2.6;3];
- p=fittype("a*x.^2+b*x+c","independent","x")
- f=fit(x,y,p)
- plot(f,x,y);
复制代码
运行结果:
- p =
- General model:
- p(a,b,c,x) = a*x.^2+b*x+c
- Warning: Start point not provided, choosing random start
- point.
- > In fit>iCreateWarningFunction/nThrowWarning at 738
- In fit>iFit at 320
- In fit at 109
- f =
- General model:
- f(x) = a*x.^2+b*x+c
- Coefficients (with 95% confidence bounds):
- a = -0.2571 (-0.5681, 0.05386)
- b = 2.049 (0.791, 3.306)
- c = -0.86 (-2.016, 0.2964)
复制代码
法2:
- x=[1;1.5;2;2.5;3];y=[0.9;1.7;2.2;2.6;3];
- %use c=0;
- c=0;
- p1=fittype(@(a,b,x) a*x.^2+b*x+c)
- f1=fit(x,y,p1)
- %use c=1;
- c=1;
- p2=fittype(@(a,b,x) a*x.^2+b*x+c)
- f2=fit(x,y,p2)
- %predict c
- p3=fittype(@(a,b,c,x) a*x.^2+b*x+c)
- f3=fit(x,y,p3)
- %show results
- scatter(x,y);%scatter point
- c1=plot(f1,"b:*");%blue
- hold on
- plot(f2,"g:+");%green
- hold on
- plot(f3,"m:*");%purple
- hold off
复制代码
|