[英]Math.Net Numerics - Fitting sinus function
I'm new here and I hope that perhaps the experts outthere can help me: I want to fit the sinus function f(x) = a *sin(b* (x+c))+d
via the library "math.net numerics" in C#. 我是新来的,我希望也许专家们可以帮助我:我想通过库“math.net”拟合窦函数
f(x) = a *sin(b* (x+c))+d
数字“在C#中。
At the beginning I tried the following example code: 一开始我尝试了以下示例代码:
// 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]);
But the result was, that the program returned the following error: 但结果是,该程序返回以下错误:
"Matrix dimensions must agree: 1x3".
“矩阵尺寸必须达成一致:1x3”。
Could you give me a hint what I can do to solve the problem ? 你能给我一个暗示我可以做些什么来解决这个问题吗?
You are adding 3 columns to the matrix (X) that have different lengths. 您正在向矩阵(X)添加3个具有不同长度的列。
The first vector has length 1, while the second and third vectors have lengths of xdata.Length
. 第一个向量的长度为1,而第二个和第三个向量的长度为
xdata.Length
。
If you intend for the first vector to have the length of xdata.Length
but to be filled with 1s then do the following: 如果您打算让第一个向量的长度为
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())
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.