已知数据
y=[1.2 1.5 1.8 2.2 2.7 3.6 4.16 4.79 5.26 5.64 10.5 11.1 11.6 11.7 26.9 41.2 ]
x=[1.5 1.8 2.1 2.5 3 3.8 4.7 5.3 5.8 6.1 14.1 16.2 18.6 19.3 36.1 60.5]
散点图为
x、y满足的关系为:
y ( x ) = ∫ 0 x a d x 1 + b / x \ y(x)=\int_0^x \frac{adx} {1+b/x} y(x)=∫0x1+b/xadx
函数的用法可以具体参考:
https://ww2.mathworks.cn/help/stats/fitnlm.html?requestedDomain=cn
这里使用:
mdl = fitnlm(x,y,modelfun,beta0)形式
其中modelfun是函数句柄,也就是我们需要自己定义的y与x之间的关系
这里使用function形式,也可以单独保存为一个.m文件
function y=myfun(p,x)
N=size(x,1); %传入进来的是x向量
y=zeros(N,1); %需要计算每一个y分量
Nn=1e5; %自定义积分间隔,相当于把积分形式化为求和
Mn=1/Nn;
for i=1:N
for j=1:(x(i)*Nn)
y(i)=y(i)+p(1)*Mn/(1+p(2)/(Mn*j)); %求和代替积分
end
end
end
beta0是给定的初始值。
beta0=[0.5,0]; %自己选定的,或者说自己猜的
nlm1=fitnlm(x,y,@myfun,beta0); %注意@不要忘了
完整程序:
y=[1.2 1.5 1.8 2.2 2.7 3.6 4.16 4.79 5.26 5.64 10.5 11.1 11.6 11.7 26.9 41.2 ];
x=[1.5 1.8 2.1 2.5 3 3.8 4.7 5.3 5.8 6.1 14.1 16.2 18.6 19.3 36.1 60.5]
plot(x,y,'-o')
ylim([0,50])
xlim([0,70])
xlabel('x','FontSize',20)
ylabel('y','FontSize',20)
hold on
beta0=[0.5,0];
nlm1=fitnlm(x,y,@myfun,beta0);
ynew=nlm1.predict(x);
plot(x,ynew)
function y=myfun(p,x)
N=size(x,1); %传入进来的是x向量
y=zeros(N,1); %需要计算每一个y分量
Nn=1e5; %自定义积分间隔,相当于把积分形式化为求和
Mn=1/Nn;
for i=1:N
for j=1:(x(i)*Nn)
y(i)=y(i)+p(1)*Mn/(1+p(2)/(Mn*j)); %求和代替积分
end
end
end
nlm1 =
Nonlinear regression model:
y ~ myfun(b,X)
Estimated Coefficients:
Estimate SE tStat pValue
________ __________ __________ __________
b1 0.6704 0.015457 43.371 2.5239e-16
b2 -0.10095 6.8484e-07 -1.474e+05 9.6578e-66
Number of observations: 16, Error degrees of freedom: 14
Root Mean Squared Error: 0.955
R-Squared: 0.993, Adjusted R-Squared 0.992
F-statistic vs. zero model: 1.67e+03, p-value = 2.21e-17