Load modeling is one of the most important aspects when it comes to the stability analysis of electric power systems. The way we model loads significantly impacts the results of the analyses. The so-called ZIP model considers the voltage dependency of loads and serves this purpose very well. ZIP stands for the three defined load types: Z = constant impedance, I = constant current, and P = constant power.
In this post, I explain the basics of load modeling. On top of that, I show how to determine the ZIP model parameters from given voltage and power data. The parameter identification is implemented in Python and is available for download.
Load model basics – the ZIP model
As mentioned before, the ZIP model is the most commonly used model to represent loads in electric power systems. The ZIP model expresses the load with exponential voltage dependency where the exponent determines the type of the load. Below you can find the mathematical formulation of the ZIP model for an active power load. However, the same formulation is also suitable for reactive loads.
- P = load at voltage V (pu)
- P0 = nominal load (pu)
- V = voltage (pu)
- V0 = nominal voltage (pu)
- exp = 0/1/2 for const. power/current/impedance
The figure below shows the voltage dependency of the three load types derived from the formula above. The constant power load (red) is independent of the voltage. The constant current load (blue) changes linearly with the voltage whereas the constant impedance load (green) changes quadratically.
Load model parameter identification
In the following, I present the defined load model and an approach to identify the load model parameters given the voltage and power data as time series. I have implemented the parameter identification in Python using a linear least-squares approach.
Assume you have measurements of the active (or reactive) power of a load and the corresponding voltage – which you can use to identify the load model parameters.
The load model
Since there are three types defined in the ZIP model, I assume that the total load is composed of a combination of the three types. Hence, I define the model as the sum of each type as shown below.
- Ptot = total load, e.g. from measurement (pu)
- P0,Z, P0,I, P0,P = ZIP type components of the load (pu)
- V = voltage, e.g. from measurement (pu)
- V0 = nominal voltage (pu)
Linear least-squares (LSQ) problem
To determine the parameters of the model, I use a linear LSQ approach which can be formulated as a minimization problem as shown below:
- A = design matrix (describing the ZIP model)
- b = target vector (power of the load)
- x = optimization variables (contribution from each ZIP type, i.e. P0, Z, P0, I, P0, P – please continue reading below for further information)
- lb, ub = lower and upper bounds of the optimization variables
Now, we need to express the load model with the design matrix and the target vector of the LSQ problem.
The columns of the design matrix A describe the three ZIP types while the rows represent the N samples of the time series, resulting in an (N x 3)-matrix. The target vector b describes the N samples of the total load Ptot resulting in an (N x 1)- vector. The optimization variables (P0,Z, P0,I, P0,P) describe the three ZIP type components of the total load. The upper and lower bound of the optimization variables are set to be larger or equal to zero.
Below you can find the complete LSQ formulation for the load model parameter identification.
Application of the load model
In this section, I apply the model to artificial data that I have generated in Python. For additional insights, the sensitivity of the model to higher-order voltage dependency and noise is analyzed.
In the first step, random voltage samples between 0.9 and 1.1 pu are generated. The voltage samples are then used to generate three individual loads (covering the three ZIP types) with different nominal power. The total load is the sum of the three individual loads. Then, the load model parameters are determined by applying the LSQ approach using the total load and voltage data.
The upper plot in the figure below shows the randomly generated voltage samples. The lower plot shows the three individual loads (generated using the voltage samples), the total load, and the estimation derived from the load model.
Obviously, the load model works great (MSE = 1.42 · 10-29) for the given problem correctly identifying the three ZIP components (P0,Z = 3, P0,I =2, and P0,P = 1). The identified model is shown below.
Higher-order voltage dependency
Now you could say that the problem above is too easy – and I would agree. We could ask the question of how the model performs under conditions when the total load is composed of components that have a higher-order voltage dependency.
Therefore, I add another load component to the total load to analyze the higher-order voltage dependency behavior of the model. The magnitude of the additional component is equal to 2 (which is the average of the other three components) and the order is varied from 0 up to 10. The extended model to generate the artificial data of the total load is shown below.
To get additional insights, I also extend the original ZIP model (which has order 2 – in black) by additional terms of higher-order (in red) as shown below.
The plot below shows the error of the model versus the order of the total load (input data) for load models of different orders. The standard ZIP model (order = 2) is shown in black. It can be observed that the error starts to significantly increase when the load order is above 4. This makes total sense because the higher-order components cannot be expressed by the lower-order model.
However, by increasing the order of the model, the estimation can be significantly improved. The plot shows nicely that the higher-order models work better. Again, this is expected as the higher-order terms of the model explain the higher-order components of the total load.
So what do we learn from that? Always keep in mind the limitations of the model. So if you try to determine the load model parameters and the performance is unsatisfactory you might need to increase the order of your model. This means you would deviate from the common ZIP model, and, in my opinion, that is no problem if it works for you.
Sensitivity to noise
To get a grip on how the model performs with noisy data, I apply uniformly distributed noise to the power and voltage data and analyze how this affects the performance. The amplitude of the noise varies between 0 – 0.1 pu of the nominal value of the respective signal, i.e. for Ptot between 0 – 0.6 pu (nominal value of Ptot = 6 pu) and for V between 0 – 0.1 (nominal value of voltage = 1 pu).
I hope you don’t get confused with all these per-unit values – it is basically per unit of per unit. 🙂
The plot below shows the sensitivity of the LSQ approach to noise on the power data for different levels of noise on the voltage data. Clearly, if there is no noise on either of the signals, the MSE is basically zero and the load model parameters can be identified properly. However, if we apply noise to the signals the error of the estimation increases rapidly. Up to about 0.08 pu, the noise on the power signal dominates the error, above that the noise on the voltage signal becomes dominant.
I hope you find this article insightful. If so, you might also like the following: How to check the consistency of PMU data?
More insights to follow in the next article.