【发布时间】: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