Moments from an Empirical Distribution

This function calculates a moment from an empirical distribution function.

wdistr - the input distribution wave
n - the moment (-2 - rms, 0 - most probable, 1 - mean, 2 - second, 3 ...)
xmax - optional x limit for the calculations
wdistrX - optional x wave for distribution (for calculations with non-scaled waves)

Function calc_DistributionMoment(wave wdistr, variable n [variable xmax, wave wdistrX])

    variable rtnv, scaled=1, limited=0, pmax
   
    if (!ParamIsDefault(wdistrX))
        scaled = 0
    endif
    if (!ParamIsDefault(xmax))
        limited=1
        if (scaled)
            pmax = x2pnt(wdistr,xmax)
        else
            pmax = x2pnt(wdistrX,xmax)
        endif
    else
        pmax = numpnts(wdistr) - 1
        if (scaled)
            xmax = pnt2x(wdistr,pmax)
        endif
    endif
   
    switch(n)
        case -2:    // rms
            duplicate/FREE wdistr, iwave, iMwave
            if (scaled)
                integrate/METH=1 iwave
                iMwave = wdistr*x^2
                integrate/METH=1 iMwave
            else
                integrate/METH=1 iwave /X=wdistrX
                iMwave = wdistr*wdistrX^2
                integrate/METH=1 iMwave /X=wdistrX
            endif
            rtnv = sqrt(iMwave[pmax]/iwave[pmax])
            break      
        case 0: // most probable
            if (scaled)
                if (limited)
                    WaveStats/M=1/Q/R=(0,xmax) wdistr
                else
                    WaveStats/M=2/Q wdistr
                endif
                rtnv = v_maxloc
            else
                if (limited)
                    WaveStats/P/M=2/Q/R=[0,pmax] wdistr
                else
                    WaveStats/P/M=2/Q wdistr
                endif
                rtnv = wdistrX[v_maxRowLoc]
            endif
            break
        default:    // all others (1-mean, 2-second, 3...)
            duplicate/FREE wdistr, iwave, iMwave
            if (scaled)
                iwave = wdistr*x^(n-1)
                integrate/METH=1 iwave
                iMwave = wdistr*x^n
                integrate/METH=1 iMwave
            else
                iwave = wdistr*wdistrX^(n-1)
                integrate/METH=1 iwave /X=wdistrX
                iMwave = wdistr*wdistrX^n
                integrate/METH=1 iMwave /X=wdistrX
            endif
            rtnv = iMwave[pmax]/iwave[pmax]
            break
    endswitch
   
    return rtnv
end

This would be used by example to obtain the requisite values from polymer molar mass distributions or particle size distributions.

Forum

Support

Gallery

Igor Pro 9

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More