C# 多项式拟合函数
时间: 2023-12-06 12:38:02 浏览: 57
以下是使用C#实现多项式拟合函数的示例代码:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
namespace PolynomialFitting
{
class Program
{
static void Main(string[] args)
{
// 定义数据点
List<double> x = new List<double> { 1, 2, 3, 4, 5 };
List<double> y = new List<double> { 1, 4, 9, 16, 25 };
// 多项式拟合
int degree = 2; // 多项式次数
var coefficients = FitPolynomial(x, y, degree);
// 输出拟合结果
Console.WriteLine("拟合结果:");
for (int i = 0; i < coefficients.Length; i++)
{
Console.WriteLine($"A[{i}] = {coefficients[i]}");
}
// 预测新数据
double newX = 6;
double newY = Predict(newX, coefficients);
Console.WriteLine($"x = {newX}, y = {newY}");
}
// 多项式拟合函数
static double[] FitPolynomial(List<double> x, List<double> y, int degree)
{
int n = x.Count;
int m = degree + 1;
double[,] X = new double[n, m];
double[] Y = new double[n];
// 构造矩阵X和向量Y
for (int i = 0; i < n; i++)
{
double xi = x[i];
double yi = y[i];
for (int j = 0; j < m; j++)
{
X[i, j] = Math.Pow(xi, j);
}
Y[i] = yi;
}
// 求解线性方程组
var XTranspose = Transpose(X);
var XTX = Multiply(XTranspose, X);
var XTY = Multiply(XTranspose, Y);
var coefficients = Solve(XTX, XTY);
return coefficients;
}
// 矩阵转置
static double[,] Transpose(double[,] matrix)
{
int rows = matrix.GetLength(0);
int cols = matrix.GetLength(1);
double[,] result = new double[cols, rows];
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < cols; j++)
{
result[j, i] = matrix[i, j];
}
}
return result;
}
// 矩阵乘法
static double[,] Multiply(double[,] matrix1, double[,] matrix2)
{
int rows1 = matrix1.GetLength(0);
int cols1 = matrix1.GetLength(1);
int rows2 = matrix2.GetLength(0);
int cols2 = matrix2.GetLength(1);
if (cols1 != rows2)
{
throw new ArgumentException("矩阵维度不匹配");
}
double[,] result = new double[rows1, cols2];
for (int i = 0; i < rows1; i++)
{
for (int j = 0; j < cols2; j++)
{
double sum = 0;
for (int k = 0; k < cols1; k++)
{
sum += matrix1[i, k] * matrix2[k, j];
}
result[i, j] = sum;
}
}
return result;
}
// 解线性方程组
static double[] Solve(double[,] A, double[] b)
{
int n = b.Length;
double[,] Ab = new double[n, n + 1];
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
Ab[i, j] = A[i, j];
}
Ab[i, n] = b[i];
}
for (int i = 0; i < n; i++)
{
// 消元
double pivot = Ab[i, i];
for (int j = i + 1; j <= n; j++)
{
Ab[i, j] /= pivot;
}
for (int j = i + 1; j < n; j++)
{
double factor = Ab[j, i];
for (int k = i + 1; k <= n; k++)
{
Ab[j, k] -= factor * Ab[i, k];
}
}
}
// 回代
double[] x = new double[n];
for (int i = n - 1; i >= 0; i--)
{
double sum = 0;
for (int j = i + 1; j < n; j++)
{
sum += Ab[i, j] * x[j];
}
x[i] = Ab[i, n] - sum;
}
return x;
}
// 预测新数据
static double Predict(double x, double[] coefficients)
{
double y = 0;
for (int i = 0; i < coefficients.Length; i++)
{
y += coefficients[i] * Math.Pow(x, i);
}
return y;
}
}
}
```