MATLAB——多元非线性函数拟合

一、regress函数

X=[1 13 1.5; 1.4 19 3; 1.8 25 1; 2.2 10 2.5;2.6 16 0.5; 3 22 2; 3.4 28 3.5; 3.5 30 3.7];
Y=[0.330; 0.336; 0.294; 0.476; 0.209; 0.451; 0.482; 0.5];
% X自变量,数据(N, D);Y因变量,数据(N, 1)
X1=[ones(length(X(:, 1)), 1), X];
[beta, bint, r, rint, states]=regress(Y, X1)
% 多元线性回归
% y=beta(1)+beta(2)*x1+beta(3)*x2+beta(4)*x3+...
% beta—系数估计
% bint—系数估计的上下置信界
% r—残差
% rint—诊断异常值的区间
% states—模型统计信息
rcoplot(r, rint)
saveas(gcf,sprintf('线性曲线拟合_残差图.jpg'),'bmp');

二、nlinfit函数

X=[1 13 1.5; 1.4 19 3; 1.8 25 1; 2.2 10 2.5;2.6 16 0.5; 3 22 2; 3.4 28 3.5; 3.5 30 3.7];
Y=[0.330; 0.336; 0.294; 0.476; 0.209; 0.451; 0.482; 0.5];
% X自变量,数据(N, D);Y因变量,数据(N, 1)
beta0=ones(8, 1);
% 初始值的选取可能会导致结果具有较大的误差。
[beta, r, J]=nlinfit(X, Y, @modelfun, beta0)
% 非线性回归
% beta—系数估计
% r—残差
% J—雅可比矩阵
[Ypred,delta]=nlpredci(@modelfun, X, beta, r, 'Jacobian', J)
% 非线性回归预测置信区间
% Ypred—预测响应
% delta—置信区间半角
plot(X(:, 1), Y, 'k.', X(:, 1), Ypred, 'r');
saveas(gcf,sprintf('非线性曲线拟合_1.jpg'),'bmp');

function yy=modelfun(b,x)
    %自定义拟合函数
    yy=b(1) + b(2).*x(:,2) + b(3).*x(:,3) + b(4).*x(:,2).^2 + b(5).*x(:,3).^2 + b(6).*x(:,1).^0.5 + b(7).*x(:,2).^0.5 + b(8).*x(:,3).^0.5;
end

三、lsqcurvefit函数

X=[1 13 1.5; 1.4 19 3; 1.8 25 1; 2.2 10 2.5;2.6 16 0.5; 3 22 2; 3.4 28 3.5; 3.5 30 3.7];
Y=[0.330; 0.336; 0.294; 0.476; 0.209; 0.451; 0.482; 0.5];
% X自变量,数据(N, D);Y因变量,数据(N, 1)
beta0=ones(8, 1);
% 初始值的选取可能会导致结果具有较大的误差。
[beta,resnorm,r, ~, ~, ~, J]=lsqcurvefit(@modelfun,beta0,X,Y)
% 在最小二乘意义上解决非线性曲线拟合(数据拟合)问题
% beta—系数估计
% resnorm—残差的平方范数 sum((fun(x,xdata)-ydata).^2)
% r—残差 r=fun(x,xdata)-ydata
% J—雅可比矩阵
[Ypred,delta]=nlpredci(@modelfun, X, beta, r, 'Jacobian', J)
plot(X(:, 1), Y, 'k.', X(:, 1), Ypred, 'r');
saveas(gcf,sprintf('非线性曲线拟合_2.jpg'),'bmp');

function yy=modelfun(b,x)
    %自定义拟合函数
    yy=b(1) + b(2).*x(:,2) + b(3).*x(:,3) + b(4).*x(:,2).^2 + b(5).*x(:,3).^2 + b(6).*x(:,1).^0.5 + b(7).*x(:,2).^0.5 + b(8).*x(:,3).^0.5;
end

猜你喜欢

转载自blog.csdn.net/Ronko_G/article/details/132457111