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

📄 functionapproximation.java

📁 数值分析算法源码(java) 这个学期一边学习java一边学习数值分析,因此用java写了一个数值分析算法的软件包numericalAnalysis. [说明] 适合使用者:会java的
💻 JAVA
字号:
package numericalAnalysis.functionApproximation;

import java.text.DecimalFormat;
import numericalAnalysis.linearEquationGroup.LinearEquationGroup;

/**
 * 本类解决离散情况下的函数逼近问题,包括常用的最小平方逼近(最小二乘法).对照书:数值分析第二版,史万明等编,北京理工大学出版社
 * 
 * @author 山
 * 
 */
public class FunctionApproximation {
	private int n;// 拟合数据的点的个数减1
	private double[] x, y;// 拟合数据
	private DecimalFormat fmt = new DecimalFormat("0.######");// 输出六位小数

	/**
	 * 新建一个离散情况下的函数逼近问题.
	 * 
	 * @param n
	 *            n的值为拟合数据的点的个数减1,因为点是从(x0,y0)开始到(xn,yn)
	 * @param x
	 *            拟合数据的xi值
	 * @param y
	 *            拟合数据的yi值(顺序与xi对应)
	 */
	public FunctionApproximation(int n, double[] x, double[] y) {
		this.n = n;
		this.x = new double[n + 1];
		this.y = new double[n + 1];
		
		for(int i=0;i<n+1;i++){
			this.x[i]=x[i];
			this.y[i]=y[i];
		}
	}

	/**
	 * 最小平方逼近(最小二乘法)法
	 * 
	 * @param m
	 *            最小平方逼近多项式Pm(x)的m
	 * @return 最小平方逼近多项式Pm(x)
	 */
	public String leastSquaresApproximation(int m) {
		String output = "\n";
		double[][] M = new double[n + 2][m + 2], MT = new double[m + 2][n + 2], a = new double[m + 2][m + 2];// 法方程组的矩阵M,MT=M',a=M'M
		double[] Y = new double[n + 2], b = new double[m + 2];// 法方程组的向量Y.A不用,因为A就是解向量.b=M'Y

		for (int i = 1; i < M.length; i++)
			for (int j = 1; j < M[1].length; j++)
				M[i][j] = Math.pow(x[i - 1], j - 1);// 索引有0的不使用

		for (int i = 1; i < Y.length; i++)
			Y[i] = y[i - 1];// 索引有0的不使用

		for (int i = 1; i < MT.length; i++)
			for (int j = 1; j < MT[1].length; j++)
				MT[i][j] = M[j][i];

		for (int i = 1; i < a.length; i++)
			for (int j = 1; j < a[1].length; j++) {
				double sum = 0;
				for (int k = 1; k < MT[1].length; k++)
					sum += MT[i][k] * M[k][j];
				a[i][j] = sum;
			}

		for (int i = 1; i < b.length; i++) {
			double sum = 0;
			for (int k = 1; k < MT[1].length; k++)
				sum += MT[i][k] * Y[k];
			b[i] = sum;
		}

		LinearEquationGroup eqGroup = new LinearEquationGroup(m + 1, a, b);

		double[] solution = new double[m + 2];
		solution = eqGroup.getSolution();

		output += "P" + m + "(x)=(" + fmt.format(solution[1]) + ")";
		if(m>0)
			output+="+";
		for (int i = 2; i < solution.length; i++) {
			output +="("+ fmt.format(solution[i]) + ")x^" + (i - 1);
			if (i !=  solution.length-1)
				output += "+";
		}

		return output;

	}
}

⌨️ 快捷键说明

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