C# 如何使f(x)=sin(x)*sin(x)函数适合您的数据?

C# 如何使f(x)=sin(x)*sin(x)函数适合您的数据?,c#,trigonometry,curve-fitting,data-fitting,mathnet-numerics,C#,Trigonometry,Curve Fitting,Data Fitting,Mathnet Numerics,我试图将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)); Func f=Fit.LinearComb

我试图将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));
Func f=Fit.LinearCombinationFunc(
扩展数据,
伊达塔,
x=>1.0,
x=>Math.Pow(Math.Sin(x+1.0),2));
我提取了(红色)数据进行分析。以下是我的结果,使用方程“y=振幅*sin(pi*(x-中心)/width)*sin(pi*(x-中心)/width”和拟合的C#代码。我建议使用这个方程和这些参数值作为初始参数估计进行测试

我提取了(红色)数据进行分析。以下是我的结果,使用方程“y=振幅*sin(pi*(x-中心)/宽度)*sin(pi*(x-中心)/宽度”和拟合的C#代码。我建议使用这个方程和这些参数值作为初始参数估计值进行测试


我找到了非线性拟合的解决方案。 您可以使用CenterSpace.n Math库并执行以下操作(即f(x)=a+c*sin(x+b)*sin(x+b)):


我找到了非线性拟合的解决方案。 您可以使用CenterSpace.n Math库并执行以下操作(即f(x)=a+c*sin(x+b)*sin(x+b)):


我不知道如何使用“Fit.LinearCombinationFunc()实现此功能”这是没有帮助的,因为每次我获取数据时,数据可能会有不同的相位和振幅,所以系数会不同。也许你知道将函数拟合到数据的不同方法?我发布的方程在参数中不是线性的,因此需要一个非线性拟合器。我原以为会有一个新的拟合新数据需要。我不知道如何使用“Fit.LinearCombinationFunc()实现此功能”这是没有帮助的,因为每次我获取数据时,数据可能会有不同的相位和振幅,所以系数会不同。也许你知道将函数拟合到数据的不同方法?我发布的方程在参数中不是线性的,因此需要一个非线性拟合器。我原以为会有一个新的拟合需要新的数据。
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;
    }
}
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);
 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
        }
    }