simple-pv-simulator/main.ipynb

158 lines
742 KiB
Plaintext
Raw Normal View History

2024-05-04 09:59:27 +02:00
{
"cells": [
{
"cell_type": "code",
2024-05-04 16:35:55 +02:00
"execution_count": null,
2024-05-04 09:59:27 +02:00
"metadata": {},
2024-05-04 16:35:55 +02:00
"outputs": [],
2024-05-04 09:59:27 +02:00
"source": [
"import matplotlib.pyplot as plt\n",
"import seaborn as sns\n",
"import numpy as np\n",
"import pandas as pd\n",
"from EnergySystem import EnergySystem\n",
"from config import pv_config, grid_config, ess_config\n",
"\n",
"\n",
"data = pd.read_csv('combined_data.csv')\n",
"time_interval = 15 / 60\n",
"\n",
"pv_loss = 0.98\n",
"pv_cost_per_kW = 200\n",
"pv_lifetime = 25\n",
"\n",
"ess_loss = 0.98\n",
"ess_cost_per_kW = 300\n",
"ess_lifetime = 25\n",
"\n",
"grid_loss = 0.98\n",
"sell_price = 0.4 #kWh\n",
"grid_capacity = 5000 #kWh\n",
"\n",
2024-05-04 16:35:55 +02:00
"pv_capacities = np.linspace(0, 28000, 29)\n",
"ess_capacities = np.linspace(0, 28000, 29)\n",
2024-05-04 09:59:27 +02:00
"results = pd.DataFrame(index=pv_capacities, columns = ess_capacities)\n",
"for pv_capacity in pv_capacities:\n",
" print(f\"pv_capacity:{pv_capacity}\")\n",
" for ess_capacity in ess_capacities:\n",
" print(f\"ess_capacity:{ess_capacity}\")\n",
" pv = pv_config(capacity=pv_capacity, \n",
" cost_per_kW=pv_cost_per_kW,\n",
" lifetime=pv_lifetime, \n",
" loss=pv_loss)\n",
" ess = ess_config(capacity=ess_capacity, \n",
" cost_per_kW=ess_cost_per_kW, \n",
" lifetime=ess_lifetime, \n",
" loss=ess_loss,\n",
" charge_power=ess_capacity,\n",
" discharge_power=ess_capacity)\n",
" grid = grid_config(capacity=grid_capacity, \n",
" grid_loss=grid_loss,\n",
" sell_price= sell_price)\n",
" energySystem = EnergySystem(pv_type=pv, \n",
" ess_type=ess, \n",
" grid_type= grid)\n",
" benefit = energySystem.simulate(data, time_interval)\n",
" results.loc[pv_capacity,ess_capacity] = benefit\n",
2024-05-04 16:35:55 +02:00
" generated_list = energySystem.day_generated\n",
" plt.figure()\n",
" plt.plot(generated_list)\n",
" plt.xlabel('day #')\n",
" plt.ylabel('Electricity kWh')\n",
" plt.title(f'pv cap:{pv_capacity}, ess cap:{ess_capacity}')\n",
" plt.savefig(f'plots/{pv_capacity}-{ess_capacity}.png')\n",
" # plt.show()\n",
"\n",
" \n",
"\n",
"# results = results.astype(float)\n",
2024-05-04 09:59:27 +02:00
"\n",
"\n",
"# pv = pv_config(capacity=100000,cost_per_kW=200,lifetime=25,loss=0.95)\n",
"# ess = ess_config(capacity=100000,cost_per_kW=300,lifetime=25,loss=0.95,charge_power=100000,discharge_power=100000)\n",
"# grid = grid_config(price_schedule=price_schedule, capacity=5000, grid_loss=0.95, sell_price=0.4)\n",
"# grid = grid_config(capacity=50000, grid_loss=0.95, sell_price=0.4)\n",
"\n",
"\n",
" # print(benefit)\n"
]
},
{
"cell_type": "code",
2024-05-04 16:35:55 +02:00
"execution_count": 6,
2024-05-04 09:59:27 +02:00
"metadata": {},
"outputs": [],
"source": [
"df=results\n",
2024-05-04 16:35:55 +02:00
"df = df.astype(float)\n",
2024-05-04 09:59:27 +02:00
"df.index = df.index / 1000"
]
},
{
"cell_type": "code",
2024-05-04 16:35:55 +02:00
"execution_count": 7,
2024-05-04 09:59:27 +02:00
"metadata": {},
"outputs": [
{
"data": {
2024-05-04 16:35:55 +02:00
"text/plain": [
"Text(220.72222222222223, 0.5, 'PV Capacity (MW)')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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
2024-05-04 09:59:27 +02:00
"text/plain": [
"<Figure size 2000x1800 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2024-05-04 16:35:55 +02:00
"plt.figure(figsize=(30, 28)) # 设置图形大小\n",
2024-05-04 09:59:27 +02:00
"sns.heatmap(df/1000, annot=True, fmt=\".1f\", cmap='viridis')\n",
"plt.title('Benefit Heatmap Based on PV and ESS Capacities')\n",
"plt.gca().invert_yaxis()\n",
"plt.xlabel('ESS Capacity (MWh)')\n",
"plt.ylabel('PV Capacity (MW)')\n",
2024-05-04 16:35:55 +02:00
"\n",
2024-05-04 09:59:27 +02:00
"\n",
" # pv = pv_config(capacity=100000,cost_per_kW=200,lifetime=25,loss=0.95)\n",
" # ess = ess_config(capacity=100000,cost_per_kW=300,lifetime=25,loss=0.95,charge_power=100000,discharge_power=100000)\n",
" # grid = grid_config(price_schedule=price_schedule, capacity=5000, grid_loss=0.95, sell_price=0.4)\n",
" # grid = grid_config(capacity=50000, grid_loss=0.95, sell_price=0.4)\n",
"\n",
"\n",
" # print(benefit)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
2024-05-04 16:35:55 +02:00
"version": "3.11.9"
2024-05-04 09:59:27 +02:00
}
},
"nbformat": 4,
"nbformat_minor": 2
}