5

最小二乘法求多次拟合

GerD82 10年前发布 | 65K 次阅读 Java 算法

[Java]代码

import java.util.*;
public class Nihe {
 /**
 * @param args
 */
 public static void main(String[] args) {
 // TODO Auto-generated method stub
 int n, m, i, j, k;
 System.out.println("输入x的个数");
 Scanner sc = new Scanner(System.in);
 n = sc.nextInt();
 double a[] = new double[n];
 double b[] = new double[n];
 System.out.println("输入x");
 Scanner str1 = new Scanner(System.in);
 for (i = 0; i < n; i++)
 a[i] = str1.nextDouble();// 数组a存储x的值
 System.out.println("输入y");
 Scanner str2 = new Scanner(System.in);
 for (i = 0; i < n; i++)
 b[i] = str2.nextDouble();// 数组b存储y的值
 double sumx = 0;
 double sumy = 0;
 for (i = 0; i < n; i++) {
 sumx += a[i];// x的类和;
 sumy += b[i];// y的类和;
 }
 // System.out.println("x的类和"+sumx);
 // System.out.println("y的类和"+sumy);
 System.out.println("输入拟合次数");
 Scanner str3 = new Scanner(System.in);
 m = str3.nextInt();
 int s = 2 * m;
 double Sumx[] = new double[s];
 for (i = 0; i < s; i++) {
 double sum = 0;
 for (j = 0; j < n; j++) {
 double r = 1;
 for (k = 0; k <= i; k++)
 r = r * a[j];
 sum += r;
 }
 Sumx[i] = sum;
 }
 /*
 * for(i=0;i<s;i++){ System.out.print(Sumx[i]+" "); }
 */
 // System.out.println();
 double Sumxy[] = new double[m];
 for (i = 0; i < m; i++) {
 double sumxy = 0;
 for (j = 0; j < n; j++) {
 double p = 1;
 double w = 0;
 for (k = 0; k <= i; k++)
 p = p * a[j];
 w = p * b[j];
 sumxy += w;
 }
 Sumxy[i] = sumxy;
 }
 /*
 * for(i=0;i<m;i++){ System.out.print(Sumxy[i]+" "); }
 */
 // System.out.println();
 int t = m + 1;
 int q = m + 2;
 double A[][] = new double[t][q];
 A[0][0] = n;
 A[0][q - 1] = sumy;
 for (j = 1; j < q - 1; j++)
 A[0][j] = Sumx[j - 1];
 for (i = 1; i < t; i++)
 for (j = 0; j < q - 1; j++)
 A[i][j] = Sumx[i + j - 1];
 for (i = 1; i < t; i++)
 A[i][q - 1] = Sumxy[i - 1];
 /*
 * for (i = 0; i < t; i++) { int count1 = 0; for (j= 0; j < q;j++) {
 * System.out.print(A[i][j] + " "); count1++; if (count1 == q)
 * System.out.println(); } }
 */
 for (k = 0; k < t; k++) {
 for (i = k + 1; i < t; i++) {
 double L = A[i][k] / A[k][k];
 for (j = 0; j < q; j++)
 A[i][j] = A[i][j] - L * A[k][j];
 }
 }
 for (k = t - 1; k >= 0; k--) {
 for (i = k - 1; i >= 0; i--) {
 double L = A[i][k] / A[k][k];
 for (j = q - 1; j >= k; j--)
 A[i][j] = A[i][j] - L * A[k][j];
 }
 } // 求多项式的系数
 /*
 * for (i = 0; i < t; i++) { int count1 = 0; for (j= 0; j < q;j++) {
 * System.out.print(A[i][j] + " "); count1++; if (count1 == q)
 * System.out.println(); } }
 */
 double r[] = new double[t];
 for (i = 0; i < t; i++) {
 r[i] = A[i][q - 1] / A[i][i];
 // System.out.println("x"+i+"="+r[i]);
 }
 double x;
 System.out.println("输入计算的值");
 Scanner sc1 = new Scanner(System.in);
 x = sc1.nextDouble();
 double SUM = 0;
 double Z[] = new double[t];
 for (i = 0; i < t; i++) {
 double z = 1;
 for (j = 1; j <= i; j++)
 z = z * x;
 Z[i] = z * r[i];
 }
 for (i = 0; i < t; i++)
 SUM += Z[i];
 System.out.println("f(" + x + ")" + "=" + SUM);
 }
}
本文由用户 GerD82 自行上传分享,仅供网友学习交流。所有权归原作者,若您的权利被侵害,请联系管理员。
转载本站原创文章,请注明出处,并保留原始链接、图片水印。
本站是一个以用户分享为主的开源技术平台,欢迎各类分享!

AltStyle によって変換されたページ (->オリジナル) /