| ocmath_derivative  DescriptionSimple derivative calculations without smoothing. Missing values are ignored. There is no smoothing performed in this function. Derivative is computed by taking the average of the two data points slopes from the previous and next data points. Syntax
int ocmath_derivative( const double * pXData, double * pYData, uint nSize, DWORD dwCntrl = 0 )
 Parameters
    pXData[input] pointer to X vector datapYData[modify] pointer to Y vector data, result of derivatives are put back to replace original datanSize[input] number of points in pXData and pYDatadwCntrl[input] options, DERV_PEAK_AS_ZERO, will fill zero if data change direction, otherwise the average is used Returnreturn OE_NOERROR for success, otherwise return errors ExamplesEX1 
// Create some data and compare the average and zero fill method of numerical derivative
void    ocmath_derivative_ex1()
{
    GraphLayer gl = Project.ActiveLayer();
    if (!gl)
    {
        out_str("Active layer is not a graph.");
        return;
    }
    
    DataPlot dp = gl.DataPlots(0);                
    DataRange dr;
    vector vx, vy;
    if(dp.GetDataRange(dr))
    {
        DWORD dwPlotID;
        if(dr.GetData(DRR_GET_DEPENDENT | DRR_NO_FACTORS, 0, &dwPlotID, NULL, &vy, &vx) < 0)
        {
            printf("get data failed GetData");
            return;
        }
    }
    
    // Create copies of the 'y' data to operate on
    vector vderiv1;
    vderiv1 = vy;
    vector vderiv2;
    vderiv2 = vy;
    Worksheet wks;
    wks.Create("Derivative");
    wks.SetSize(-1, 4);
    DataRange drOut;
    drOut.Add("X", wks, 0, 0, -1, 0);
    drOut.Add("X", wks, 0, 1, -1, 1);
    drOut.Add("X", wks, 0, 2, -1, 2);
    drOut.Add("X", wks, 0, 3, -1, 3);
    drOut.SetData(vx, false, 0);
    drOut.SetData(vy, false, 1);
    // First try using averaging
    if(OE_NOERROR == ocmath_derivative(vx, vderiv1, vy.GetSize()))
    {
        drOut.SetData(vderiv1, false, 2);
    }
    // Now use the fill with zero option
    if(OE_NOERROR == ocmath_derivative(vx, vderiv2, vy.GetSize(), DERV_PEAK_AS_ZERO))
    {
        drOut.SetData(vderiv2, false, 3);
    }
}
RemarkSee Alsoheader to Includeorigin.h Reference |