2016-01-15 154 views
4

我在这里是新的,我希望或许专家能帮助我: 我想通过C#中的库“math.net numerics”来适应窦功能f(x) = a *sin(b* (x+c))+dMath.Net Numerics - 拟合窦功能

在开始的时候我尝试下面的示例代码:

// 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]); 

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

"Matrix dimensions must agree: 1x3".

你能不能给我一个提示我所能要解决这个问题吗?

+1

仅供参考'欧米茄* X + 0.2'会首先做乘法,然后加入。根据你的公式,它看起来应该是'omega *(x + 0.2)'。 – juharr

+0

@juharr tThanks for your answer - 但错误仍然是一样的:-( –

+0

你打算用'new DenseVector(1)'表示什么意思? –

回答

2

您正在向具有不同长度的矩阵(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()) 
}); 
+0

感谢Yacoub你救了我的生命 –

+0

附加问题:上面的代码是函数f(x)= a + b * sin(c + omega * x)在代码中我必须改变什么,所以函数f(x)= a * sin(b *( x + c))+ d? –

+0

@Biläl,如果你把这个作为另一个问题的细节来发布会更好,这样,我们有更多的上下文来回答这个问题。 –