C#最小二乘拟合sin
时间: 2023-11-22 10:46:37 浏览: 340
在C#中,可以使用MathNet.Numerics库来进行最小二乘拟合。下面是一个使用最小二乘法拟合sin函数的示例代码:
```
using MathNet.Numerics;
using MathNet.Numerics.LinearAlgebra;
// 定义sin函数
Func<double, double> sinFunc = x => Math.Sin(x);
// 生成一些带有噪声的数据点
var xData = Generate.LinearSpaced(100, 0, 2 * Math.PI);
var yData = xData.Select(x => sinFunc(x) + 0.1 * (2 * Random.Double() - 1)).ToArray();
// 定义拟合函数的形式
Func<double, Vector<double>, double> fitFunc = (x, p) => p[0] * Math.Sin(p[1] * x + p[2]);
// 定义误差函数
Func<Vector<double>, double> errorFunc = p => yData.Select((y, i) => fitFunc(xData[i], p) - y).Norm(2);
// 初始参数猜测
var initialGuess = Vector<double>.Build.DenseOfArray(new[] { 1.0, 1.0, 0.0 });
// 进行最小二乘拟合
var result = NelderMeadMinimizer.Minimum(errorFunc, initialGuess);
// 输出拟合结果
Console.WriteLine($"Amplitude: {result.MinimizingPoint[0]}");
Console.WriteLine($"Frequency: {result.MinimizingPoint[1]}");
Console.WriteLine($"Phase: {result.MinimizingPoint[2]}");
```
该代码使用Nelder-Mead算法进行最小二乘拟合,输出拟合结果的振幅、频率和相位。你可以根据需要修改拟合函数的形式和误差函数的定义。如果需要更多的信息,可以查阅MathNet.Numerics库的文档。
阅读全文