matlab含有变上限积分参数的非线性回归

从一个例子出发

已知数据

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]

散点图为
matlab含有变上限积分参数的非线性回归_第1张图片
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

使用fitnlm函数

函数的用法可以具体参考:
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

最后的结果:matlab含有变上限积分参数的非线性回归_第2张图片
nlm1的结果为:

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

你可能感兴趣的:(matlab含有变上限积分参数的非线性回归)