数学计算工具集

166 阅读1分钟

本着有羊毛不薅白不薅的精神,创建此工具集,利用掘金上的代码编译器方便的做一些数学计算,感兴趣的小伙伴收藏下吧~

多项式拟合工具

将散点数据拟合成指定阶的多项式的系数返回。

interface Point {  
  x: number;  
  y: number;  
}  
  
function polynomialCurveFit(points: Point[], degree: number): number[] {  
  const matrix: number[][] = [];  
  const vector: number[] = [];  
  
  // 构建矩阵和向量  
  for (let i = 0; i <= degree; i++) {  
    const row: number[] = [];  
    for (let j = 0; j <= degree; j++) {  
      let sum = 0;  
      for (const point of points) {  
        sum += Math.pow(point.x, i + j);  
      }  
      row.push(sum);  
    }  
    matrix.push(row);  
  
    let sum = 0;  
    for (const point of points) {  
      sum += Math.pow(point.x, i) * point.y;  
    }  
    vector.push(sum);  
  }  
  
  // 解方程得到多项式系数  
  const coefficients = gaussianElimination(matrix, vector);  
  
  return coefficients;  
}  
  
function gaussianElimination(matrix: number[][], vector: number[]): number[] {  
  const n = matrix.length;  
  
  for (let i = 0; i < n; i++) {  
    let maxRow = i;  
    for (let j = i + 1; j < n; j++) {  
      if (Math.abs(matrix[j][i]) > Math.abs(matrix[maxRow][i])) {  
        maxRow = j;  
      }  
    }  
  
    [matrix[i], matrix[maxRow]] = [matrix[maxRow], matrix[i]];  
    [vector[i], vector[maxRow]] = [vector[maxRow], vector[i]];  
  
    for (let j = i + 1; j < n; j++) {  
      const factor = matrix[j][i] / matrix[i][i];  
      for (let k = i; k < n; k++) {  
        matrix[j][k] -= factor * matrix[i][k];  
      }  
      vector[j] -= factor * vector[i];  
    }  
  }  
  
  const coefficients: number[] = new Array(n);  
  
  for (let i = n - 1; i >= 0; i--) {  
    let sum = 0;  
    for (let j = i + 1; j < n; j++) {  
      sum += matrix[i][j] * coefficients[j];  
    }  
    coefficients[i] = (vector[i] - sum) / matrix[i][i];  
  }  
  
  return coefficients;  
}  
  
// 示例用法  
const points: Point[] = [  
  { x: 1, y: 2 },  
  { x: 2, y: 4 },  
  { x: 3, y: 6 },  
  { x: 4, y: 8 },  
  { x: 5, y: 10 },  
];  
  
const degree = 2; // 多项式次数  
  
const coefficients = polynomialCurveFit(points, degree);  


console.log(coefficients); // 输出多项式的系数