📄 functionapproximation.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 + -