【问题标题】:Math.Net Numerics - Fitting sinus functionMath.Net Numerics - 拟合正弦函数
【发布时间】:2016-01-15 14:30:48
【问题描述】:

我是新来的,我希望外面的专家可以帮助我: 我想通过 C# 中的库“math.net numerics”来拟合正弦函数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”。

你能告诉我我能做些什么来解决这个问题吗?

【问题讨论】:

  • 仅供参考 omega*x + 0.2 将先进行乘法,然后再进行加法。根据您的公式,它看起来应该是omega*(x + 0.2)
  • @juharr t感谢您的回答-但错误仍然相同:-(
  • new DenseVector(1) 是什么意思?
  • new DenseVector(Enumerable.Repeat(1d , xdata.Length).ToArray())替换new DenseVector(1)
  • @Biläl 这不是您问题的答案。我只是指出另一个潜在问题。

标签: c# mathnet-numerics


【解决方案1】:

您正在向矩阵 (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())
});

【讨论】:

  • 感谢 Yacoub 你救了我的命
  • 附加问题:上面的代码用于函数 f(x) = a + bsin(c+omegax)。我必须在代码中更改什么,所以它适用于函数 f(x) = a sin(b (x+c))+d ?
  • @Biläl,如果您将此作为另一个带有详细信息的问题发布会更好。这样,我们就有更多的上下文来回答这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2023-04-06
  • 1970-01-01
相关资源
最近更新 更多