Как подогнать функцию f (x) = sin (x) * sin (x) к вашим данным? - PullRequest
1 голос
/ 10 октября 2019

Я пытаюсь подогнать к своим данным функцию f (x) = sin (x) * sin (x), но не могу точно это сделать: результат подгонки

Мои данные могут иметь случайный фазовый сдвиг, и это главная проблема с этим подгонкой.

Я использую библиотеку MathNet.Numerics. Мой код для примерки:

Func<double, double> f = Fit.LinearCombinationFunc(
xData,
yData,
x => 1.0,
x => Math.Pow(Math.Sin(x + 1.0), 2));

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

Я нашел решение для нелинейной подгонки. Вы можете использовать библиотеку CenterSpace.NMath и выполнить следующие действия (например, f (x) = a + c * sin (x + b) * sin (x + b)):

DoubleParameterizedFunction func = new Function();

var f = new DoubleParameterizedDelegate(
func.Evaluate);

var fitter = new OneVariableFunctionFitter<TrustRegionMinimizer>(f);
DoubleVector x = new DoubleVector(xData);
DoubleVector y = new DoubleVector(yData);
DoubleVector init = new DoubleVector("100.0 1.0 100.0");
DoubleVector solution = fitter.Fit(x, y, init);

And Function () выглядит так:

 public class Function : DoubleParameterizedFunction
    {
        public Function ()
        { }

        public override double Evaluate (DoubleVector p, double x)
        {
            double a = p[0];
            double b = p[1];
            double c = p[2];
            return a + c*Math.Sin(b + x) * Math.Sin(b + x);
        }

        public override void GradientWithRespectToParams (DoubleVector p,
          double x, ref DoubleVector grad)
        {
            double a = p[0];
            double b = p[1];
            double c = p[2];
            grad[0] = 1; //partial differential for a
            grad[1] = 2 * c * Math.Sin(x + b) * Math.Cos(x + b);  //partial differential for b
            grad[2] = Math.Sin(x + b) * Math.Sin(x + b);  //partial differential for c
        }
    }

https://www.centerspace.net/doc/NMath/user/nonlinear-least-squares-86564.htm

0 голосов
/ 10 октября 2019

Я извлек (красные) данные для анализа. Вот мои результаты, используя уравнение «y = амплитуда * sin (pi * (x - центр) / ширина) * sin (pi * (x - центр) / ширина» с подходящим кодом C #. Я предлагаю сделать тест с использованием этогоуравнение с этими значениями параметров в качестве начальных оценок параметров.

enter image description here

using System;

class Trigonometric_SineSquared_Offset
{
    double Trigonometric_SineSquared_Offset_model(double x_in)
    {
        double temp;
        temp = 0.0;

        // coefficients
        double amplitude = 2.4582405471785171E+02;
        double center = -7.3116553541287885E+02;
        double width = 3.1152304928336734E+00;
        double Offset = 1.3146489736138119E+02;

        temp = amplitude * Math.Sin(3.14159265358979323846 * (x_in - center) / width) * Math.Sin(3.14159265358979323846 * (x_in - center) / width);
        temp += Offset;
        return temp;
    }
}
...