Index: doc/guide/pd/polydispersity.rst
===================================================================
--- doc/guide/pd/polydispersity.rst	(revision eda8b306f3ccd288f34d3e66c7fcf5754162bb2c)
+++ doc/guide/pd/polydispersity.rst	(revision 92d330fd37e00823404a27fd73c3c4985de94fdc)
@@ -42,11 +42,13 @@
 calculations are generally more robust with more data points or more angles.
 
-The following five distribution functions are provided:
+The following distribution functions are provided:
 
 *  *Rectangular Distribution*
+*  *Uniform Distribution*
 *  *Gaussian Distribution*
 *  *Lognormal Distribution*
 *  *Schulz Distribution*
 *  *Array Distribution*
+*  *Boltzmann Distribution*
 
 These are all implemented as *number-average* distributions.
@@ -85,4 +87,33 @@
     Rectangular distribution.
 
+
+
+Uniform Distribution
+^^^^^^^^^^^^^^^^^^^^^^^^
+
+The Uniform Distribution is defined as
+
+    .. math::
+
+        f(x) = \frac{1}{\text{Norm}}
+        \begin{cases}
+          1 & \text{for } |x - \bar x| \leq \sigma \\
+          0 & \text{for } |x - \bar x| > \sigma
+        \end{cases}
+
+    where $\bar x$ is the mean of the distribution, $\sigma$ is the half-width, and
+    *Norm* is a normalization factor which is determined during the numerical
+    calculation.
+
+    Note that the polydispersity is given by
+
+    .. math:: \text{PD} = \sigma / \bar x
+
+    .. figure:: pd_uniform.jpg
+
+        Uniform distribution.
+
+The value $N_\sigma$ is ignored for this distribution.
+
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
 
@@ -183,5 +214,5 @@
 ^^^^^^^^^^^^^^^^^^
 
-This user-definable distribution should be given as as a simple ASCII text
+This user-definable distribution should be given as a simple ASCII text
 file where the array is defined by two columns of numbers: $x$ and $f(x)$.
 The $f(x)$ will be normalized to 1 during the computation.
@@ -202,5 +233,31 @@
 given for the model will have no affect, and will be ignored when computing
 the average.  This means that any parameter with an array distribution will
-not be fittable.
+not be fitable.
+
+.. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
+
+Boltzmann Distribution
+^^^^^^^^^^^^^^^^^^^^^^
+
+The Boltzmann Distribution is defined as
+
+.. math::
+
+    f(x) = \frac{1}{\text{Norm}}
+           \exp\left(-\frac{ | x - \bar x | }{\sigma}\right)
+
+where $\bar x$ is the mean of the distribution and *Norm* is a normalization
+factor which is determined during the numerical calculation.
+The width is defined as
+
+.. math:: \sigma=\frac{k T}{E}
+
+which is the inverse Boltzmann factor,
+where $k$ is the Boltzmann constant, $T$ the temperature in Kelvin and $E$ a
+characteristic energy per particle.
+
+.. figure:: pd_boltzmann.jpg
+
+    Boltzmann distribution.
 
 .. ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
Index: sasmodels/weights.py
===================================================================
--- sasmodels/weights.py	(revision 2d81cfe3be42579d563407fb9275b7b516fee234)
+++ sasmodels/weights.py	(revision 3d5824792e80506c5c40f05fb2ddc2234a8acedf)
@@ -97,4 +97,18 @@
         return x, px
 
+class UniformDispersion(Dispersion):
+    r"""
+    Uniform dispersion, with width $\sigma$.
+
+    .. math::
+
+        w = 1
+    """
+    type = "uniform"
+    default = dict(npts=35, width=0, nsigmas=None)
+    def _weights(self, center, sigma, lb, ub):
+        x = np.linspace(center-sigma, center+sigma, self.npts)
+        x = x[(x >= lb) & (x <= ub)]
+        return x, np.ones_like(x)
 
 class RectangleDispersion(Dispersion):
@@ -107,10 +121,9 @@
     """
     type = "rectangle"
-    default = dict(npts=35, width=0, nsigmas=1.70325)
-    def _weights(self, center, sigma, lb, ub):
-        x = self._linspace(center, sigma, lb, ub)
-        x = x[np.fabs(x-center) <= np.fabs(sigma)*sqrt(3.0)]
-        return x, np.ones_like(x)
-
+    default = dict(npts=35, width=0, nsigmas=1.73205)
+    def _weights(self, center, sigma, lb, ub):
+         x = self._linspace(center, sigma, lb, ub)
+         x = x[np.fabs(x-center) <= np.fabs(sigma)*sqrt(3.0)]
+         return x, np.ones_like(x)
 
 class LogNormalDispersion(Dispersion):
@@ -190,4 +203,18 @@
         return x, px
 
+class BoltzmannDispersion(Dispersion):
+    r"""
+    Boltzmann dispersion, with $\sigma=k T/E$.
+
+    .. math::
+
+        w = \exp\left( -|x - c|/\sigma\right)
+    """
+    type = "boltzmann"
+    default = dict(npts=35, width=0, nsigmas=3)
+    def _weights(self, center, sigma, lb, ub):
+        x = self._linspace(center, sigma, lb, ub)
+        px = np.exp(-np.abs(x-center) / np.abs(sigma))
+        return x, px
 
 # dispersion name -> disperser lookup table.
@@ -196,8 +223,10 @@
 MODELS = OrderedDict((d.type, d) for d in (
     RectangleDispersion,
+    UniformDispersion,
     ArrayDispersion,
     LogNormalDispersion,
     GaussianDispersion,
     SchulzDispersion,
+    BoltzmannDispersion
 ))
 
