信号分析——曲线拟合(多项式非线性拟合Java/Matlab)

曲线拟合,即以一条函数曲线去逼近已知测量数据点的过程,考察化学理论值和实验数据之间的吻合程度。一般地,光谱曲线、伏安曲线、色谱曲线等均可以用多项式函数拟合。

设有N组测量数据点(xi,yi)(i=1,2,···,N),可以用一个m阶多项式进行表示:

式中,bj为拟合系数,N组数据点按照上述多项式可组成N个方程,改写成矩阵形式如下:

信号分析——曲线拟合(多项式非线性拟合Java/Matlab)_第1张图片

记作:

由前文知,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实现》史永刚等编著

你可能感兴趣的:(Java,Matlab,算法)