.. index:: ! grdtrend
.. include:: module_core_purpose.rst_

********
grdtrend
********

|grdtrend_purpose|

Synopsis
--------

.. include:: common_SYN_OPTs.rst_

**gmt grdtrend** *ingrid* |-N|\ *n_model*\ [**+r**][**+x**\|\ **y**]
[ |-D|\ *diff.nc* ]
[ |SYN_OPT-R| ]
[ |-T|\ *trend.nc* ]
[ |SYN_OPT-V| ]
[ |-W|\ *weight.nc* ]
[ |SYN_OPT--| ]

|No-spaces|

Description
-----------

**grdtrend** reads a 2-D grid file and fits a low-order polynomial trend
to these data by [optionally weighted] least-squares. The trend surface
is defined by:

.. math::
    m_1 + m_2x + m_3y + m_4xy + m_5x^2 + m_6y^2 + m_7x^3 + m_8x^2y + m_9xy^2 + m_{10}y^3.

The user must specify **-N**\ *n_model*, the number of model parameters
to use; thus, **-N**\ *3* fits a bilinear trend, **-N**\ *6* a quadratic
surface, and so on. Optionally, append **+r** to the |-N| option to
perform a robust fit. In this case, the program will iteratively
reweight the data based on a robust scale estimate, in order to converge
to a solution insensitive to outliers. This may be handy when separating
a "regional" field from a "residual" which should have non-zero mean,
such as a local mountain on a regional surface.
Optionally, you may choose to fit a trend that varies only along the *x* or *y* axis,
in which case you select an *n_model* from 1 (constant) to 4 (cubic).

If data file has values set to NaN, these will be ignored during
fitting; if output files are written, these will also have NaN in the
same locations.

Required Arguments
------------------

.. |Add_ingrid| replace:: 2-D gridded data file.
.. include:: explain_grd_inout.rst_
    :start-after: ingrid-syntax-begins
    :end-before: ingrid-syntax-ends

.. _-N:

**-N**\ *n_model*\ [**+r**][**+x**\|\ **y**]
    *n_model* sets the ID of the highest model parameters to fit.
    Append **+r** for robust fit.  As an option, append either **+x** or **+y** to only
    fit a model that depends on *x* or *y* terms, respectively. This means we either fit
    :math:`m_1 + m_2x + m_3x^2 + m_4x^3` or :math:`m_1 + m_2y + m_3y^2 + m_4y^3`.
    Note that *n_model* may only be 1-4 for the one-dimensional fits but may be 1-10
    for the two-dimensional surface fits.

Optional Arguments
------------------

.. _-D:

**-D**\ *diff.nc*
    Write the difference (input data - trend) to the file *diff.nc*.

.. |Add_-R| replace:: Using the |-R| option will select a subsection of the input grid. If this subsection
    exceeds the boundaries of the grid, only the common region will be extracted. |Add_-R_links|
.. include:: explain_-R.rst_
    :start-after: **Syntax**
    :end-before: **Description**

.. _-T:

**-T**\ *trend.nc*
    Write the fitted trend to the file *trend.nc*.

.. |Add_-V| replace:: |Add_-V_links|
.. include:: explain_-V.rst_
    :start-after: **Syntax**
    :end-before: **Description**

.. _-W:

**-W**\ *weight.nc*\ [**+s**]
    If *weight.nc* exists, it will be read and used to solve a weighted
    least-squares problem. [Default: Ordinary least-squares fit]. Append
    **+s** to instead read data uncertainties (one sigma) and create weights
    as 1/sigma^2.  If the robust option has been selected, the weights used
    in the robust fit will be written to *weight.nc*.

.. include:: explain_help.rst_

Remarks
-------

The domain of x and y will be shifted and scaled to [-1, 1] and the
basis functions are built from Legendre polynomials. These have a
numerical advantage in the form of the matrix which must be inverted and
allow more accurate solutions. NOTE: The model parameters listed with
**-V** are Legendre polynomial coefficients; they are not numerically
equivalent to the :math:`m_j` in the equation described above. The description
above is to allow the user to match |-N| with the order of the
polynomial surface. See :doc:`grdmath` if you need to evaluate the trend
using the reported coefficients.

Examples
--------

.. include:: explain_example.rst_

To remove a planar trend from the remote grid earth_relief_05m for the region
around Hawaii and write the result to hawaii_residual.nc::

    gmt grdtrend @earth_relief_05m -R180/240/10/40 -N3 -Dhawaii_residual.nc

To do a robust fit of a bicubic surface to hawaii_topo.nc, writing the
result in hawaii_trend.nc and the weights used in hawaii_weight.nc,
and reporting the progress:

   ::

    gmt grdtrend hawaii_topo.nc -N10+r -Thawaii_trend.nc -Whawaii_weight.nc -V

See Also
--------

:doc:`gmt`,
:doc:`grdfft`,
:doc:`grdfilter`,
:doc:`grdmath`
