using System.Collections.Generic;
List<DataPoint> dataPoints = new List<DataPoint>
new DataPoint(1, 7.2074),
new DataPoint(2, 10.5465),
new DataPoint(3, 9.7056),
new DataPoint(4, 8.2160),
new DataPoint(5, 10.2054),
new DataPoint(6, 16.6029),
new DataPoint(7, 24.2849),
new DataPoint(8, 28.9468),
new DataPoint(9, 29.0606),
new DataPoint(10, 27.2799)
(double fittedX1, double fittedX2) = FitCurve(dataPoints, x1, x2);
Console.WriteLine($"Los parámetros ajustados son x1 = {fittedX1:F4}, x2 = {fittedX2:F4} y se aplicarán de la siguiente manera: ");
Console.WriteLine("\nt\tf(t)\tFitted f(t)");
foreach (var point in dataPoints)
double fittedValue = FittedFunction(point.T, fittedX1, fittedX2);
Console.WriteLine($"{point.T}\t{point.FT:F4}\t{fittedValue:F4}");
static (double x1, double x2) FitCurve(List<DataPoint> dataPoints, double initialX1, double initialX2)
double learningRate = 0.0001;
for (int i = 0; i < iterations; i++)
foreach (var point in dataPoints)
double predicted = FittedFunction(point.T, x1, x2);
double error = predicted - point.FT;
sumErrorX1 += error * point.T;
sumErrorX2 += error * Math.Sin(point.T);
x1 -= learningRate * sumErrorX1 / dataPoints.Count;
x2 -= learningRate * sumErrorX2 / dataPoints.Count;
static double FittedFunction(double t, double x1, double x2)
return x1 * t + x2 * Math.Sin(t);
public double FT { get; }
public DataPoint(double t, double ft)