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 10

Learn More

Igor XOP Toolkit

Learn More

Igor NIDAQ Tools MX

Learn More