{ "cells": [ { "cell_type": "code", "execution_count": null, "id": "a0eac04f-4d85-447e-9fef-d38fd4fcfed2", "metadata": {}, "outputs": [], "source": [ "import numpy as np \n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import matplotlib.dates as mdates" ] }, { "cell_type": "markdown", "id": "f6607e3c-b298-4d3a-a902-611c682ebb2a", "metadata": {}, "source": [ "# Exercícios" ] }, { "cell_type": "markdown", "id": "f0b008e4-2702-441c-ad93-7f10ac320474", "metadata": {}, "source": [ "## Parte A" ] }, { "cell_type": "markdown", "id": "0cdb1bec-7883-4788-a2a0-211556d46852", "metadata": {}, "source": [ "Considera uma central mini-hídrica equipada com um grupo turbina-gerador com potência nominal de 800 kW, num rio cuja curva de duração de caudais pode ser expressa através da função:\n", "\n", "$\\dot{v}(t) = 16t^{-0.75}$\n", "\n", "em m$^3$/s, sendo $t$ o número de dias com caudal igual ou superior a $\\dot{v}$.\n", "\n", "A altura útil de queda é de 100 m. Estima-se que a central esteja parada durante 15 dias por insuficiência de queda devido a caudal elevado. A turbina é do tipo Francis, com os seguintes limites de exploração: $\\alpha_1 = 0.35$, $\\alpha_2 = 1.15$. O rendimento total do sistema é de 70\\%." ] }, { "cell_type": "markdown", "id": "c214cd12-3c00-4606-a5d6-6aea6d7b924f", "metadata": {}, "source": [ "### **1.** Determina o caudal para o funcionamento da central à potência nominal. Indica o tempo de duração de caudal respetivo, e explica o seu significado." ] }, { "cell_type": "code", "execution_count": null, "id": "6fc1ccc2-5be2-4de7-958a-ed65aae574de", "metadata": {}, "outputs": [], "source": [ "densidade_agua = 997\n", "g = 9.8" ] }, { "cell_type": "code", "execution_count": null, "id": "b5affc4c-bd9f-44fa-a4f2-0b75163007e1", "metadata": {}, "outputs": [], "source": [ "h_queda = 100\n", "P_nominal = 800\n", "alfa1 = 0.35\n", "alfa2 = 1.15\n", "rendimento = 0.7" ] }, { "cell_type": "code", "execution_count": null, "id": "a9abfe5b-0612-46b5-a4db-2eb561783ed0", "metadata": {}, "outputs": [], "source": [ "Q_nominal = # TODO: calcula o caudal nominal\n", "print(f\"Caudal nominal: {Q_nominal:.2f} m3/s\")" ] }, { "cell_type": "code", "execution_count": null, "id": "d80901a8-dd4e-426a-bdf5-3933b008a890", "metadata": {}, "outputs": [], "source": [ "t_Q_nominal = # TODO: calcula o tempo de duração do caudal nominal\n", "print(f\"Tempo de duração do caudal nominal: {t_Q_nominal:.0f} dias\")" ] }, { "cell_type": "markdown", "id": "e8465b8e-5bc4-4e33-b709-1399ccd8e86d", "metadata": {}, "source": [ "### **2.** Determina o caudal máximo, mínimo e de cheia. Para cada um desses, indica a duração de caudal respetiva." ] }, { "cell_type": "markdown", "id": "4dad0594-3355-4d5e-9332-8309463a93de", "metadata": {}, "source": [ "Começamos por visualizar a curva de duração de caudais. Para isso, vamos criar uma Dataframe com número de linhas igual ao número de dias do ano, e criar uma coluna para o caudal médio diário." ] }, { "cell_type": "code", "execution_count": null, "id": "416db1d9-b7ba-4659-8ee7-6cebc87bcc63", "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(index=range(1,366))\n", "df['Caudal médio diário [m3/s]'] = 16*(df.index**(-0.75))\n", "df" ] }, { "cell_type": "code", "execution_count": null, "id": "6042c3c8-fb74-445f-acd2-47899120e931", "metadata": {}, "outputs": [], "source": [ "plt.plot(df['Caudal médio diário [m3/s]'])\n", "\n", "plt.xlim(df.index.min(), df.index.max())\n", "plt.ylim(bottom=0)\n", "\n", "plt.xlabel(\"Nº de dias\")\n", "plt.ylabel(\"Caudal médio diário [m3/s]\")\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "71629db5-392c-4522-aab2-dbafd24f3b90", "metadata": {}, "source": [ "É importante frisar que esta curva representa os dias por ordem decrescente de caudal, e não por ordem cronológica." ] }, { "cell_type": "code", "execution_count": null, "id": "6391f4f1-694e-40f8-a6d1-3989be92fde1", "metadata": {}, "outputs": [], "source": [ "# TODO: calcula o caudal mínimo, máximo e de cheia\n", "Q_min = \n", "Q_max = \n", "Q_cheia = \n", "\n", "print(f\"Caudal mínimo: {Q_min:.3f} m3/s\")\n", "print(f\"Caudal máximo: {Q_max:.3f} m3/s\")\n", "print(f\"Caudal de cheia: {Q_cheia:.3f} m3/s\")" ] }, { "cell_type": "code", "execution_count": null, "id": "013673d3-7b10-40f8-8be8-9b0be63578b6", "metadata": {}, "outputs": [], "source": [ "# TODO: determina os tempos de duração dos caudais mínimo, máximo e de cheia\n", "t_Q_min = \n", "t_Q_max = \n", "t_Q_cheia =\n", "\n", "print(f\"Duração do caudal mínimo: {t_Q_min:.0f} dias\")\n", "print(f\"Duração do caudal máximo: {t_Q_max:.0f} dias\")\n", "print(f\"Duração do caudal de cheia: {t_Q_cheia:.0f} dias\")" ] }, { "cell_type": "markdown", "id": "655477b7-469a-4cb5-ad2a-037bb9cee1f8", "metadata": {}, "source": [ "#### a) Apresenta um gráfico da curva de duração de caudais e marca os caudais mínimo, nominal, máximo e de cheia." ] }, { "cell_type": "code", "execution_count": null, "id": "395547ad-72b8-4f60-bca5-1ec8778a85c4", "metadata": {}, "outputs": [], "source": [ "plt.plot(df['Caudal médio diário [m3/s]'], label=\"Curva de duração de caudais\")\n", "plt.scatter(t_Q_min, Q_min, color=\"red\", label=\"Caudal mínimo\")\n", "\n", "# TODO: acrescenta ao gráfico o caudal máximo, nominal, e o de cheia\n", "\n", "plt.xlim(df.index.min(), df.index.max())\n", "plt.ylim([0, 1.2*Q_cheia])\n", "\n", "plt.xlabel(\"Nº de dias\")\n", "plt.ylabel(\"Caudal médio diário [m3/s]\")\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "70ffff2e-2e5e-44c7-afcb-79935316f3aa", "metadata": {}, "source": [ "### **3.** Calcula a energia anualmente produzida." ] }, { "cell_type": "code", "execution_count": null, "id": "02125155-03cd-4c25-931f-2f6f6141e6fa", "metadata": {}, "outputs": [], "source": [ "df['Potência disponível [kW]'] = # TODO: calcula a potência disponível em kW\n", "df" ] }, { "cell_type": "code", "execution_count": null, "id": "38cb32f7-5ad7-4add-a4df-a3cba7a7267c", "metadata": {}, "outputs": [], "source": [ "# TODO: calcula a potência máxima e de cheia, em kW\n", "P_min = \n", "P_max = \n", "P_cheia = " ] }, { "cell_type": "code", "execution_count": null, "id": "2b0dcc08-7743-4189-977a-80203d3401c5", "metadata": {}, "outputs": [], "source": [ "df['Potência [kW] (1x800W)'] = df['Potência disponível [kW]']\n", "\n", "df.loc[df['Caudal médio diário [m3/s]'] < Q_min, 'Potência [kW] (1x800W)'] = 0 # quando o caudal é inferior ao caudal mínimo, a mini-hídrica não gera energia\n", "\n", "# TODO: corrige a coluna da potência gerada com as limitações vindas da potência máxima e do caudal de cheia\n", "df.loc[df['Caudal médio diário [m3/s]'] > Q_max, 'Potência [kW] (1x800W)'] = \n", "df.loc[df['Caudal médio diário [m3/s]'] >= Q_cheia, 'Potência [kW] (1x800W)'] = \n", "\n", "df" ] }, { "cell_type": "code", "execution_count": null, "id": "6806bd37-c923-4266-a677-9dd5a7e83b9f", "metadata": {}, "outputs": [], "source": [ "df['Energia produzida [MWh]'] = # TODO: calcula a energia produzida para cada dia em MWh\n", "df.head(20)" ] }, { "cell_type": "code", "execution_count": null, "id": "c673164b-fe0a-4e31-b226-37fe34dd7b22", "metadata": {}, "outputs": [], "source": [ "E_total = # TODO: calcula a energia total produzida num ano\n", "print(f\"Energia anual produzida: {E_total:.0f} MWh\")" ] }, { "cell_type": "markdown", "id": "55c05e05-260f-424c-bd20-dec2db7795ad", "metadata": {}, "source": [ "#### a) Apresenta um gráfico da curva teórica de potência disponível. Assinala as potências correspondentes aos 4 caudais. Apresenta também a energia aproveitada, através de sombreamento. Explica o que observas no gráfico." ] }, { "cell_type": "code", "execution_count": null, "id": "08403abc-ed68-4d67-8811-538e30a3ea0c", "metadata": {}, "outputs": [], "source": [ "plt.plot(df['Potência disponível [kW]'], label=\"Potência disponível\")\n", "plt.fill_between(df.index, 0, df['Potência [kW] (1x800W)'], color='orange', alpha=0.5, label=\"Energia produzida\")\n", "\n", "plt.scatter(t_Q_min, P_min, color=\"red\", label=\"Potência mínima\")\n", "plt.scatter(t_Q_nominal, P_nominal, color=\"blue\", label=\"Potência nominal\")\n", "plt.scatter(t_Q_max, P_max, color=\"green\", label=\"Potência máxima\")\n", "\n", "plt.xlim(df.index.min(), df.index.max())\n", "plt.ylim([0, 1000])\n", "\n", "plt.xlabel(\"Nº de dias\")\n", "plt.ylabel(\"Potência [kW]\")\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "22e0dce7-e676-443b-90a1-18440cf7c5f4", "metadata": {}, "source": [ "#### b) Ao longo de quantos dias do ano é que a mini-hídrica gera energia?" ] }, { "cell_type": "code", "execution_count": null, "id": "504bbfb0-afdc-4f4a-8445-97b651b1da9b", "metadata": {}, "outputs": [], "source": [ "n_dias_funcionamento = # TODO: calcula o nº de dias de funcionamento da mini-hídrica\n", "print(f\"Nº de dias de funcionamento: {n_dias_funcionamento:.0f}\")" ] }, { "cell_type": "markdown", "id": "af93a1e1-531e-432f-a7c3-eb3538eb7199", "metadata": {}, "source": [ "### **4.** Calcula o fator de capacidade" ] }, { "cell_type": "code", "execution_count": null, "id": "f5aa6985-847a-4f55-86d0-61942b5f7a3d", "metadata": {}, "outputs": [], "source": [ "Fc = # TODO: calcula o fator de capacidade\n", "print(f\"Fator de capacidade: {Fc:.2f}\")" ] }, { "cell_type": "markdown", "id": "5cd68eab-d5bd-4eb0-8a14-5827fcc9551d", "metadata": {}, "source": [ "### **5.** Repete as questões anteriores para a mesma central mini-hídrica, equipada desta vez com:" ] }, { "cell_type": "markdown", "id": "2e86f9af-64cb-4e44-aeff-8fb824ecb372", "metadata": {}, "source": [ "Criamos primeiro uma dataframe para comparar os 3 cenários no final, e colocamos já o primeiro cenário:" ] }, { "cell_type": "code", "execution_count": null, "id": "024e60e9-d5a0-4852-a6c3-99152611e2c7", "metadata": {}, "outputs": [], "source": [ "df_cenarios = pd.DataFrame({\n", " 'Caudal mínimo [m3/s]': Q_min,\n", " 'Caudal nominal [m3/s]': Q_nominal,\n", " 'Caudal máximo [m3/s]': Q_max,\n", " 'Potência nominal [kW]': P_nominal,\n", " 'Potência máxima [kW]': P_max,\n", " 'Potência mínima [kW]': P_min,\n", " 'Nº dias funcionamento': n_dias_funcionamento,\n", " 'Energia gerada [MWh]': E_total,\n", " 'Fator de capacidade': Fc\n", "}, index=[\"1x800 kW\"])\n", "\n", "df_cenarios" ] }, { "cell_type": "markdown", "id": "98781bee-4572-4e7c-adfb-cdeacee2596f", "metadata": {}, "source": [ "#### a) um grupo turbina-gerador de 400 kW" ] }, { "cell_type": "code", "execution_count": null, "id": "3ca678d7-f5c8-4092-b3d6-f12cdd0d10aa", "metadata": {}, "outputs": [], "source": [ "P_nominal = 400\n", "\n", "Q_nominal = P_nominal*1000/(rendimento*densidade_agua*g*h_queda)\n", "print(f\"Caudal nominal: {Q_nominal:.2f} m3/s\")\n", "\n", "t_Q_nominal = (Q_nominal / 16)**(-1/0.75)\n", "print(f\"Tempo de duração do caudal nominal: {t_Q_nominal:.0f} dias\")" ] }, { "cell_type": "code", "execution_count": null, "id": "e79da783-208f-420e-86ba-0115e9f44392", "metadata": {}, "outputs": [], "source": [ "df_400 = pd.DataFrame(index=range(1,366))\n", "df_400['Caudal médio diário [m3/s]'] = 16*(df_400.index**(-0.75))" ] }, { "cell_type": "code", "execution_count": null, "id": "6fbf60e9-5a16-43dc-b4e9-10952d319cb3", "metadata": {}, "outputs": [], "source": [ "Q_min = Q_nominal * alfa1\n", "Q_max = Q_nominal * alfa2\n", "Q_cheia = 16 * 15**(-.75)\n", "\n", "print(f\"Caudal mínimo: {Q_min:.3f} m3/s\")\n", "print(f\"Caudal máximo: {Q_max:.3f} m3/s\")\n", "print(f\"Caudal de cheia: {Q_cheia:.3f} m3/s\")\n", "\n", "t_Q_min = (Q_min / 16)**(-1/0.75)\n", "t_Q_max = (Q_max / 16)**(-1/0.75)\n", "t_Q_cheia = 15\n", "\n", "print(f\"Duração do caudal mínimo: {t_Q_min:.0f} dias\")\n", "print(f\"Duração do caudal máximo: {t_Q_max:.0f} dias\")\n", "print(f\"Duração do caudal de cheia: {t_Q_cheia:.0f} dias\")" ] }, { "cell_type": "code", "execution_count": null, "id": "90d63c30-6a5b-4cf4-abeb-7bdfe527ff70", "metadata": {}, "outputs": [], "source": [ "plt.plot(df['Caudal médio diário [m3/s]'], label=\"Curva de duração de caudais\")\n", "plt.scatter(t_Q_min, Q_min, color=\"red\", label=\"Caudal mínimo\")\n", "plt.scatter(t_Q_max, Q_max, color=\"green\", label=\"Caudal máximo\")\n", "plt.scatter(t_Q_cheia, Q_cheia, color=\"orange\", label=\"Caudal de cheia\")\n", "\n", "plt.xlim(df.index.min(), df.index.max())\n", "plt.ylim([0, 1.2*Q_cheia])\n", "\n", "plt.xlabel(\"Nº de dias\")\n", "plt.ylabel(\"Caudal médio diário [m3/s]\")\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "1edcee6d-607b-46a3-b705-52678b40e9fe", "metadata": {}, "outputs": [], "source": [ "df_400['Potência disponível [kW]'] = densidade_agua * df_400['Caudal médio diário [m3/s]'] * g * h_queda * rendimento / 1000 \n", "df_400" ] }, { "cell_type": "code", "execution_count": null, "id": "7db324f6-3dfb-4c55-9e1e-1c26147a4f53", "metadata": {}, "outputs": [], "source": [ "P_max = densidade_agua * Q_max * g * h_queda * rendimento / 1000 \n", "P_min = densidade_agua * Q_min * g * h_queda * rendimento / 1000 \n", "P_cheia = densidade_agua * Q_cheia * g * h_queda * rendimento / 1000" ] }, { "cell_type": "code", "execution_count": null, "id": "c988b537-ad78-448e-b644-793a54accd03", "metadata": {}, "outputs": [], "source": [ "df_400['Potência [kW] (1x800W)'] = df_400['Potência disponível [kW]']\n", "df_400.loc[df.index < t_Q_max, 'Potência [kW] (1x800W)'] = P_max\n", "df_400.loc[df.index <= t_Q_cheia, 'Potência [kW] (1x800W)'] = 0\n", "df_400.loc[df.index > t_Q_min, 'Potência [kW] (1x800W)'] = 0\n", "df_400['Energia produzida [MWh]'] = df_400['Potência [kW] (1x800W)'] * 24 / 1000\n", "df_400.head(20)" ] }, { "cell_type": "code", "execution_count": null, "id": "12216b11-dab2-4772-aa46-9f23bc452063", "metadata": {}, "outputs": [], "source": [ "E_total_400 = df_400['Energia produzida [MWh]'].sum()\n", "print(f\"Energia anual produzida: {E_total:.0f} MWh\")" ] }, { "cell_type": "code", "execution_count": null, "id": "dcfe61ac-4566-4a69-b099-0539b8e9c69b", "metadata": {}, "outputs": [], "source": [ "plt.plot(df['Potência disponível [kW]'], label=\"Potência disponível\")\n", "plt.fill_between(df.index, 0, df_400['Potência [kW] (1x800W)'], color='orange', alpha=0.5, label=\"Energia produzida\")\n", "\n", "plt.scatter(t_Q_min, P_min, color=\"red\", label=\"Potência mínima\")\n", "plt.scatter(t_Q_max, P_max, color=\"green\", label=\"Potência máxima\")\n", "\n", "plt.xlim(df.index.min(), df.index.max())\n", "plt.ylim([0, 1000])\n", "\n", "plt.xlabel(\"Nº de dias\")\n", "plt.ylabel(\"Potência [kW]\")\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "bfbb1803-0e60-4310-847b-66f6c5cb5f52", "metadata": {}, "outputs": [], "source": [ "Fc = E_total_400 * 1000 / (P_nominal * 8760)\n", "print(f\"Fator de capacidade: {Fc:.2f}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "c7949a63-9b7e-4bda-88d1-7938184ed0bd", "metadata": {}, "outputs": [], "source": [ "n_dias_funcionamento = round(t_Q_min - t_Q_cheia)" ] }, { "cell_type": "code", "execution_count": null, "id": "3f378c1b-3706-476b-82f7-24bb2eee413f", "metadata": {}, "outputs": [], "source": [ "df_cenarios.loc[\"1x400 kW\"] = {\n", " 'Caudal mínimo [m3/s]': Q_min,\n", " 'Caudal nominal [m3/s]': Q_nominal,\n", " 'Caudal máximo [m3/s]': Q_max,\n", " 'Potência nominal [kW]': P_nominal,\n", " 'Potência máxima [kW]': P_max,\n", " 'Potência mínima [kW]': P_min,\n", " 'Nº dias funcionamento': n_dias_funcionamento,\n", " 'Energia gerada [MWh]': E_total_400,\n", " 'Fator de capacidade': Fc\n", "}\n" ] }, { "cell_type": "code", "execution_count": null, "id": "18e191a2-b489-4fc5-b0d1-9f287e20c0c5", "metadata": {}, "outputs": [], "source": [ "df_cenarios" ] }, { "cell_type": "markdown", "id": "a2ea4c45-07a3-44a4-96ee-4449a84c1fb2", "metadata": {}, "source": [ "#### b) dois grupos turbina-gerador de 400 kW cada" ] }, { "cell_type": "code", "execution_count": null, "id": "22fc495f-cf4d-4755-bfcf-d6144180516a", "metadata": {}, "outputs": [], "source": [ "P_nominal = 800\n", "\n", "Q_nominal = P_nominal*1000/(rendimento*densidade_agua*g*h_queda)\n", "print(f\"Caudal nominal: {Q_nominal:.2f} m3/s\")\n", "\n", "t_Q_nominal = (Q_nominal / 16)**(-1/0.75)\n", "print(f\"Tempo de duração do caudal nominal: {t_Q_nominal:.0f} dias\")" ] }, { "cell_type": "code", "execution_count": null, "id": "a2975b14-9b8f-49e8-ae22-43ad557faf3c", "metadata": {}, "outputs": [], "source": [ "df_2x400 = pd.DataFrame(index=range(1,366))\n", "df_2x400['Caudal médio diário [m3/s]'] = 16*(df_2x400.index**(-0.75))" ] }, { "cell_type": "code", "execution_count": null, "id": "0dbe774a-8d80-40ba-8e17-d60e792a5a26", "metadata": {}, "outputs": [], "source": [ "Q_min = df_cenarios.loc['1x400 kW', 'Caudal mínimo [m3/s]']\n", "Q_max = Q_nominal * alfa2\n", "Q_cheia = 16 * 15**(-.75)\n", "\n", "print(f\"Caudal mínimo: {Q_min:.3f} m3/s\")\n", "print(f\"Caudal máximo: {Q_max:.3f} m3/s\")\n", "print(f\"Caudal de cheia: {Q_cheia:.3f} m3/s\")\n", "\n", "t_Q_min = (Q_min / 16)**(-1/0.75)\n", "t_Q_max = (Q_max / 16)**(-1/0.75)\n", "t_Q_cheia = 15\n", "\n", "print(f\"Duração do caudal mínimo: {t_Q_min:.0f} dias\")\n", "print(f\"Duração do caudal máximo: {t_Q_max:.0f} dias\")\n", "print(f\"Duração do caudal de cheia: {t_Q_cheia:.0f} dias\")" ] }, { "cell_type": "code", "execution_count": null, "id": "34753fe0-30df-4191-b1c8-e3544915f742", "metadata": {}, "outputs": [], "source": [ "plt.plot(df['Caudal médio diário [m3/s]'], label=\"Curva de duração de caudais\")\n", "plt.scatter(t_Q_min, Q_min, color=\"red\", label=\"Caudal mínimo\")\n", "plt.scatter(t_Q_max, Q_max, color=\"green\", label=\"Caudal máximo\")\n", "plt.scatter(t_Q_cheia, Q_cheia, color=\"orange\", label=\"Caudal de cheia\")\n", "\n", "plt.xlim(df.index.min(), df.index.max())\n", "plt.ylim([0, 1.2*Q_cheia])\n", "\n", "plt.xlabel(\"Nº de dias\")\n", "plt.ylabel(\"Caudal médio diário [m3/s]\")\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "c99d5269-b446-401d-b7c3-a35b82c3c937", "metadata": {}, "outputs": [], "source": [ "df_2x400['Potência disponível [kW]'] = densidade_agua * df_2x400['Caudal médio diário [m3/s]'] * g * h_queda * rendimento / 1000 \n", "df_2x400" ] }, { "cell_type": "code", "execution_count": null, "id": "13473877-fdb4-495f-aa82-58b625074ae0", "metadata": {}, "outputs": [], "source": [ "P_max = densidade_agua * Q_max * g * h_queda * rendimento / 1000 \n", "P_min = densidade_agua * Q_min * g * h_queda * rendimento / 1000 \n", "P_cheia = densidade_agua * Q_cheia * g * h_queda * rendimento / 1000" ] }, { "cell_type": "code", "execution_count": null, "id": "b6a4b733-5f41-4ec6-981a-5474bba8faf6", "metadata": {}, "outputs": [], "source": [ "df_2x400['Potência [kW] (1x800W)'] = df_2x400['Potência disponível [kW]']\n", "df_2x400.loc[df.index < t_Q_max, 'Potência [kW] (1x800W)'] = P_max\n", "df_2x400.loc[df.index <= t_Q_cheia, 'Potência [kW] (1x800W)'] = 0\n", "df_2x400.loc[df.index > t_Q_min, 'Potência [kW] (1x800W)'] = 0\n", "df_2x400['Energia produzida [MWh]'] = df_2x400['Potência [kW] (1x800W)'] * 24 / 1000\n", "df_2x400.head(20)" ] }, { "cell_type": "code", "execution_count": null, "id": "3e731827-9ba0-4d60-98d9-f4ef79f8bdd9", "metadata": {}, "outputs": [], "source": [ "E_total_2x400 = df_2x400['Energia produzida [MWh]'].sum()\n", "print(f\"Energia anual produzida: {E_total:.0f} MWh\")" ] }, { "cell_type": "code", "execution_count": null, "id": "a831aeec-a76b-4bca-92f6-6190f2063c5d", "metadata": {}, "outputs": [], "source": [ "plt.plot(df['Potência disponível [kW]'], label=\"Potência disponível\")\n", "plt.fill_between(df.index, 0, df_2x400['Potência [kW] (1x800W)'], color='orange', alpha=0.5, label=\"Energia produzida\")\n", "\n", "plt.scatter(t_Q_min, P_min, color=\"red\", label=\"Potência mínima\")\n", "plt.scatter(t_Q_max, P_max, color=\"green\", label=\"Potência máxima\")\n", "\n", "plt.xlim(df.index.min(), df.index.max())\n", "plt.ylim([0, 1000])\n", "\n", "plt.xlabel(\"Nº de dias\")\n", "plt.ylabel(\"Potência [kW]\")\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "id": "4193e0cb-6ac3-4fbd-85a3-e12fc38ea9c7", "metadata": {}, "outputs": [], "source": [ "Fc = E_total_2x400 * 1000 / (P_nominal * 8760)\n", "print(f\"Fator de capacidade: {Fc:.2f}\")" ] }, { "cell_type": "code", "execution_count": null, "id": "c27e26eb-c2de-4d11-848e-07d45e409723", "metadata": {}, "outputs": [], "source": [ "n_dias_funcionamento = round(t_Q_min - t_Q_cheia)" ] }, { "cell_type": "code", "execution_count": null, "id": "fb308b78-a9a6-41e6-b50c-061a3b2857e3", "metadata": {}, "outputs": [], "source": [ "df_cenarios.loc[\"2x400 kW\"] = {\n", " 'Caudal mínimo [m3/s]': Q_min,\n", " 'Caudal nominal [m3/s]': Q_nominal,\n", " 'Caudal máximo [m3/s]': Q_max,\n", " 'Potência nominal [kW]': P_nominal,\n", " 'Potência máxima [kW]': P_max,\n", " 'Potência mínima [kW]': P_min,\n", " 'Nº dias funcionamento': n_dias_funcionamento,\n", " 'Energia gerada [MWh]': E_total_2x400,\n", " 'Fator de capacidade': Fc\n", "}\n" ] }, { "cell_type": "code", "execution_count": null, "id": "ef9f4de4-98d6-4e21-b6e5-676450424df7", "metadata": {}, "outputs": [], "source": [ "df_cenarios" ] }, { "cell_type": "markdown", "id": "06fb64b4-54e5-418c-8aff-f699d2dea497", "metadata": {}, "source": [ "### **6.** Compara e comenta os resultados obtidos para os 3 cenários:\n", " a) Compara os caudais mínimo, nominal e máximo dos 3 cenários.\n", " b) Compara os gráficos que ilustram a energia produzida para os 3 cenários. Que relação observas entre os caudais mínimo e máximo, o número de dias de funcionamento, e a energia total produzida?\n", " c) Compara os fatores de capacidade dos 3 cenários.\n", " d) Qual te parece ser a melhor opção, e porquê?" ] }, { "cell_type": "markdown", "id": "9ac1ff81-396f-40c5-9f08-e7cc658e13c1", "metadata": {}, "source": [ "## Parte B" ] }, { "cell_type": "markdown", "id": "398f44f8-5d22-4914-bc2e-f1806cf6b281", "metadata": {}, "source": [ "A central de fio de água de Dalles localiza-se em Oregon, nos EUA. Tem uma altura de queda de 61 m, com uma **potência máxima** de cerca de 2160 MW (14 turbinas Kaplan de 94.4 MW e 8 turbinas de 104 MW).\n", "\n", "O ficheiro `dados.csv` contém dados de caudal médio diário nesta central entre 2015 e 2024." ] }, { "cell_type": "code", "execution_count": null, "id": "301bf649-e6f0-4ed6-9e3e-8cf170c5baa4", "metadata": {}, "outputs": [], "source": [ "df_completa = pd.read_csv('dados.csv')\n", "df_completa.columns = ['Dia', 'Caudal médio diário [m3/s]']\n", "df_completa['Dia'] = pd.to_datetime(df_completa['Dia'])\n", "df_completa = df_completa.set_index('Dia')\n", "df_completa" ] }, { "cell_type": "code", "execution_count": null, "id": "b678e23a-bf4c-4e41-901b-6426dc851a25", "metadata": {}, "outputs": [], "source": [ "plt.figure(figsize=(12, 6))\n", "plt.plot(df_completa)\n", "\n", "plt.xlim(df_completa.index.min(), df_completa.index.max())\n", "plt.ylim(bottom=0)\n", "\n", "plt.grid()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "65ff32b8-64ab-493b-962d-d7a70e69b4a1", "metadata": {}, "source": [ "### **1.** Observa os dados de caudal médio diário ao longo do ano para os vários anos disponíveis." ] }, { "cell_type": "code", "execution_count": null, "id": "f4bd2421-ec4b-4f30-a8db-f10975f07e8d", "metadata": {}, "outputs": [], "source": [ "df_completa['ano'] = df_completa.index.year\n", "df_completa['dia'] = df_completa.index.dayofyear\n", "\n", "plt.figure(figsize=(12, 6))\n", "\n", "for ano, group in df_completa.groupby('ano'):\n", " plt.plot(group['dia'], group['Caudal médio diário [m3/s]'], label=str(ano), alpha=0.8)\n", "\n", "plt.xlabel('Dia do ano')\n", "plt.ylabel('Caudal médio diário [m3/s]')\n", "plt.xlim(df_completa.dia.min(), df_completa.dia.max())\n", "plt.ylim(bottom=0)\n", "plt.legend(title='Ano', bbox_to_anchor=(1.05, 1), loc='upper left')\n", "plt.grid(True)\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "67ebf428-26a3-4a12-9a03-5f97ad9101bd", "metadata": {}, "source": [ "#### a) Em que altura do ano tendem a ocorrer os caudais mais elevados nesta central, e porquê? (Dica: pesquisa sobre o clima no estado de Oregon.) Como se compara isto com a realidade portuguesa?" ] }, { "cell_type": "markdown", "id": "ace4ca63-e0d4-44c7-b42e-b8df0e5ea4af", "metadata": {}, "source": [ "### **2.** Determina a potência nominal e potência mínima da central. Determina os caudais mínimo, nominal e máximo. Considera que os limites de exploração de uma turbina Kaplan são de $\\alpha_1 = 0.2$ e $\\alpha_2 = 1.15$, e que o rendimento total do sistema é de cerca de 70%." ] }, { "cell_type": "code", "execution_count": null, "id": "5ea559b5-2b7c-4f57-9860-3820ee70a87d", "metadata": {}, "outputs": [], "source": [ "h_queda = 25\n", "alfa1 = 0.2\n", "alfa2 = 1.15\n", "rendimento = 0.7\n", "P_max = 2160" ] }, { "cell_type": "code", "execution_count": null, "id": "8ec51c9e-aabe-4a4c-bbb0-5bbb3814ed1b", "metadata": {}, "outputs": [], "source": [ "# TODO: determina a potência nominal e a potência mínima\n", "P_nominal = \n", "P_min = \n", "\n", "print(f\"Potência nominal: {P_nominal:.0f} MW\")\n", "print(f\"Potência mínima: {P_min:.0f} MW\")" ] }, { "cell_type": "code", "execution_count": null, "id": "b2f07f52-d5b5-4194-948d-9c6e474c0cdc", "metadata": {}, "outputs": [], "source": [ "# TODO: determina o caudal nominal, máximo e mínimo\n", "Q_nominal = \n", "\n", "Q_max = \n", "Q_min = \n", "\n", "print(f\"Caudal nominal: {Q_nominal:.0f} m3/s\")\n", "print(f\"Caudal máximo: {Q_max:.0f} m3/s\")\n", "print(f\"Caudal mínimo: {Q_min:.0f} m3/s\")" ] }, { "cell_type": "markdown", "id": "f06263fa-1e1c-4fb5-a687-253b7cf961ed", "metadata": {}, "source": [ "### **3.** Considera que, entre os dias 10 de abril e 31 de agosto, existe um caudal ecológico de 40%, isto é, pelo menos 40% do caudal que chega à central deve ser passado pelo vertedouro sem ser turbinado. Para o ano de 2024, determina o caudal disponível para ser turbinado." ] }, { "cell_type": "code", "execution_count": null, "id": "b16d4bd4-c3ef-4c53-b3d9-594a70d3cddf", "metadata": {}, "outputs": [], "source": [ "ano = 2024\n", "df_ano = df_completa[df_completa.ano == ano].loc[:,['Caudal médio diário [m3/s]']]\n", "df_ano" ] }, { "cell_type": "code", "execution_count": null, "id": "7b73f0c3-cb65-4214-9ea8-f20f3ff8e75e", "metadata": {}, "outputs": [], "source": [ "def ajustar_caudal(date, value):\n", " if (date.month == 4 and date.day >= 10) or (5 <= date.month <= 8):\n", " return value * 0.4\n", " return 0" ] }, { "cell_type": "code", "execution_count": null, "id": "b4233129-eba6-4ce2-92d3-679e37a9b5e7", "metadata": {}, "outputs": [], "source": [ "df_ano['Caudal ecológico [m3/s]'] = [ajustar_caudal(date, value) for date, value in zip(df_ano.index, df_ano['Caudal médio diário [m3/s]'])]\n", "df_ano['Caudal disponível [m3/s]'] = df_ano['Caudal médio diário [m3/s]'] - df_ano['Caudal ecológico [m3/s]']\n", "df_ano" ] }, { "cell_type": "code", "execution_count": null, "id": "eed23aab-7ec6-4624-8524-0fc709308fa3", "metadata": {}, "outputs": [], "source": [ "plt.fill_between(df_ano.index, 0, df_ano['Caudal disponível [m3/s]'], alpha=0.5, label='Caudal disponível para turbinar')\n", "plt.fill_between(df_ano.index, df_ano['Caudal disponível [m3/s]'], df_ano['Caudal disponível [m3/s]']+df_ano['Caudal ecológico [m3/s]'], alpha=0.7, label='Caudal ecológico')\n", "\n", "plt.plot(df_ano['Caudal médio diário [m3/s]'], label='Caudal médio diário')\n", "\n", "plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%m'))\n", "plt.xlim(df_ano.index.min(), df_ano.index.max())\n", "plt.ylim(bottom=0)\n", "\n", "plt.xlabel('Mês do ano')\n", "plt.ylabel('Caudal [m3/s]')\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "d4f0a0a1-8b45-4b1e-bbc6-346dc88759c4", "metadata": {}, "source": [ "#### a) Qual o volume de água que é caudal ecológico num ano? Que fração representa do volume total de água que aflui à central ao longo do ano?" ] }, { "cell_type": "code", "execution_count": null, "id": "c80febd5-73c6-4215-b9a5-d132149f5a64", "metadata": {}, "outputs": [], "source": [ "# TODO: calcula o volume ecológico ao longo de um ano\n", "volume_ecologico = \n", "\n", "print(f\"Volume ecológico: {volume_ecologico} m3\")" ] }, { "cell_type": "code", "execution_count": null, "id": "26f6006d-1e79-49dc-ac71-7599e5d62600", "metadata": {}, "outputs": [], "source": [ "# TODO: calcula a fração de caudal ecológico\n", "fracao_caudal_ecologico =\n", "\n", "print(f\"Fração de caudal ecológico: {fracao_caudal_ecologico:.2f}\")" ] }, { "cell_type": "markdown", "id": "0e2a83df-79da-4ded-ad2f-9ac81a2cc812", "metadata": {}, "source": [ "### **4.** Obtém a curva de duração de caudais para o ano de 2024, considerando o caudal disponível após o caudal ecológico." ] }, { "cell_type": "code", "execution_count": null, "id": "180b00d5-9bb2-450b-9cc8-cdb6765efc89", "metadata": {}, "outputs": [], "source": [ "df = df_ano.sort_values('Caudal disponível [m3/s]', ascending=False).reset_index()" ] }, { "cell_type": "code", "execution_count": null, "id": "8275685b-7779-4489-8425-671f0b5a0d6a", "metadata": {}, "outputs": [], "source": [ "# TODO: gráfico da curva de duração de caudais" ] }, { "cell_type": "markdown", "id": "42239237-f8f9-40b2-aab3-2987946342c9", "metadata": {}, "source": [ "#### a) Compara os caudais mínimo e máximo da central com a curva de duração de caudais. O que observas? Quantos dias por ano funcionará a central?" ] }, { "cell_type": "markdown", "id": "a70ae206-f3a8-4a58-82f9-1092b3546eaf", "metadata": {}, "source": [ "### **5.** Calcula a energia produzida em todo o ano, em GWh." ] }, { "cell_type": "code", "execution_count": null, "id": "9511937b-8cdc-4370-8499-3bb9065aad5a", "metadata": {}, "outputs": [], "source": [ "df['Potência teórica [MW]'] = df['Caudal disponível [m3/s]'] * densidade_agua * g * h_queda * rendimento / 1000000\n", "P_max = Q_max * densidade_agua * g * h_queda * rendimento / 1000000\n", "df['Potência real [MW]'] = np.minimum(df['Potência teórica [MW]'], P_max)\n", "df" ] }, { "cell_type": "code", "execution_count": null, "id": "60b34574-baf7-447b-a3c6-40dd168d0b87", "metadata": {}, "outputs": [], "source": [ "E_produzida = # TODO: calcula a energia produzida total anual\n", "print(f\"Energia anual produzida: {E_produzida:.0f} GWh\")" ] }, { "cell_type": "markdown", "id": "53836af2-fa97-4b58-bd2e-6f28bb115fda", "metadata": {}, "source": [ "### **6.** Determina o fator de capacidade." ] }, { "cell_type": "code", "execution_count": null, "id": "84cccbc5-d0c1-4186-b2ee-c5687d08b8bb", "metadata": {}, "outputs": [], "source": [ "# TODO: determina o fator de capacidade\n", "Fc = \n", "print(f\"Fator de capacidade: {Fc:.2f}\")" ] }, { "cell_type": "markdown", "id": "c55c49cf-fa98-411b-8d06-8197a4d66bbd", "metadata": {}, "source": [ "### **7.** Repete os cálculos anteriores, mas para o ano de 2018. Qual é o novo fator de capacidade?" ] }, { "cell_type": "markdown", "id": "236ea933-f167-47b8-afc2-894dd1e2f6d1", "metadata": {}, "source": [ "#### a) O que podes concluir sobre a fiabilidade de usar dados de apenas um ano para avaliar o potencial hidroelétrico de um projeto?" ] }, { "cell_type": "markdown", "id": "cee61972-78e8-4c0d-983a-377c4377343a", "metadata": {}, "source": [ "### **8.** Se a central raramente atinge a sua capacidade máxima, por que motivo não terá sido dimensionada com uma capacidade menor? Qual poderá ser a vantagem de uma central aparentemente sobredimensionada? Para responder, considera o seguinte:\n", "\n", "(i) Centrais de fio de água de grande dimensão, como a de Dalles, têm por vezes alguma capacidade de armazenamento limitada (geralmente horas/dias, muito inferior à capacidade de uma barragem). \n", "\n", "(ii) O consumo de energia na rede elétrica varia ao longo do dia, com horas de consumo mais elevado (ex: manhãs e fins de tarde)." ] }, { "cell_type": "markdown", "id": "61c62e32-34d3-49a9-bc51-221c9ddba0ca", "metadata": {}, "source": [ "# Bónus" ] }, { "cell_type": "markdown", "id": "98eba5c9-6939-4233-923d-c3b6597d2ace", "metadata": {}, "source": [ "Para um valor extra, constrói um gráfico diferente dos anteriores que mostre algo interessante relacionado com energia hídrica, e explica o que ele demonstra :)" ] }, { "cell_type": "code", "execution_count": null, "id": "e681f9c4-c4a6-46b5-95bb-ac1ced0d8ada", "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "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", "version": "3.12.4" } }, "nbformat": 4, "nbformat_minor": 5 }