如何将 f(x) = sin(x)*sin(x) 函数拟合到您的数据?
How to fit f(x) = sin(x)*sin(x) function to your data?
我正在尝试将 f(x) = sin(x)*sin(x) 函数拟合到我的数据中,但我无法准确地做到这一点:
fitting result
我的数据可能有随机相移,这是此拟合的主要问题。
我使用 MathNet.Numerics 库。
我的拟合代码:
Func<double, double> f = Fit.LinearCombinationFunc(
xData,
yData,
x => 1.0,
x => Math.Pow(Math.Sin(x + 1.0), 2));
我提取了(红色)数据进行分析。这是我的结果,使用等式 "y = amplitude * sin(pi * (x - center) / width) * sin(pi * (x - center) / width" 和合适的 C# 代码。我建议使用此等式将这些参数值作为初始参数估计值进行测试。
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;
}
}
我找到了非线性拟合的解决方案。
您可以使用 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);
而 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
我正在尝试将 f(x) = sin(x)*sin(x) 函数拟合到我的数据中,但我无法准确地做到这一点: fitting result
我的数据可能有随机相移,这是此拟合的主要问题。
我使用 MathNet.Numerics 库。 我的拟合代码:
Func<double, double> f = Fit.LinearCombinationFunc(
xData,
yData,
x => 1.0,
x => Math.Pow(Math.Sin(x + 1.0), 2));
我提取了(红色)数据进行分析。这是我的结果,使用等式 "y = amplitude * sin(pi * (x - center) / width) * sin(pi * (x - center) / width" 和合适的 C# 代码。我建议使用此等式将这些参数值作为初始参数估计值进行测试。
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;
}
}
我找到了非线性拟合的解决方案。 您可以使用 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);
而 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