2016-01-15 2 views
4

Я новичок здесь, и я надеюсь, что, возможно, эксперты могут мне помочь: Я хочу, чтобы функция синуса f(x) = a *sin(b* (x+c))+d через библиотеку «math.net numics» на C#.Math.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

FYI 'Омега * х + 0.2' будет делать умножение первого, то добавление , Основываясь на вашей формуле, похоже, что это должно быть «omega * (x + 0,2)». – juharr

+0

@juharr tThanks для вашего ответа - но ошибка все тот же :-( –

+0

Что вы намерены подразумевать под новым DenseVector (1) '? –

ответ

2

Вы добавляете 3 столбца к матрице (X), которые имеют разную длину.

Первый вектор имеет длину 1, а второй и третий векторы имеют длины xdata.Length.

Если вы собираетесь в первый вектор иметь длину xdata.Length, но должны быть заполнены с 1s затем выполните следующие действия:

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

Спасибо Якубу, что вы спасли мне жизнь –

+0

Другой вопрос: Код выше была для функции f (x) = a + b * sin (c + omega * x). Что мне нужно изменить в коде, так что это для функции f (x) = a * sin (b * (x + c)) + d? –

+0

@ Biläl. Было бы лучше, если бы вы разместили это как еще один вопрос с подробностями. Таким образом, у нас есть больше условий для ответа на вопрос. –

Смежные вопросы