非线性模型参数估计

1常见模型

1.1指数模型估计

指数模型数学表达式:

两边取对数,化为线性形式:

%%非线性回归,指数模型
x=[0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5];
y=[26300,25100,19900,15500,11500,9800,5200,4600,3200,2300,1700,1200,900,700,600,500];
plot(x,y,'r.');  %%绘制散点图
xlabel('Distance');
ylabel('Average density');
hold on
X=[ones(length(y),1),x'];  %%自变量矩阵
Y=log(y'); %%因变量向量
[B,Bint,E,Eint,Stats]=regress(Y,X);  %%回归分析
R2=Stats(1);  %%拟合优度
a=exp(B(1));  %%模型
b=-B(2);  %%回归系数
f=a*exp(-b*x);  %%模型表达式
plot(x,f,'b-');  %%添加趋势线
hold off
s=sqrt(sumsqr(y-f)/(length(f)-2));  %%计算标准误差
a,b,R2,s  %%输出主要变量的计算结果

 

指数模型拟合

%%非线性回归,指数模型
x=[0.5,1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5,10.5,11.5,12.5,13.5,14.5,15.5];
y=[26300,25100,19900,15500,11500,9800,5200,4600,3200,2300,1700,1200,900,700,600,500];
plot(x,y,'r.');  %%绘制散点图
xlabel('Distance');
ylabel('Average density');
hold on
beta0=[0,0];  %%设定迭代的初始值
Option=statset('MaxIter',200);  %%设定最大迭代次数
[B,E,J]=nlinfit(x,y,'myfun',beta0,Option); %%非线性拟合
a=B(1);  %%模型常数
b=-B(2); %%回归系数
f=a*exp(-b*x);  %%模型表达式
plot(x,f,'b-');
hold off
s=sqrt(sumsqr(y-f)/(length(f)-2));  %%计算标准误差
a,b,s  %%输出主要变量结果
创建myfun.m文件如下,然后将其保存到工作路径下
%%指数模型的拟合
%%myfun.m
function yhat = myfun(beta,x)
b1=beta(1);
b2=beta(2);
yhat = b1*exp(b2*x);
%%以上模型通过编辑窗口保存在Matlab的worck文件夹中

执行结果如下:

  

1.2对数模型

对数模型的数学表达式:

%%对数模型的线性回归
x=[100.6,103.5,231.3,120.4,230.4,233.3,162.7,236.3,158.7,145.2,207.0,203.3,433.5,372.9,525.3,629.2,963.4,608.8,876.7,832.0,...
    703.1,872.6,2196.2,2422.4,2230.5,1117.1,2558.6,1190.0,1750.2,3710.0,6050.0,5760.0,4460.0,6618.2,6272.8,3840.0,6926.3,3580.0,5817.2,6610.0];
y=[2.6,4.0,6.7,8.9,10.2,12.6,13.6,18.0,21.0,22.0,26.1,28.0,31.0,32.0,34.0,36.4,38.6,40.8,43.0,43.5,...
    46.4,48.0,50.0,52.7,53.3,59.0,60.1,62.0,63.4,67.0,69.0,70.0,72.0,74.0,76.0,78.0,80.7,82.0,86.4,88.0];
plot(x,y,'r.');  %%绘制散点图
xlabel('Per capita income');  %%横轴标签
ylabel('Percent Urban');  %%纵轴标签
hold on
X=[ones(length(y),1),log(x')];   %%自变量矩阵
Y=y';   %%因变量矩阵
[B,Bint,E,Eint,Stats]=regress(Y,X);  %%回归分析
R2=Stats(1);   %%拟合优度
a=B(1);   %%模型常数
b=B(2);  %%回归系数
f=a+b*log(x);  %%模型表达式
s=sqrt(sumsqr(y-f)/(length(f)-2));   %%计算标准误差
f=a+b*log(sort(x));    %%模型表达式
plot(sort(x),f,'b-');   %%添加趋势线
hold off
a,b,R2,s   %%输出主要结果
x=sort(x);  %%自变量排序

执行结果:

    

对数模型的非线性拟合

%%对数模型的非线性拟合

x=[100.6,103.5,231.3,120.4,230.4,233.3,162.7,236.3,158.7,145.2,207.0,203.3,433.5,372.9,525.3,629.2,963.4,608.8,876.7,832.0,...
    703.1,872.6,2196.2,2422.4,2230.5,1117.1,2558.6,1190.0,1750.2,3710.0,6050.0,5760.0,4460.0,6618.2,6272.8,3840.0,6926.3,3580.0,5817.2,6610.0];
y=[2.6,4.0,6.7,8.9,10.2,12.6,13.6,18.0,21.0,22.0,26.1,28.0,31.0,32.0,34.0,36.4,38.6,40.8,43.0,43.5,...
    46.4,48.0,50.0,52.7,53.3,59.0,60.1,62.0,63.4,67.0,69.0,70.0,72.0,74.0,76.0,78.0,80.7,82.0,86.4,88.0];
plot(x,y,'r.');  %%绘制散点图
xlabel('Per capita income');  %%横轴标签
ylabel('Percent Urban');  %%纵轴标签
hold on
beta0=[0 0];  %%设定迭代初始值
O=statset('MaxIter',200);   %%设定最大迭代次数
[B,E,J]=nlinfit(x,y,'myfun',beta0,O);  %%非线性拟合
a=B(1);   %%模型常数
b=B(2);  %%回归系数
f=a+b*log(x);  %%模型表达式
s=sqrt(sumsqr(y-f)/(length(f)-2));   %%计算标准误差
f=a+b*log(sort(x));    %%模型表达式
plot(sort(x),f,'b-');   %%添加趋势线
hold off
a,b,s  %%输出主要结果

%%myfun.m
function yhat=myfun(beta,x)
b1=beta(1);
b2=beta(2);
yhat=b1+b2*log(x);
%%以上函数模型另存为.m文件

执行结果:

      


1.3 幂指数模型

指数模型数学表达式:

x=[3.48,3.69,1.43,2.05,3.05,3.19,2.43,2.40,2.72,2.99,3.78,1.33,1.67,3.14,2.04,1.77,0.59,0.69,0.50,0.69,0.63,0.58,0.86,0.41,1.23];
y=[38.83,43.92,9.14,16.66,36.16,38.66,17.74,19.46,23.00,29.75,51.19,6.60,9.04,33.27,17.61,13.37,2.04,2.22,1.46,1.92,1.86,1.69,3.31,1.13,6.74];
plot(x,y,'r.');  %%绘制散点图
xlabel('Perimeter');  %%横轴标签
ylabel('Area');  %%纵轴标签
hold on
X=[ones(length(y),1),log(x')];  %%自变量矩阵
Y=log(y');   %%因变量向量
[B,Bint,E,Eint,Stats]=regress(Y,X);   %%回归分析
R2=Stats(1);  %%拟合优度
a=exp(B(1));   %%模型常数
b=B(2);  %%回归系数
f=a*x.^b;  %%模型表达式
s=sqrt(sumsqr(y-f)/(length(f)-2));   %%计算标准误差
f=a*(sort(x)).^b;    %%模型表达式
plot(sort(x),f,'b-');   %%添加趋势线
hold off
a,b,R2,s  %%输出主要结果

执行结果:

      

幂指数模型的非线性拟合

x=[3.48,3.69,1.43,2.05,3.05,3.19,2.43,2.40,2.72,2.99,3.78,1.33,1.67,3.14,2.04,1.77,0.59,0.69,0.50,0.69,0.63,0.58,0.86,0.41,1.23];
y=[38.83,43.92,9.14,16.66,36.16,38.66,17.74,19.46,23.00,29.75,51.19,6.60,9.04,33.27,17.61,13.37,2.04,2.22,1.46,1.92,1.86,1.69,3.31,1.13,6.74];
plot(x,y,'r.');  %%绘制散点图
xlabel('Perimeter');  %%横轴标签
ylabel('Area');  %%纵轴标签
hold on
beta0=[0 0];   %%设定迭代初始值
O=statset('MaxIter',200);  %%设定最大迭代次数
[B,E,J]=nlinfit(x,y,'myfun',beta0,O);  %%非线性拟合
a=B(1);   %%模型常数
b=B(2);  %%回归系数
f=a*x.^b;  %%模型表达式
s=sqrt(sumsqr(y-f)/(length(f)-2));   %%计算标准误差
f=a*(sort(x)).^b;    %%模型表达式
plot(sort(x),f,'b-');   %%添加趋势线
hold off
a,b,s  %%输出主要结果

%%myfun.m
function yhat=myfun(beta,x)
b1=beta(1);
b2=beta(2);
yhat=b1*x.^b2;
%%以上函数模型另存为.m文件

执行结果:

     

1.4 多项式模型

n阶多项式函数形式如下:

x=[3.4,1.8,4.6,2.3,3.1,5.5,0.7,3.0,2.6,4.3,2.1,1.1,6.1,4.8,3.8];
y=[26.2,17.8,31.3,23.1,27.5,36.0,14.1,22.3,19.6,31.3,24.0,17.3,43.2,36.4,26.1];
plot(x,y,'r.');  %%绘制散点图
xlabel('Distance');  %%横轴标签
ylabel('Loss');  %%纵轴标签
hold on
X=[ones(length(y),1),x',x'.^2];   %%自变量矩阵
Y=y';   %%因变量矩阵
[B,Bint,E,Eint,Stats]=regress(Y,X);  %%回归分析
R2=Stats(1);    %%拟合优度
f=B(1)+B(2)*x+B(3)*x.^2;  %%模型表达式
s=sqrt(sumsqr(y-f)/(length(f)-3));   %%计算标准误差
x=sort(x);    %%自变量排序
f=B(1)+B(2)*x+B(3)*x.^2;  %%模型表达式
plot(x,f,'b-');   %%添加趋势线
hold off
B,R2,s  %%输出主要结果

执行结果:

      

多项式拟合:

x=[3.4,1.8,4.6,2.3,3.1,5.5,0.7,3.0,2.6,4.3,2.1,1.1,6.1,4.8,3.8];
y=[26.2,17.8,31.3,23.1,27.5,36.0,14.1,22.3,19.6,31.3,24.0,17.3,43.2,36.4,26.1];
plot(x,y,'r.');  %%绘制散点图
xlabel('Distance');  %%横轴标签
ylabel('Loss');  %%纵轴标签
hold on
N=2;   %%确定多项式拟合阶数
[P,S]=polyfit(x,y,N);   %%N阶多项式拟合
lx=linspace(min(x),max(x));  %%限定趋势线的长度范围
z=polyval(P,lx);    %%计算分割点处多项式的值
plot(lx,z,'b-');   %%添加趋势线
hold off
e=y-polyval(P,x);  %%计算残差
s=sqrt(sumsqr(e)/(length(y)-N-1));   %%计算标准误差
P,s,e  %%输出主要结果

执行结果:

 


参考文献:陈彦光.2012.基于Matlab的地理数据分析.高等教育出版社

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值