Matlab线性拟合和非线性拟合

线性拟合

已知如下图像的x,y坐标,x = [1.0, 1.5, 2.0, 2.5, 3.0],y = [0.9, 1.7, 2.2, 2.6, 3.0],如何用一条直线去拟合下列散点?

代码:

x = [1.0, 1.5, 2.0, 2.5, 3.0]';
y = [0.9, 1.7, 2.2, 2.6, 3.0]';
a = polyfit(x,y,1)  % a会返回两个值,[斜率,x=0时y的值]
xi = 1:0.1:3;
yi = polyval(a,xi);
plot(x,y,'o',xi,yi);

拟合后的图像如下:

非线性拟合

普通非线性拟合:已知如下图像的x,y坐标,x = [1.0, 1.5, 2.0, 2.5, 3.0],y = [0.9, 1.7, 2.2, 2.6, 3.0],如何用一条曲线a*x+b*sin(x)+c去拟合下列散点?

代码:

x = [1.0, 1.5, 2.0, 2.5, 3.0]';
y = [0.9, 1.7, 2.2, 2.6, 3.0]';
p = fittype('a*x+b*sin(x)+c');
f = fit(x,y,p)   % f会返回a,b,c的值
plot(f,x,y);

指数非线性拟合:如何拟合1790-1900年美国人口指数增长模型

思路:

实现代码:

t = 1790:10:1900;
p = [3.9 5.3 7.2 9.6 ...
    12.9 17.1 23.2 31.4 ...
    38.6 50.2 62.9 76.0];
Y = log(p); % Y = log(p) 返回数组p中每个元素的自然对数ln(x)
X = t;
a = polyfit(X,Y,1)
x0 = exp(a(2)); r = a(1);
ti = 1790:1900;
pti= x0*exp(r*ti);
plot(t,p,'o',ti,pti,'m')
xlabel('Year')
ylabel('Population')

对数形式的非线性拟合:

%% 对数形式非线性回归
x = [1.5, 4.5, 7.5,10.5,13.5,16.5,19.5,22.5,25.5];
y = [7.0,4.8,3.6,3.1,2.7,2.5,2.4,2.3,2.2];
plot(x, y, '*', 'linewidth', 1) % 这里的linewidth指的是散点大小
m1 = @(b,x) b(1) + b(2)*log(x);
nonlinfit1 = fitnlm(x,y,m1,[0.01;0.01])
b = nonlinfit1.Coefficients.Estimate;
Y1 = b(1,1) + b(2,1)*log(x);
hold on 
plot(x, Y1, '--k', 'linewidth',2)

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页