Skip to contents

Fits a polynomial curve to three or more points from a pump characteristic curve. This allows solving for an operating point of the pump in a piping system. A portion of this is based on


pumpcurve(Q = NULL, h = NULL, eq = "poly1", units = c("SI", "Eng"))



Numeric vector of flow rates for selected points on the pump curve [\(m^3 s^{-1}\) or \(ft^3 s^{-1}\)]


Numeric vector of heads for selected points on the pump curve [\(m\) or \(ft\)]


Character vector identifying the for of equation to fit (see details)


character vector that contains the system of units [options are SI for International System of Units and Eng for English (US customary) units.


Returns an object of class pumpcurve consisting of a list including:

  • curve - a function defining the curve that is fit to the data

  • eqn - a character vector of the equation for the curve

  • r2 - the coefficient of determination for the curve fit, \(R^2\)

  • p - a plot object of the fit curve

  • units - the units system passed to the function


The form of the equation fit to the input points may be one of the following, as determined by the eq input parameter.

eqequation form
poly1\(h = a + {b}{Q} + {c}{Q}^2\)
poly2\(h = a + {c}{Q}^2\)
poly3\(h = h_{shutoff} + {c}{Q}^2\)

where \(h_{shutoff}\) is the head on the pump curve associated with \(Q=0\). The shutoff head at \(Q=0\) should be included in the input vectors if the poly3 equation form is to be used.


Ed Maurer


#Input in Eng units - use \code{units} package for easy unit conversion
qgpm <- units::set_units(c(0, 5000, 7850), gallons/minute)
qcfs <- units::set_units(qgpm, ft^3/s)
hft <- c(81, 60, 20) #units are already in ft so setting units is optional
pumpcurve(Q = qcfs, h = hft, eq = "poly2", units = "Eng")
#> $curve
#> function (x) 
#> coef(hqfit)[1] + x^2 * coef(hqfit)[2]
#> <bytecode: 0x557061161eb8>
#> <environment: 0x557061164040>
#> $eqn
#> [1] "h == 82.5 - 0.201*Q^2"
#> $r2
#> [1] 0.995
#> $p

#> $units
#> [1] "Eng"
#> attr(,"class")
#> [1] "pumpcurve"