diff options
author | xuri <xuri.me@gmail.com> | 2021-09-14 22:23:12 +0800 |
---|---|---|
committer | xuri <xuri.me@gmail.com> | 2021-09-14 22:23:12 +0800 |
commit | 1ba3690764e90aa6f7bcb3cb1e095475d40e3d91 (patch) | |
tree | 4bfa3d8946ba11c16d7cd8103cd2eb3da8f91c77 /calc.go | |
parent | 4ef68729f5bf2150b06cbace068412b3dde2d1ae (diff) |
new formula functions: WEIBULL and WEIBULL.DIST, ref #65
Diffstat (limited to 'calc.go')
-rw-r--r-- | calc.go | 42 |
1 files changed, 42 insertions, 0 deletions
@@ -504,6 +504,8 @@ type formulaFuncs struct { // VAR.P // VARP // VLOOKUP +// WEIBULL +// WEIBULL.DIST // XOR // YEAR // Z.TEST @@ -5614,6 +5616,46 @@ func (fn *formulaFuncs) VARdotP(argsList *list.List) formulaArg { return fn.VARP(argsList) } +// WEIBULL function calculates the Weibull Probability Density Function or the +// Weibull Cumulative Distribution Function for a supplied set of parameters. +// The syntax of the function is: +// +// WEIBULL(x,alpha,beta,cumulative) +// +func (fn *formulaFuncs) WEIBULL(argsList *list.List) formulaArg { + if argsList.Len() != 4 { + return newErrorFormulaArg(formulaErrorVALUE, "WEIBULL requires 4 arguments") + } + x := argsList.Front().Value.(formulaArg).ToNumber() + alpha := argsList.Front().Next().Value.(formulaArg).ToNumber() + beta := argsList.Back().Prev().Value.(formulaArg).ToNumber() + if alpha.Type == ArgNumber && beta.Type == ArgNumber && x.Type == ArgNumber { + if alpha.Number < 0 || alpha.Number <= 0 || beta.Number <= 0 { + return newErrorFormulaArg(formulaErrorNA, formulaErrorNA) + } + cumulative := argsList.Back().Value.(formulaArg).ToBool() + if cumulative.Boolean && cumulative.Number == 1 { + return newNumberFormulaArg(1 - math.Exp(0-math.Pow((x.Number/beta.Number), alpha.Number))) + } + return newNumberFormulaArg((alpha.Number / math.Pow(beta.Number, alpha.Number)) * + math.Pow(x.Number, (alpha.Number-1)) * math.Exp(0-math.Pow((x.Number/beta.Number), alpha.Number))) + } + return newErrorFormulaArg(formulaErrorVALUE, formulaErrorVALUE) +} + +// WEIBULLdotDIST function calculates the Weibull Probability Density Function +// or the Weibull Cumulative Distribution Function for a supplied set of +// parameters. The syntax of the function is: +// +// WEIBULL.DIST(x,alpha,beta,cumulative) +// +func (fn *formulaFuncs) WEIBULLdotDIST(argsList *list.List) formulaArg { + if argsList.Len() != 4 { + return newErrorFormulaArg(formulaErrorVALUE, "WEIBULL.DIST requires 4 arguments") + } + return fn.WEIBULL(argsList) +} + // ZdotTEST function calculates the one-tailed probability value of the // Z-Test. The syntax of the function is: // |