Curveffiting — PyMeeus 0.5.12 documentation

# Curveffiting

Class to get the best fit of a curve to a set of (x, y) points.

class pymeeus.CurveFitting.CurveFitting(*args)

  Class CurveFitting deals with finding the function (linear, cuadratic, etc) that best fit a given set of points.

  The constructor takes pairs of (x, y) values from the table of interest. These pairs of values can be given as a sequence of int/floats, tuples, lists or Angles. It is also possible to provide a CurveFitting object to the constructor in order to get a copy.

  Note

  When using Angles, be careful with the 360-to-0 discontinuity.

  If a sequence of int, floats or Angles is given, the values in the odd positions are considered to belong to the ‘x’ set, while the values in the even positions belong to the ‘y’ set. If only one tuple or list is provided, it is assumed that it is the ‘y’ set, and the ‘x’ set is build from 0 onwards with steps of length 1.

  Please keep in mind that a minimum of two data pairs are needed in order to carry out any fitting. If only one value pair is provided, a ValueError exception will be raised.

  __init__(*args)

    CurveFitting constructor.

    This takes pairs of (x, y) values from the table of interest. These pairs of values can be given as a sequence of int/floats, tuples, lists or Angles. It is also possible to provide a CurveFitting object to the constructor in order to get a copy.

    Note

    When using Angles, be careful with the 360-to-0 discontinuity

    If a sequence of int, floats or Angles is given, the values in the odd positions are considered to belong to the ‘x’ set, while the values in the even positions belong to the ‘y’ set. If only one tuple or list is provided, it is assumed that it is the ‘y’ set, and the ‘x’ set is build from 0 onwards with steps of length 1.

    Please keep in mind that a minimum of two data pairs are needed in order to carry out any interpolation. If only one value pair is provided, a ValueError exception will be raised.

    Parameters

      args (int, float, list, tuple, `Angle`, `CurveFitting`) – Input tabular values, or another CurveFitting object.

    Returns

      CurveFitting object.

    Return type

      `CurveFitting`

    Raises

      ValueError if not enough input data pairs are provided.

    Raises

      TypeError if input values are of wrong type.

        >>> i = CurveFitting([5, 3, 6, 1, 2, 4, 9], [10, 6, 12, 2, 4, 8])
        >>> print(i._x)
        [5, 3, 6, 1, 2, 4]
        >>> print(i._y)
        [10, 6, 12, 2, 4, 8]
        >>> j = CurveFitting([3, -8, 1, 12, 2, 5, 8])
        >>> print(j._x)
        [0, 1, 2, 3, 4, 5, 6]
        >>> print(j._y)
        [3, -8, 1, 12, 2, 5, 8]
        >>> k = CurveFitting(3, -8, 1, 12, 2, 5, 8)
        >>> print(k._x)
        [3, 1, 2]
        >>> print(k._y)
        [-8, 12, 5]
        >>> m = CurveFitting(k)
        >>> print(m._x)
        [3, 1, 2]
        >>> print(m._y)
        [-8, 12, 5]

  __len__()

    This method returns the number of value pairs internally stored in this object.

    Returns

      Number of value pairs internally stored

    Return type

      int

        >>> i = CurveFitting([5, 3, 6, 1, 2, 4, 9], [10, 6, 12, 2, 4, 8])
        >>> len(i)
        6

  __repr__()

    Method providing the ‘official’ string representation of the object. It provides a valid expression that could be used to recreate the object.

    Returns

      As string with a valid expression to recreate the object

    Return type

      string

        >>> i = CurveFitting([5, 3, 6, 1, 2, 4, 9], [10, 6, 12, 2, 4, 8])
        >>> repr(i)
        'CurveFitting([5, 3, 6, 1, 2, 4], [10, 6, 12, 2, 4, 8])'

  __str__()

    Method used when trying to print the object.

    Returns

      Internal tabular values as strings.

    Return type

      string

        >>> i = CurveFitting([5, 3, 6, 1, 2, 4, 9], [10, 6, 12, 2, 4, 8])
        >>> print(i)
        X: [5, 3, 6, 1, 2, 4]
        Y: [10, 6, 12, 2, 4, 8]

  __weakref__

    list of weak references to the object (if defined)

  correlation_coeff()

    This method returns the coefficient of correlation, as a float.

    Returns

      Coefficient of correlation.

    Return type

      float

        >>> cf = CurveFitting([73.0, 38.0, 35.0, 42.0, 78.0, 68.0, 74.0, 42.0,
        ...                    52.0, 54.0, 39.0, 61.0, 42.0, 49.0, 50.0, 62.0,
        ...                    44.0, 39.0, 43.0, 54.0, 44.0, 37.0],
        ...                   [90.4, 125.3, 161.8, 143.4, 52.5, 50.8, 71.5,
        ...                    152.8, 131.3, 98.5, 144.8, 78.1, 89.5, 63.9,
        ...                    112.1, 82.0, 119.8, 161.2, 208.4, 111.6, 167.1,
        ...                    162.1])
        >>> r = cf.correlation_coeff()
        >>> print(round(r, 3))
        -0.767

  general_fitting(f0, f1=<function CurveFitting.<lambda>>, f2=<function CurveFitting.<lambda>>)

    This method returns a tuple with the ‘a’, ‘b’, ‘c’ coefficients of the general equation ‘y = a*f0(x) + b*f1(x) + c*f2(x)’ that best fits the table data, using the least squares approach.

    Parameters

      f2 (f0, f1,) – Functions used to build the general equation.

    Returns

      ‘a’, ‘b’, ‘c’ coefficients of best general equation fit.

    Return type

      tuple

    Raises

      ZeroDivisionError if input functions are null or input data leads to a division by zero

        >>> cf4 = CurveFitting([3, 20, 34, 50, 75, 88, 111, 129, 143, 160, 183,
        ...                     200, 218, 230, 248, 269, 290, 303, 320, 344],
        ...                    [0.0433, 0.2532, 0.3386, 0.3560, 0.4983, 0.7577,
        ...                     1.4585, 1.8628, 1.8264, 1.2431, -0.2043,
        ...                     -1.2431, -1.8422, -1.8726, -1.4889, -0.8372,
        ...                     -0.4377, -0.3640, -0.3508, -0.2126])
        >>> def sin1(x): return sin(radians(x))
        >>> def sin2(x): return sin(radians(2.0*x))
        >>> def sin3(x): return sin(radians(3.0*x))
        >>> a, b, c = cf4.general_fitting(sin1, sin2, sin3)
        >>> print("a = {}; b = {}; c = {}".format(round(a, 2), round(b, 2),
        ...                                       round(c, 2)))
        a = 1.2; b = -0.77; c = 0.39

        >>> cf5 = CurveFitting([0, 1.2, 1.4, 1.7, 2.1, 2.2])
        >>> a, b, c = cf5.general_fitting(sqrt)
        >>> print("a = {}; b = {}; c = {}".format(round(a, 3), round(b, 3),
        ...                                       round(c, 3)))
        a = 1.016; b = 0.0; c = 0.0

  linear_fitting()

    This method returns a tuple with the ‘a’, ‘b’ coefficients of the linear equation ‘y = a*x + b’ that best fits the table data, using the least squares approach.

    Returns

      ‘a’, ‘b’ coefficients of best linear equation fit.

    Return type

      tuple

    Raises

      ZeroDivisionError if input data leads to a division by zero

        >>> cf = CurveFitting([73.0, 38.0, 35.0, 42.0, 78.0, 68.0, 74.0, 42.0,
        ...                    52.0, 54.0, 39.0, 61.0, 42.0, 49.0, 50.0, 62.0,
        ...                    44.0, 39.0, 43.0, 54.0, 44.0, 37.0],
        ...                   [90.4, 125.3, 161.8, 143.4, 52.5, 50.8, 71.5,
        ...                    152.8, 131.3, 98.5, 144.8, 78.1, 89.5, 63.9,
        ...                    112.1, 82.0, 119.8, 161.2, 208.4, 111.6, 167.1,
        ...                    162.1])
        >>> a, b = cf.linear_fitting()
        >>> print("a = {}       b = {}".format(round(a, 2), round(b, 2)))
        a = -2.49       b = 244.18

  quadratic_fitting()

    This method returns a tuple with the ‘a’, ‘b’, ‘c’ coefficients of the quadratic equation ‘y = a*x*x + b*x + c’ that best fits the table data, using the least squares approach.

    Returns

      ‘a’, ‘b’, ‘c’ coefficients of best quadratic equation fit.

    Return type

      tuple

    Raises

      ZeroDivisionError if input data leads to a division by zero

        >>> cf2 = CurveFitting([-2.0, -1.5, -1.0, -0.5, 0.0, 0.5, 1.0, 1.5,
        ...                     2.0, 2.5,3.0],
        ...                    [-9.372, -3.821, 0.291, 3.730, 5.822, 8.324,
        ...                     9.083, 6.957, 7.006, 0.365, -1.722])
        >>> a, b, c = cf2.quadratic_fitting()
        >>> print("a = {}; b = {}; c = {}".format(round(a, 2), round(b, 2),
        ...                                       round(c, 2)))
        a = -2.22; b = 3.76; c = 6.64

  set(*args)

    Method used to define the value pairs of CurveFitting object.

    This takes pairs of (x, y) values from the table of interest. These pairs of values can be given as a sequence of int/floats, tuples, lists, or Angles. It is also possible to provide a CurveFitting object to this method in order to get a copy.

    Note

    When using Angles, be careful with the 360-to-0 discontinuity

    If a sequence of int, floats or Angles is given, the values in the odd positions are considered to belong to the ‘x’ set, while the values in the even positions belong to the ‘y’ set. If only one tuple or list is provided, it is assumed that it is the ‘y’ set, and the ‘x’ set is build from 0 onwards with steps of length 1.

    Please keep in mind that a minimum of two data pairs are needed in order to carry out any interpolation. If only one value is provided, a ValueError exception will be raised.

    Parameters

      args (int, float, list, tuple, `Angle`) – Input tabular values, or another CurveFitting object.

    Returns

      None.

    Return type

      None

    Raises

      ValueError if not enough input data pairs are provided.

    Raises

      TypeError if input values are of wrong type.

        >>> i = CurveFitting()
        >>> i.set([5, 3, 6, 1, 2, 4, 9], [10, 6, 12, 2, 4, 8])
        >>> print(i._x)
        [5, 3, 6, 1, 2, 4]
        >>> print(i._y)
        [10, 6, 12, 2, 4, 8]
        >>> j = CurveFitting()
        >>> j.set([3, -8, 1, 12, 2, 5, 8])
        >>> print(j._x)
        [0, 1, 2, 3, 4, 5, 6]
        >>> print(j._y)
        [3, -8, 1, 12, 2, 5, 8]
        >>> k = CurveFitting(3, -8, 1, 12, 2, 5, 8)
        >>> print(k._x)
        [3, 1, 2]
        >>> print(k._y)
        [-8, 12, 5]