曲线拟合,即以一条函数曲线去逼近已知测量数据点的过程,考察化学理论值和实验数据之间的吻合程度。一般地,光谱曲线、伏安曲线、色谱曲线等均可以用多项式函数拟合。
设有N组测量数据点(xi,yi)(i=1,2,···,N),可以用一个m阶多项式进行表示:
式中,bj为拟合系数,N组数据点按照上述多项式可组成N个方程,改写成矩阵形式如下:
记作:
由前文知,B的最小二乘解为:
则拟合函数值计算如下:
一般在利用多项式进行拟合时,均需要计算其拟合优度R,下面直接贴代码。
Matlab:
function [dy,R] = Polynomial_fitting( x_data,y_data,m )
%POLYNOMIAL_FITTING 多项式拟合
%Input: x_data-原始波长数据
% y_data-原始吸光度值,与波长一一对应
% m-拟合阶数
%Output:xy_data-拟合数据
X=zeros(size(x_data,2),m+1);%原始波长数据矩阵
for i=1:size(x_data,2)
for j=1:m+1
X(i,j)=power(x_data(i),j-1);
end
end
%拟合系数
B=(X'*X)^-1*X*y_data;
% D=X*inv(X'*X)*X';
xy_data=X*B*y_data;
dy=xy_data-y_data';
%%拟合度计算
a1=0;
a2=0;
a3=0;
for i=1:size(x_data,2)
a1=a1+(xy_data(i)-mean(xy_data))*(y_data(i)-mean(y_data));
a2=a2+(xy_data(i)-mean(xy_data))^2;
a3=a3+(y_data(i)-mean(y_data))^2;
end
R=a1/sqrt(a2*a3);
end
Java:
public static RealMatrix polynomial_fitting(double[] x,double[] y,int m) {
RealMatrix X = MatrixUtils.createRealMatrix(x.length,m+1);
for (int i = 0; i < x.length; i++) {
for (int j = 0; j < m+1; j++) {
X.setEntry(i, j, Math.pow(x[i],j));
}
}
RealMatrix D = X.multiply(MatrixAlgorithm.inverseMatrix
(X.transpose().multiply(X))).multiply(X.transpose());
RealMatrix y_niheMatrix = D.multiply(MatrixUtils.createColumnRealMatrix(y));
//拟合dy
double[] dy = new double[x.length];
double[] y_nihe = y_niheMatrix.getColumn(0);
for (int i = 0; i < dy.length; i++) {
dy[i] = y_nihe[i]-y[i];
}
//拟合度计算
double a1=0,a2=0,a3=0;
for (int i = 0; i < dy.length; i++) {
a1=a1+(y_nihe[i]-MatrixAlgorithm.meanCol(y_niheMatrix).getEntry(0,0))*(y[i]-
MatrixAlgorithm.meanCol(MatrixUtils.
createColumnRealMatrix(y)).getEntry(0, 0));
a2 = a2 + Math.pow((y_nihe[i]-MatrixAlgorithm.
meanCol(y_niheMatrix).getEntry(0,0)), 2);
a3 = a3 + Math.pow((y[i]-MatrixAlgorithm.meanCol(
MatrixUtils.createColumnRealMatrix(y)).getEntry(0, 0)), 2);
}
double R = a1/Math.sqrt(a2*a3);
return X;
}
——参考《化学计量学方法及MATLAB实现》史永刚等编著