本着有羊毛不薅白不薅的精神,创建此工具集,利用掘金上的代码编译器方便的做一些数学计算,感兴趣的小伙伴收藏下吧~
多项式拟合工具
将散点数据拟合成指定阶的多项式的系数返回。
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); // 输出多项式的系数