Math.Net 数字 - 拟合正弦函数

本文关键字:函数 拟合 Net 数字 Math | 更新日期: 2023-09-27 18:30:30

我是新来的,我希望那里的专家可以帮助我:我想通过 C# 中的"math.net 数字"库f(x) = a *sin(b* (x+c))+d拟合正弦函数。

一开始我尝试了以下示例代码:

// data points: we compute y perfectly but then add strong random noise to it
var rnd = new Random(1);
var omega = 1.0d
var xdata = new double[] { -1, 0, 0.1, 0.2, 0.3, 0.4, 0.65, 1.0, 1.2, 2.1, 4.5, 5.0, 6.0 };
var ydata = xdata.Select(x => 5 + 2 * Math.Sin(omega*x + 0.2) + 2*(rnd.NextDouble()-0.5)).ToArray();
// build matrices
var X = DenseMatrix.OfColumns(new[] {
new DenseVector(1),
new DenseVector(xdata.Select(t => Math.Sin(omega*t)).ToArray()),
new DenseVector(xdata.Select(t => Math.Cos(omega*t)).ToArray())});
var y = new DenseVector(ydata);
// solve
var p = X.QR().Solve(y);
var a = p[0];
var b = SpecialFunctions.Hypotenuse(p[1], p[2]);
var c = Math.Atan2(p[2], p[1]); 

但结果是,程序返回以下错误:

"矩阵尺寸必须一致:1x3"。

你能给我一个提示,我可以做些什么来解决问题吗?

Math.Net 数字 - 拟合正弦函数

您正在向矩阵 (X) 添加 3 列,这些列具有不同的长度。

第一个向量的长度为 1,而第二个和第三个向量的长度为 xdata.Length

如果希望第一个向量的长度为 xdata.Length 但填充 1,请执行以下操作:

var X = DenseMatrix.OfColumns(new[]
{
    new DenseVector(Enumerable.Repeat(1d , xdata.Length).ToArray()),
    new DenseVector(xdata.Select(t => Math.Sin(omega*t)).ToArray()),
    new DenseVector(xdata.Select(t => Math.Cos(omega*t)).ToArray())
});