提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
自学数据拟合,应用nlinfit,出现解处的 Jacobian 矩阵为病态或者秩亏。
一、数据
读入表格数据,第一列和第二列为自变量,第三列为目标值。
188.8383 | 188.8191 | 0 |
188.8383 | 188.8158 | 0 |
188.8355 | 188.8152 | 0 |
188.8355 | 188.8125 | 0 |
188.8388 | 188.8119 | 0 |
188.8355 | 188.8119 | 0 |
188.835 | 188.8059 | 0 |
188.8322 | 188.8059 | 0 |
188.8284 | 188.8053 | 0 |
188.8289 | 188.8026 | 0 |
197.024 | 196.9278 | 0 |
197.024 | 196.9313 | 0 |
197.0206 | 196.9315 | 0 |
197.024 | 196.9313 | 0 |
197.0206 | 196.9313 | 0 |
197.0241 | 196.9278 | 0 |
197.024 | 196.9281 | 0 |
197.024 | 196.9278 | 0 |
197.024 | 196.9278 | 0 |
197.024 | 196.9244 | 0 |
182.5096 | 182.381 | 0 |
182.5096 | 182.3758 | 0 |
182.5159 | 182.3968 | 0 |
182.5191 | 182.3873 | 0 |
182.5223 | 182.4032 | 0 |
182.5255 | 182.3981 | 0 |
182.5287 | 182.3917 | 0 |
182.5318 | 182.3937 | 0 |
182.535 | 182.3917 | 0 |
182.5382 | 182.4013 | 0 |
二、代码
代码如下
clc;clear;close all;
%% data1-H4348070 Sheet1原始线性数据17个,Sheet2原始零点数据30 Sheet3 原始零点+个线性数据
datatable = xlsread('data1', 'sheet2','A:C'); % 读取Excel表格数据,--必须在运行目录
%% 选择零点
x0=1:30;
x1=datatable(:,1);%对应c1
x2=datatable(:,2);%对应c2
x=[x1,x2];
x3=datatable(:,3);%对应标准压力百分比
y=2*(x1-x2)./(x1+x2); %压力计算公式
%% 非线性回归
beta0=[0.01;0.05;1;2];
[beta,r,J] = nlinfit(x,x3, 'bian', beta0);
%显示回归系数
fprintf('回归系数为:\nb(1)=%.4f\nb(2)=%.4f\nb(3)=%.4f\nb(4)=%.4f\n', beta);
%预测
[Ypred,delta]=nlpredci('bian', x, beta, r, 'Jacobian', J);%Ypred预测值,dalta预测区间
三、问题
出现问题如下
3.1 警告: 解处的 Jacobian 矩阵为病态,而且某些模型参数的估计值可能不准确(不可识别)。进行预测时要谨慎。
> 位置:nlinfit (第 384 行)
位置: nihe0 (第 15 行)
此时 beta0=[0.01;0.05;1;2];
3.2警告: 秩亏,秩 = 3,tol = 9.944571e-15。
> 位置:nlinfit>LMfit (第 587 行)
位置: nlinfit (第 284 行)
位置: nihe0 (第 16 行)
警告: Jacobian 的某些列在解处实际上为零,表明模型对它的某些参数不敏感。这可能是由于这些参数不在模型中或者不影响预测值造成的。也可能是由于模型函数中的数值下溢造成的,这种情况有时可以通过选择更合适的初始参数值或者通过重新调整尺度或调整中心位置来避免。参数估计值可能不可靠。
此时beta0=[0.1; 0.2;0.1;0.2];
总结
不确定其初值原则,怎么定初值?迷惑?不同初始值,回归系数也不同
有人说是预期值附近选值就可,有人直接写入1;
也有人提议:但初始值选择实际是有一定的难度,一般方法也是最有效的方法,用随机函数rand()来初定初始值,看相关系数是否接近于1,如不行,再调整初始值,rand()*某个数的倍数,再拟合,或作图看原始点是否在拟合曲线附近,直到相关系数接近于1,结束拟合
也不知哪位高手能指点下,到底怎么取值。