MAX_POWER_POINT
This function finds the point on a photovoltaic IV curve where electrical power is maximized for a given set of single-diode model coefficients. It is a focused alternative to singlediode when only the maximum-power operating point is needed.
The objective is to maximize electrical power along the curve:
P = I V
The function returns the current, voltage, and power at the maximum power point as [i_{mp}, v_{mp}, p_{mp}]. Optional thin-film parameters can be provided to account for recombination effects in CdTe and amorphous-silicon models.
Excel Usage
=MAX_POWER_POINT(photocurrent, saturation_current, resistance_series, resistance_shunt, nNsVth, d_mu_tau, ns_vbi, mpp_solver)
photocurrent(float, required): Photo-generated current (A).saturation_current(float, required): Diode reverse saturation current (A).resistance_series(float, required): Series resistance (ohms).resistance_shunt(float, required): Shunt resistance (ohms).nNsVth(float, required): Product of ideality factor, cells in series, and thermal voltage (V).d_mu_tau(float, optional, default: 0): PVsyst recombination parameter for thin-film modules (V).ns_vbi(float, optional, default: 1000000): PVsyst builtin voltage parameter for thin-film modules (V).mpp_solver(str, optional, default: “brentq”): Numerical solver method.
Returns (list[list]): 2D list [[i_mp, v_mp, p_mp]], or an error string.
Example 1: Standard MPP calculation
Inputs:
| photocurrent | saturation_current | resistance_series | resistance_shunt | nNsVth | mpp_solver |
|---|---|---|---|---|---|
| 5.5 | 2e-10 | 0.5 | 300 | 1.5 | brentq |
Excel formula:
=MAX_POWER_POINT(5.5, 2e-10, 0.5, 300, 1.5, "brentq")
Expected output:
| Result | ||
|---|---|---|
| 5.11038 | 29.057 | 148.492 |
Example 2: Standard MPP using Newton solver
Inputs:
| photocurrent | saturation_current | resistance_series | resistance_shunt | nNsVth | mpp_solver |
|---|---|---|---|---|---|
| 5.5 | 2e-10 | 0.5 | 300 | 1.5 | newton |
Excel formula:
=MAX_POWER_POINT(5.5, 2e-10, 0.5, 300, 1.5, "newton")
Expected output:
| Result | ||
|---|---|---|
| 5.11038 | 29.057 | 148.492 |
Example 3: Higher series resistance lowers power
Inputs:
| photocurrent | saturation_current | resistance_series | resistance_shunt | nNsVth | mpp_solver |
|---|---|---|---|---|---|
| 5.5 | 2e-10 | 0.9 | 300 | 1.5 | brentq |
Excel formula:
=MAX_POWER_POINT(5.5, 2e-10, 0.9, 300, 1.5, "brentq")
Expected output:
| Result | ||
|---|---|---|
| 5.06449 | 27.2753 | 138.135 |
Example 4: Lower shunt resistance case
Inputs:
| photocurrent | saturation_current | resistance_series | resistance_shunt | nNsVth | mpp_solver |
|---|---|---|---|---|---|
| 5.5 | 2e-10 | 0.5 | 150 | 1.5 | brentq |
Excel formula:
=MAX_POWER_POINT(5.5, 2e-10, 0.5, 150, 1.5, "brentq")
Expected output:
| Result | ||
|---|---|---|
| 5.01612 | 29.0464 | 145.7 |
Python Code
Show Code
from pvlib.pvsystem import max_power_point as result_func
import numpy as np
def max_power_point(photocurrent, saturation_current, resistance_series, resistance_shunt, nNsVth, d_mu_tau=0, ns_vbi=1000000, mpp_solver='brentq'):
"""
Calculate the maximum power point (MPP) from single-diode equation coefficients.
See: https://pvlib-python.readthedocs.io/en/stable/reference/generated/pvlib.pvsystem.max_power_point.html
This example function is provided as-is without any representation of accuracy.
Args:
photocurrent (float): Photo-generated current (A).
saturation_current (float): Diode reverse saturation current (A).
resistance_series (float): Series resistance (ohms).
resistance_shunt (float): Shunt resistance (ohms).
nNsVth (float): Product of ideality factor, cells in series, and thermal voltage (V).
d_mu_tau (float, optional): PVsyst recombination parameter for thin-film modules (V). Default is 0.
ns_vbi (float, optional): PVsyst builtin voltage parameter for thin-film modules (V). Default is 1000000.
mpp_solver (str, optional): Numerical solver method. Valid options: Newton, Brentq, Chandrupatla. Default is 'brentq'.
Returns:
list[list]: 2D list [[i_mp, v_mp, p_mp]], or an error string.
"""
try:
il = float(photocurrent)
i0 = float(saturation_current)
rs = float(resistance_series)
rsh = float(resistance_shunt)
nv = float(nNsVth)
d2mt = float(d_mu_tau) if d_mu_tau is not None else 0.0
nvb = float(ns_vbi) if ns_vbi is not None else np.inf
meth = str(mpp_solver) if mpp_solver is not None else "brentq"
res = result_func(
photocurrent=il,
saturation_current=i0,
resistance_series=rs,
resistance_shunt=rsh,
nNsVth=nv,
d2mutau=d2mt,
NsVbi=nvb,
method=meth
)
# res has keys: i_mp, v_mp, p_mp
out = [float(res['i_mp']), float(res['v_mp']), float(res['p_mp'])]
return [out]
except Exception as e:
return f"Error: {str(e)}"