Python scipy.optimize.newton() Examples
The following are 30
code examples of scipy.optimize.newton().
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example.
You may also want to check out all available functions/classes of the module
scipy.optimize
, or try the search function
.
Example #1
Source File: test_loss.py From pygbm with MIT License | 6 votes |
def test_derivatives(loss, x0, y_true): # Check that gradients are zero when the loss is minimized on 1D array # using the Newton-Raphson and the first and second order derivatives # computed by the Loss instance. loss = _LOSSES[loss]() y_true = np.array([y_true], dtype=np.float32) x0 = np.array([x0], dtype=np.float32).reshape(1, 1) get_gradients, get_hessians = get_derivatives_helper(loss) def func(x): return loss(y_true, x) def fprime(x): return get_gradients(y_true, x) def fprime2(x): return get_hessians(y_true, x) optimum = newton(func, x0=x0, fprime=fprime, fprime2=fprime2) assert np.allclose(loss.inverse_link_function(optimum), y_true) assert np.allclose(loss(y_true, optimum), 0) assert np.allclose(get_gradients(y_true, optimum), 0)
Example #2
Source File: eos_mix.py From thermo with MIT License | 6 votes |
def solve_T(self, P, V, quick=True): r'''Generic method to calculate `T` from a specified `P` and `V`. Provides SciPy's `newton` solver, and iterates to solve the general equation for `P`, recalculating `a_alpha` as a function of temperature using `a_alpha_and_derivatives` each iteration. Parameters ---------- P : float Pressure, [Pa] V : float Molar volume, [m^3/mol] quick : bool, optional Unimplemented, although it may be possible to derive explicit expressions as done for many pure-component EOS Returns ------- T : float Temperature, [K] ''' self.Tc = sum(self.Tcs)/self.N # -4 goes back from object, GCEOS return super(type(self).__mro__[-3], self).solve_T(P=P, V=V, quick=quick)
Example #3
Source File: test_loss.py From Mastering-Elasticsearch-7.0 with MIT License | 6 votes |
def test_derivatives(loss, x0, y_true): # Check that gradients are zero when the loss is minimized on 1D array # using Halley's method with the first and second order derivatives # computed by the Loss instance. loss = _LOSSES[loss]() y_true = np.array([y_true], dtype=Y_DTYPE) x0 = np.array([x0], dtype=Y_DTYPE).reshape(1, 1) get_gradients, get_hessians = get_derivatives_helper(loss) def func(x): return loss(y_true, x) def fprime(x): return get_gradients(y_true, x) def fprime2(x): return get_hessians(y_true, x) optimum = newton(func, x0=x0, fprime=fprime, fprime2=fprime2) assert np.allclose(loss.inverse_link_function(optimum), y_true) assert np.allclose(loss(y_true, optimum), 0) assert np.allclose(get_gradients(y_true, optimum), 0)
Example #4
Source File: problems_and_results.py From capytaine with GNU General Public License v3.0 | 5 votes |
def wavenumber(self): if self.depth == np.infty or self.omega**2*self.depth/self.g > 20: return self.omega**2/self.g else: return newton(lambda x: x*np.tanh(x) - self.omega**2*self.depth/self.g, x0=1.0)/self.depth
Example #5
Source File: etvs.py From phoebe2 with GNU General Public License v3.0 | 5 votes |
def crossing(b, component, time, dynamics_method='keplerian', ltte=True, tol=1e-4, maxiter=1000): """ tol in days """ def projected_separation_sq(time, b, dynamics_method, cind1, cind2, ltte=True): """ """ #print "*** projected_separation_sq", time, dynamics_method, cind1, cind2, ltte times = np.array([time]) if dynamics_method in ['nbody', 'rebound']: # TODO: make sure that this takes systemic velocity and corrects positions and velocities (including ltte effects if enabled) ts, xs, ys, zs, vxs, vys, vzs = dynamics.nbody.dynamics_from_bundle(b, times, compute=None, ltte=ltte) elif dynamics_method=='bs': ts, xs, ys, zs, vxs, vys, vzs = dynamics.nbody.dynamics_from_bundle_bs(b, times, compute, ltte=ltte) elif dynamics_method=='keplerian': # TODO: make sure that this takes systemic velocity and corrects positions and velocities (including ltte effects if enabled) ts, xs, ys, zs, vxs, vys, vzs = dynamics.keplerian.dynamics_from_bundle(b, times, compute=None, ltte=ltte, return_euler=False) else: raise NotImplementedError return (xs[cind2][0]-xs[cind1][0])**2 + (ys[cind2][0]-ys[cind1][0])**2 # TODO: optimize this by allowing to pass cind1 and cind2 directly (and fallback to this if they aren't) starrefs = b.hierarchy.get_stars() cind1 = starrefs.index(component) cind2 = starrefs.index(b.hierarchy.get_sibling_of(component)) # TODO: provide options for tol and maxiter (in the frontend computeoptionsp)? return newton(projected_separation_sq, x0=time, args=(b, dynamics_method, cind1, cind2, ltte), tol=tol, maxiter=maxiter)
Example #6
Source File: cons.py From xalpha with MIT License | 5 votes |
def xirr(cashflows, guess=0.1): """ calculate the Internal Rate of Return of a series of cashflows at irregular intervals. :param cashflows: a list, in which each element is a tuple of the form (date, amount), where date is a datetime object and amount is an integer or floating number. Cash outflows (investments) are represented with negative amounts, and cash inflows (returns) are positive amounts. :param guess: floating number, a guess at the xirr rate solution to be used as a starting point for the numerical solution :returns: the IRR as a single floating number """ return optimize.newton(lambda r: xnpv(r, cashflows), guess)
Example #7
Source File: Grid.py From sarpy with MIT License | 5 votes |
def _get_broadening_factor(self): """ Gets the *broadening factor*, assuming that `WgtFunct` has been properly populated. Returns ------- float the broadening factor """ if self.WgtType is not None and self.WgtType.WindowName is not None: window_name = self.WgtType.WindowName.upper() coef = None if window_name == 'UNIFORM': coef = 1.0 elif window_name == 'HAMMING': try: # noinspection PyTypeChecker coef = float(self.WgtType.get_parameter_value(None, 0.54)) # just get first parameter - name? except ValueError: coef = 0.54 elif window_name == 'HANNING': coef = 0.5 if coef is not None: zero = newton(_hamming_ipr, 0.1, args=(coef,), tol=1e-12, maxiter=10000) return 2*zero if self.WgtFunct is None: return None # nothing to be done # solve for the half-power point in an oversampled impulse response OVERSAMPLE = 1024 impulse_response = numpy.abs( numpy.fft.fft(self.WgtFunct, self.WgtFunct.size*OVERSAMPLE))/numpy.sum(self.WgtFunct) ind = numpy.flatnonzero(impulse_response < 1/numpy.sqrt(2))[0] # find first index with less than half power. # linearly interpolate between impulse_response[ind-1] and impulse_response[ind] to find 1/sqrt(2) v0 = impulse_response[ind-1] v1 = impulse_response[ind] zero_ind = ind - 1 + (1./numpy.sqrt(2) - v0)/(v1 - v0) return 2*zero_ind/OVERSAMPLE
Example #8
Source File: eos.py From thermo with MIT License | 5 votes |
def solve_T(self, P, V, quick=True): '''Generic method to calculate `T` from a specified `P` and `V`. Provides SciPy's `newton` solver, and iterates to solve the general equation for `P`, recalculating `a_alpha` as a function of temperature using `a_alpha_and_derivatives` each iteration. Parameters ---------- P : float Pressure, [Pa] V : float Molar volume, [m^3/mol] quick : bool, optional Whether to use a SymPy cse-derived expression (3x faster) or individual formulas - not applicable where a numerical solver is used. Returns ------- T : float Temperature, [K] ''' def to_solve(T): a_alpha = self.a_alpha_and_derivatives(T, full=False) P_calc = R*T/(V-self.b) - a_alpha/(V*V + self.delta*V + self.epsilon) return P_calc - P return newton(to_solve, self.Tc*0.5)
Example #9
Source File: activity.py From thermo with MIT License | 5 votes |
def bubble_at_P(P, zs, vapor_pressure_eqns, fugacities=None, gammas=None): '''Calculates bubble point for a given pressure Parameters ---------- P : float Pressure, [Pa] zs : list[float] Overall mole fractions of all species, [-] vapor_pressure_eqns : list[functions] Temperature dependent function for each specie, Returns Psat, [Pa] fugacities : list[float], optional fugacities of each species, defaults to list of ones, [-] gammas : list[float], optional gammas of each species, defaults to list of ones, [-] Returns ------- Tbubble : float, optional Temperature of bubble point at pressure `P`, [K] ''' def bubble_P_error(T): Psats = [VP(T) for VP in vapor_pressure_eqns] Pcalc = bubble_at_T(zs, Psats, fugacities, gammas) return P - Pcalc T_bubble = newton(bubble_P_error, 300) return T_bubble
Example #10
Source File: test_bem_green_functions.py From capytaine with GNU General Public License v3.0 | 5 votes |
def wave_part_Green_function(Xi, Xj, omega, depth, core=Delhommeau_f90): if depth == np.infty: wavenumber = omega**2 / gravity else: wavenumber = newton(lambda x: x*np.tanh(x) - omega**2*depth/gravity, x0=1.0)/depth if depth < np.infty: ambda, ar, nexp = core.old_prony_decomposition.lisc(omega**2 * depth/gravity, wavenumber * depth) if depth == np.infty: return core.green_wave.wave_part_infinite_depth(wavenumber, Xi, Xj, *tabulation[core]) else: return core.green_wave.wave_part_finite_depth(wavenumber, Xi, Xj, depth, *tabulation[core], ambda, ar, 31)
Example #11
Source File: chemical.py From thermo with MIT License | 5 votes |
def calculate_PS(self, P, S): def to_solve(T): self.calculate(T, P) return self.S - S return newton(to_solve, self.T)
Example #12
Source File: chemical.py From thermo with MIT License | 5 votes |
def calculate_TS(self, T, S): def to_solve(P): self.calculate(T, P) return self.S - S return newton(to_solve, self.P)
Example #13
Source File: chemical.py From thermo with MIT License | 5 votes |
def calculate_TH(self, T, H): def to_solve(P): self.calculate(T, P) return self.H - H return newton(to_solve, self.P)
Example #14
Source File: mixture.py From thermo with MIT License | 5 votes |
def calculate_PS(self, P, S): def to_solve(T): self.calculate(T, P) return self.S - S return newton(to_solve, self.T)
Example #15
Source File: mixture.py From thermo with MIT License | 5 votes |
def calculate_TS(self, T, S): def to_solve(P): self.calculate(T, P) return self.S - S return newton(to_solve, self.P)
Example #16
Source File: mixture.py From thermo with MIT License | 5 votes |
def calculate_PH(self, P, H): def to_solve(T): self.calculate(T, P) return self.H - H return newton(to_solve, self.T)
Example #17
Source File: mixture.py From thermo with MIT License | 5 votes |
def calculate_TH(self, T, H): def to_solve(P): self.calculate(T, P) return self.H - H return newton(to_solve, self.P)
Example #18
Source File: _continuous_distns.py From Splunking-Crime with GNU Affero General Public License v3.0 | 5 votes |
def _digammainv(y): # Inverse of the digamma function (real positive arguments only). # This function is used in the `fit` method of `gamma_gen`. # The function uses either optimize.fsolve or optimize.newton # to solve `sc.digamma(x) - y = 0`. There is probably room for # improvement, but currently it works over a wide range of y: # >>> y = 64*np.random.randn(1000000) # >>> y.min(), y.max() # (-311.43592651416662, 351.77388222276869) # x = [_digammainv(t) for t in y] # np.abs(sc.digamma(x) - y).max() # 1.1368683772161603e-13 # _em = 0.5772156649015328606065120 func = lambda x: sc.digamma(x) - y if y > -0.125: x0 = np.exp(y) + 0.5 if y < 10: # Some experimentation shows that newton reliably converges # must faster than fsolve in this y range. For larger y, # newton sometimes fails to converge. value = optimize.newton(func, x0, tol=1e-10) return value elif y > -3: x0 = np.exp(y/2.332) + 0.08661 else: x0 = 1.0 / (-y - _em) value, info, ier, mesg = optimize.fsolve(func, x0, xtol=1e-11, full_output=True) if ier != 1: raise RuntimeError("_digammainv: fsolve failed, y = %r" % y) return value[0] ## Gamma (Use MATLAB and MATHEMATICA (b=theta=scale, a=alpha=shape) definition) ## gamma(a, loc, scale) with a an integer is the Erlang distribution ## gamma(1, loc, scale) is the Exponential distribution ## gamma(df/2, 0, 2) is the chi2 distribution with df degrees of freedom.
Example #19
Source File: filter_design.py From GraphicDesignPatternByPython with MIT License | 5 votes |
def _norm_factor(p, k): """ Numerically find frequency shift to apply to delay-normalized filter such that -3 dB point is at 1 rad/sec. `p` is an array_like of polynomial poles `k` is a float gain First 10 values are listed in "Bessel Scale Factors" table, "Bessel Filters Polynomials, Poles and Circuit Elements 2003, C. Bond." """ p = asarray(p, dtype=complex) def G(w): """ Gain of filter """ return abs(k / prod(1j*w - p)) def cutoff(w): """ When gain = -3 dB, return 0 """ return G(w) - 1/np.sqrt(2) return optimize.newton(cutoff, 1.5)
Example #20
Source File: filter_design.py From lambda-packs with MIT License | 5 votes |
def _bessel_zeros(N): """ Find zeros of ordinary Bessel polynomial of order `N`, by root-finding of modified Bessel function of the second kind """ if N == 0: return asarray([]) # Generate starting points x0 = _campos_zeros(N) # Zeros are the same for exp(1/x)*K_{N+0.5}(1/x) and Nth-order ordinary # Bessel polynomial y_N(x) def f(x): return special.kve(N+0.5, 1/x) # First derivative of above def fp(x): return (special.kve(N-0.5, 1/x)/(2*x**2) - special.kve(N+0.5, 1/x)/(x**2) + special.kve(N+1.5, 1/x)/(2*x**2)) # Starting points converge to true zeros x = _aberth(f, fp, x0) # Improve precision using Newton's method on each for i in range(len(x)): x[i] = optimize.newton(f, x[i], fp, tol=1e-15) # Average complex conjugates to make them exactly symmetrical x = np.mean((x, x[::-1].conj()), 0) # Zeros should sum to -1 if abs(np.sum(x) + 1) > 1e-15: raise RuntimeError('Generated zeros are inaccurate') return x
Example #21
Source File: filter_design.py From lambda-packs with MIT License | 5 votes |
def _norm_factor(p, k): """ Numerically find frequency shift to apply to delay-normalized filter such that -3 dB point is at 1 rad/sec. `p` is an array_like of polynomial poles `k` is a float gain First 10 values are listed in "Bessel Scale Factors" table, "Bessel Filters Polynomials, Poles and Circuit Elements 2003, C. Bond." """ p = asarray(p, dtype=complex) def G(w): """ Gain of filter """ return abs(k / prod(1j*w - p)) def cutoff(w): """ When gain = -3 dB, return 0 """ return G(w) - 1/np.sqrt(2) return optimize.newton(cutoff, 1.5)
Example #22
Source File: _continuous_distns.py From lambda-packs with MIT License | 5 votes |
def _digammainv(y): # Inverse of the digamma function (real positive arguments only). # This function is used in the `fit` method of `gamma_gen`. # The function uses either optimize.fsolve or optimize.newton # to solve `sc.digamma(x) - y = 0`. There is probably room for # improvement, but currently it works over a wide range of y: # >>> y = 64*np.random.randn(1000000) # >>> y.min(), y.max() # (-311.43592651416662, 351.77388222276869) # x = [_digammainv(t) for t in y] # np.abs(sc.digamma(x) - y).max() # 1.1368683772161603e-13 # _em = 0.5772156649015328606065120 func = lambda x: sc.digamma(x) - y if y > -0.125: x0 = np.exp(y) + 0.5 if y < 10: # Some experimentation shows that newton reliably converges # must faster than fsolve in this y range. For larger y, # newton sometimes fails to converge. value = optimize.newton(func, x0, tol=1e-10) return value elif y > -3: x0 = np.exp(y/2.332) + 0.08661 else: x0 = 1.0 / (-y - _em) value, info, ier, mesg = optimize.fsolve(func, x0, xtol=1e-11, full_output=True) if ier != 1: raise RuntimeError("_digammainv: fsolve failed, y = %r" % y) return value[0] ## Gamma (Use MATLAB and MATHEMATICA (b=theta=scale, a=alpha=shape) definition) ## gamma(a, loc, scale) with a an integer is the Erlang distribution ## gamma(1, loc, scale) is the Exponential distribution ## gamma(df/2, 0, 2) is the chi2 distribution with df degrees of freedom.
Example #23
Source File: num.py From pwtools with BSD 3-Clause "New" or "Revised" License | 5 votes |
def _findroot(self, func, x0=None, xab=None, **kwds): """Find root of `func` by Newton's method if `x0` is given or Brent's method if `xab` is given. If neither is given, then ``xab=[self.x[0],self.x[-1]]`` and Brent's method is used. Parameters ---------- func : callable, must accept a scalar and retun a scalar x0 : float start guess for Newton's secant method xab : sequence of length 2 start bracket for Brent's method, root must lie in between **kwds : passed to scipy root finder (newton() or brentq()) Returns ------- xx : scalar the root of func(x) """ if x0 is not None: xx = optimize.newton(func, x0, **kwds) else: if xab is None: xab = [self.x[0], self.x[-1]] xx = optimize.brentq(func, xab[0], xab[1], **kwds) return xx
Example #24
Source File: ConsIndShockModel.py From HARK with Apache License 2.0 | 5 votes |
def addSSmNrm(self,solution): ''' Finds steady state (normalized) market resources and adds it to the solution. This is the level of market resources such that the expectation of market resources in the next period is unchanged. This value doesn't necessarily exist. Parameters ---------- solution : ConsumerSolution Solution to this period's problem, which must have attribute cFunc. Returns ------- solution : ConsumerSolution Same solution that was passed, but now with the attribute mNrmSS. ''' # Make a linear function of all combinations of c and m that yield mNext = mNow mZeroChangeFunc = lambda m : (1.0-self.PermGroFac/self.Rfree)*m + (self.PermGroFac/self.Rfree)*self.ExIncNext # Find the steady state level of market resources searchSSfunc = lambda m : solution.cFunc(m) - mZeroChangeFunc(m) # A zero of this is SS market resources m_init_guess = self.mNrmMinNow + self.ExIncNext # Minimum market resources plus next income is okay starting guess try: mNrmSS = newton(searchSSfunc,m_init_guess) except: mNrmSS = None # Add mNrmSS to the solution and return it solution.mNrmSS = mNrmSS return solution
Example #25
Source File: filter_design.py From GraphicDesignPatternByPython with MIT License | 5 votes |
def _bessel_zeros(N): """ Find zeros of ordinary Bessel polynomial of order `N`, by root-finding of modified Bessel function of the second kind """ if N == 0: return asarray([]) # Generate starting points x0 = _campos_zeros(N) # Zeros are the same for exp(1/x)*K_{N+0.5}(1/x) and Nth-order ordinary # Bessel polynomial y_N(x) def f(x): return special.kve(N+0.5, 1/x) # First derivative of above def fp(x): return (special.kve(N-0.5, 1/x)/(2*x**2) - special.kve(N+0.5, 1/x)/(x**2) + special.kve(N+1.5, 1/x)/(2*x**2)) # Starting points converge to true zeros x = _aberth(f, fp, x0) # Improve precision using Newton's method on each for i in range(len(x)): x[i] = optimize.newton(f, x[i], fp, tol=1e-15) # Average complex conjugates to make them exactly symmetrical x = np.mean((x, x[::-1].conj()), 0) # Zeros should sum to -1 if abs(np.sum(x) + 1) > 1e-15: raise RuntimeError('Generated zeros are inaccurate') return x
Example #26
Source File: filter_design.py From Splunking-Crime with GNU Affero General Public License v3.0 | 5 votes |
def _norm_factor(p, k): """ Numerically find frequency shift to apply to delay-normalized filter such that -3 dB point is at 1 rad/sec. `p` is an array_like of polynomial poles `k` is a float gain First 10 values are listed in "Bessel Scale Factors" table, "Bessel Filters Polynomials, Poles and Circuit Elements 2003, C. Bond." """ p = asarray(p, dtype=complex) def G(w): """ Gain of filter """ return abs(k / prod(1j*w - p)) def cutoff(w): """ When gain = -3 dB, return 0 """ return G(w) - 1/np.sqrt(2) return optimize.newton(cutoff, 1.5)
Example #27
Source File: _continuous_distns.py From GraphicDesignPatternByPython with MIT License | 5 votes |
def _digammainv(y): # Inverse of the digamma function (real positive arguments only). # This function is used in the `fit` method of `gamma_gen`. # The function uses either optimize.fsolve or optimize.newton # to solve `sc.digamma(x) - y = 0`. There is probably room for # improvement, but currently it works over a wide range of y: # >>> y = 64*np.random.randn(1000000) # >>> y.min(), y.max() # (-311.43592651416662, 351.77388222276869) # x = [_digammainv(t) for t in y] # np.abs(sc.digamma(x) - y).max() # 1.1368683772161603e-13 # _em = 0.5772156649015328606065120 func = lambda x: sc.digamma(x) - y if y > -0.125: x0 = np.exp(y) + 0.5 if y < 10: # Some experimentation shows that newton reliably converges # must faster than fsolve in this y range. For larger y, # newton sometimes fails to converge. value = optimize.newton(func, x0, tol=1e-10) return value elif y > -3: x0 = np.exp(y/2.332) + 0.08661 else: x0 = 1.0 / (-y - _em) value, info, ier, mesg = optimize.fsolve(func, x0, xtol=1e-11, full_output=True) if ier != 1: raise RuntimeError("_digammainv: fsolve failed, y = %r" % y) return value[0] ## Gamma (Use MATLAB and MATHEMATICA (b=theta=scale, a=alpha=shape) definition) ## gamma(a, loc, scale) with a an integer is the Erlang distribution ## gamma(1, loc, scale) is the Exponential distribution ## gamma(df/2, 0, 2) is the chi2 distribution with df degrees of freedom.
Example #28
Source File: radiators.py From CityEnergyAnalyst with MIT License | 5 votes |
def calc_radiator(Qh, tair, Qh0, tair0, tsh0, trh0): """ Calculates the supply and return temperature as well as the flow rate of water in radiators similar to the model implemented by Holst (1996) using a Newton-Raphson solver. :param Qh: Space heating demand in the building :param tair: environment temperature in the building :param Qh0: nominal radiator power :param tair0: :param tsh0: :param trh0: :return: [Holst} S. Holst (1996) "TRNSYS-Models for Radiator Heating Systems" """ # TODO: add documentation and sources nh = 0.3 # radiator constant if Qh > 0 or Qh < 0: # use radiator function also for sensible cooling panels (ceiling cooling, chilled beam,...) tair = tair + 273 tair0 = tair0 + 273 tsh0 = tsh0 + 273 trh0 = trh0 + 273 mCw0 = Qh0 / (tsh0 - trh0) # minimum LMRT0 = lmrt(tair0, trh0, tsh0) delta_t = Qh / mCw0 result = newton(fh, trh0, args=(delta_t, Qh0, Qh, tair, LMRT0, nh), maxiter=100, tol=0.01) - 273 trh = result.real tsh = trh + Qh / mCw0 mCw = Qh / (tsh - trh) else: mCw = 0 tsh = np.nan trh = np.nan # return floats with numpy function. Needed when np.vectorize is use to call this function return np.float(tsh), np.float(trh), np.float(mCw) # C, C, W/C
Example #29
Source File: bond_ytm.py From Mastering-Python-for-Finance-source-codes with MIT License | 5 votes |
def bond_ytm(price, par, T, coup, freq=2, guess=0.05): freq = float(freq) periods = T*freq coupon = coup/100.*par/freq dt = [(i+1)/freq for i in range(int(periods))] ytm_func = lambda(y): \ sum([coupon/(1+y/freq)**(freq*t) for t in dt]) + \ par/(1+y/freq)**(freq*t) - price return optimize.newton(ytm_func, guess)
Example #30
Source File: negative_binomial.py From DiscoSnp with GNU Affero General Public License v3.0 | 5 votes |
def neg_bin_fit(vec, init=0.0001): ''' Function to fit negative binomial to data @param vec: The data vector used to fit the negative binomial distribution @param init: Set init to a number close to 0, and you will always converge ''' if not vec: raise ValueError("Data must be specified") est_r = newton(r_derv, init, args=(vec,)) est_p = p_equa(est_r, vec) return est_r, est_p # r = 40 # p = 0.5 # size = 100000 # # import matplotlib.pyplot as plt # random_nb_data = np.random.negative_binomial(r, p, size) # print(random_nb_data) # a=[] # for i in random_nb_data: # a.append(i) # _ = plt.hist(a, bins='auto') # plt.title("Histogram with 'auto' bins") # plt.show() # print(neg_bin_fit(a))