⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fit.java

📁 用Java开发的实用数学建模程序 简单易懂 初学者可以用来学习java知识
💻 JAVA
字号:
/*
 *@(#)Fit.java 2.0 2005/04/30
 *
 *清华大学 精密仪器与机械学系
 *范灿升 fancansheng@163.com
 */

package algorithm;

import algorithm.LinearEquation;

/**
 *这个类是数据拟合所需用到的类,包括一元线性回归、多项式回归、多元线性回归、三次样条插值等。
 *@version	2.0, 2005/04/30
 *@author	范灿升
 *@see	Modeling
 *@see	input.FitInput
 */

public class Fit
{
	private double[][] xMatrix;
	private double[] yMatrix;
	private double[] coef;//回归系数
	private double[] yExpected;//y的期望值
	private double yAverage;
	private int n;//自变量个数
	private int m;//数据组数
	private double u;//回归平方和
	private double lyy;//总离差平方和
	
	/**
	 *构造拟合与插值类。
	 *@param	xMatrix		自变量数据对应的矩阵,这个矩阵在Fit类中产生克隆副本,Fit的成员方法不会对该矩阵生产影响。
	 *@param	yMatrix		因变量数据对应的矩阵,这个矩阵在Fit类中产生克隆副本,Fit的成员方法不会对该矩阵生产影响。
	 */
	public Fit(double[][] xMatrix,double[] yMatrix)
	{
		this.xMatrix=(double[][])xMatrix.clone();
		this.yMatrix=(double[])yMatrix.clone();
		m=yMatrix.length;
		n=xMatrix[0].length-1;//xMatrix的第一列为1
	}
	
	/**
	 *多元线性回归。
	 *@return	double[]类的实例,它的成员域length为n+2,其中前n+1个元素为回归方程中的系数A0、A1、A2……An。
	 *最后一个元素为相关系数,它越接近1,表示回归效果越显著。
	 *<p>如果数据错误以致生成的线性方程组无解则返回null。
	 */
	public double[] multiFit()
	{
		double[] result=new double[n+2];
		double[][] equationCoefficients;
		double[] equationConstants;
		int i;
		try
		{
			equationCoefficients=Matrix.product(Matrix.transpose(xMatrix),xMatrix);
			equationConstants=Matrix.product(Matrix.transpose(xMatrix),yMatrix);
			coef=new LinearEquation(equationCoefficients,equationConstants).solve();
			for(i=0;i<coef.length;i++)
				result[i]=coef[i];
			result[n+1]=rCoefficent();
			return result;
		}
		catch(NullPointerException e)
		{
			return null;
		}
		//矩阵变换和解方程时可能产生很多null
	}
	
	/**
	 *计算相关系数。
	 *@return	回归分析的相关系数
	 */
	public double rCoefficent()
	{
		yAverage=0;
		int i,j;
		yExpected=new double[m];
		for(i=0;i<m;i++)
		{
			yAverage+=yMatrix[i];
			yExpected[i]=0;
		}
		yAverage/=m;
		
		for(i=0;i<m;i++)
		{
			for(j=0;j<n+1;j++)
				yExpected[i]+=
				(coef[j]*
				xMatrix[i][j]);
		}
		//计算y的期望值
		
		u=0;
		lyy=0;
		for(i=0;i<m;i++)
		{
			u+=((yExpected[i]-yAverage)*(yExpected[i]-yAverage));
			lyy+=((yMatrix[i]-yAverage)*(yMatrix[i]-yAverage));
		}
		
		double r=Math.sqrt(u/lyy);
		return r;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -