package com.smart.test; /** * 最小二乘法计算类 */ public class LeastSquareMethod { private double[] x; private double[] y; private double[] weight; private int m; private double[] coefficient; public LeastSquareMethod(double[] x, double[] y, int m) { if (x == null || y == null || x.length < 2 || x.length != y.length || m < 2) throw new IllegalArgumentException("无效的参数"); this.x = x; this.y = y; this.m = m; weight = new double[x.length]; for (int i = 0; i < x.length; i++) { weight[i] = 1; } } public LeastSquareMethod(double[] x, double[] y, double[] weight, int m) { if (x == null || y == null || weight == null || x.length < 2 || x.length != y.length || x.length != weight.length || m < 2) throw new IllegalArgumentException("无效的参数"); this.x = x; this.y = y; this.m = m; this.weight = weight; } public double[] getCoefficient() { if (coefficient == null) compute(); return coefficient; } public double fit(double v) { if (coefficient == null) compute(); if (coefficient == null) return 0; double sum = 0; for (int i = 0; i < coefficient.length; i++) { sum += Math.pow(v, i) * coefficient[i]; } return sum; } private void compute() { if (x == null || y == null || x.length <= 1 || x.length != y.length || x.length < m || m < 2) return; double[] s = new double[(m - 1) * 2 + 1]; for (int i = 0; i < s.length; i++) { for (int j = 0; j < x.length; j++) s[i] += Math.pow(x[j], i) * weight[j]; } double[] f = new double[m]; for (int i = 0; i < f.length; i++) { for (int j = 0; j < x.length; j++) f[i] += Math.pow(x[j], i) * y[j] * weight[j]; } double[][] a = new double[m][m]; for (int i = 0; i < m; i++) { for (int j = 0; j < m; j++) { a[i][j] = s[i + j]; } } coefficient = Algorithm.multiLinearEquationGroup(a, f); } /** * @param args */ public static void main(String[] args) { double[] x = { 0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0}; double[] y = { 2.75,2.84,2.965,3.01,3.20,3.25,3.38,3.43,3.55,3.66,3.74}; LeastSquareMethod l = new LeastSquareMethod(x, y, 2); double[] xx = l.getCoefficient(); for (double a : xx) { System.out.println(a); } System.out.println(l.fit(0.9)); } }