{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Optimization of Surface Position\n", "\n", "Following we show a few examples on how to use the optimizer for the surface position in PVGIS." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
{\n", " 'Surface Orientation': SurfaceOrientation(\n", " optimal=False,\n", " optimiser=None,\n", " min_degrees=0,\n", " min_radians=0,\n", " data_source=None,\n", " equation=None,\n", " algorithm=None,\n", " unit='radians',\n", " value=3.141592653589793,\n", " symbol='⯐ ⎄',\n", " description=None,\n", " label='Surface Position',\n", " title='Surface Position',\n", " supertitle='Surface Position data',\n", " shortname='Surface Position',\n", " name='Surface Position',\n", " max_radians=6.283185307179586,\n", " max_degrees=360\n", " ),\n", " 'Surface Tilt': SurfaceTilt(\n", " optimal=True,\n", " optimiser=None,\n", " min_degrees=0,\n", " min_radians=0,\n", " data_source=None,\n", " equation=None,\n", " algorithm=None,\n", " unit='radians',\n", " value=1.3035176011540837,\n", " symbol='⯐ ⎄',\n", " description=None,\n", " label='Surface Position',\n", " title='Surface Position',\n", " supertitle='Surface Position data',\n", " shortname='Surface Position',\n", " name='Surface Position',\n", " max_radians=3.141592653589793,\n", " max_degrees=180\n", " ),\n", " 'Mean PV Power': np.float32(232.95676),\n", " 'Unit': 'radians',\n", " 'Timing': 'Milne1921'\n", "}\n", "\n" ], "text/plain": [ "\u001b[1m{\u001b[0m\n", " \u001b[32m'Surface Orientation'\u001b[0m: \u001b[1;35mSurfaceOrientation\u001b[0m\u001b[1m(\u001b[0m\n", " \u001b[33moptimal\u001b[0m=\u001b[3;91mFalse\u001b[0m,\n", " \u001b[33moptimiser\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33mmin_degrees\u001b[0m=\u001b[1;36m0\u001b[0m,\n", " \u001b[33mmin_radians\u001b[0m=\u001b[1;36m0\u001b[0m,\n", " \u001b[33mdata_source\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33mequation\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33malgorithm\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33munit\u001b[0m=\u001b[32m'radians'\u001b[0m,\n", " \u001b[33mvalue\u001b[0m=\u001b[1;36m3\u001b[0m\u001b[1;36m.141592653589793\u001b[0m,\n", " \u001b[33msymbol\u001b[0m=\u001b[32m'⯐ ⎄'\u001b[0m,\n", " \u001b[33mdescription\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33mlabel\u001b[0m=\u001b[32m'Surface Position'\u001b[0m,\n", " \u001b[33mtitle\u001b[0m=\u001b[32m'Surface Position'\u001b[0m,\n", " \u001b[33msupertitle\u001b[0m=\u001b[32m'Surface Position data'\u001b[0m,\n", " \u001b[33mshortname\u001b[0m=\u001b[32m'Surface Position'\u001b[0m,\n", " \u001b[33mname\u001b[0m=\u001b[32m'Surface Position'\u001b[0m,\n", " \u001b[33mmax_radians\u001b[0m=\u001b[1;36m6\u001b[0m\u001b[1;36m.283185307179586\u001b[0m,\n", " \u001b[33mmax_degrees\u001b[0m=\u001b[1;36m360\u001b[0m\n", " \u001b[1m)\u001b[0m,\n", " \u001b[32m'Surface Tilt'\u001b[0m: \u001b[1;35mSurfaceTilt\u001b[0m\u001b[1m(\u001b[0m\n", " \u001b[33moptimal\u001b[0m=\u001b[3;92mTrue\u001b[0m,\n", " \u001b[33moptimiser\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33mmin_degrees\u001b[0m=\u001b[1;36m0\u001b[0m,\n", " \u001b[33mmin_radians\u001b[0m=\u001b[1;36m0\u001b[0m,\n", " \u001b[33mdata_source\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33mequation\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33malgorithm\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33munit\u001b[0m=\u001b[32m'radians'\u001b[0m,\n", " \u001b[33mvalue\u001b[0m=\u001b[1;36m1\u001b[0m\u001b[1;36m.3035176011540837\u001b[0m,\n", " \u001b[33msymbol\u001b[0m=\u001b[32m'⯐ ⎄'\u001b[0m,\n", " \u001b[33mdescription\u001b[0m=\u001b[3;35mNone\u001b[0m,\n", " \u001b[33mlabel\u001b[0m=\u001b[32m'Surface Position'\u001b[0m,\n", " \u001b[33mtitle\u001b[0m=\u001b[32m'Surface Position'\u001b[0m,\n", " \u001b[33msupertitle\u001b[0m=\u001b[32m'Surface Position data'\u001b[0m,\n", " \u001b[33mshortname\u001b[0m=\u001b[32m'Surface Position'\u001b[0m,\n", " \u001b[33mname\u001b[0m=\u001b[32m'Surface Position'\u001b[0m,\n", " \u001b[33mmax_radians\u001b[0m=\u001b[1;36m3\u001b[0m\u001b[1;36m.141592653589793\u001b[0m,\n", " \u001b[33mmax_degrees\u001b[0m=\u001b[1;36m180\u001b[0m\n", " \u001b[1m)\u001b[0m,\n", " \u001b[32m'Mean PV Power'\u001b[0m: \u001b[1;35mnp.float32\u001b[0m\u001b[1m(\u001b[0m\u001b[1;36m232.95676\u001b[0m\u001b[1m)\u001b[0m,\n", " \u001b[32m'Unit'\u001b[0m: \u001b[32m'radians'\u001b[0m,\n", " \u001b[32m'Timing'\u001b[0m: \u001b[32m'Milne1921'\u001b[0m\n", "\u001b[1m}\u001b[0m\n" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from rich import print\n", "print(result)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can plot the photovoltaic power output against the surface tilt angle along with the point of maximum output" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "ename": "IndexError", "evalue": "boolean index did not match indexed array along axis 0; size of axis is 0 but size of corresponding boolean axis is 25", "output_type": "error", "traceback": [ "\u001b[31m---------------------------------------------------------------------------\u001b[39m", "\u001b[31mIndexError\u001b[39m Traceback (most recent call last)", "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[8]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m \u001b[43mgraph_power_output\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlongitude\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mlongitude\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2\u001b[39m \u001b[43m \u001b[49m\u001b[43mlatitude\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mlatitude\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 3\u001b[39m \u001b[43m \u001b[49m\u001b[43melevation\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43melevation\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 4\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimestamps\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestamps\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 5\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimezone\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimezone\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 6\u001b[39m \u001b[43m \u001b[49m\u001b[43mspectral_factor_series\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mspectral_factor_series\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 7\u001b[39m \u001b[43m \u001b[49m\u001b[43mphotovoltaic_module\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mphotovoltaic_module\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 8\u001b[39m \u001b[43m \u001b[49m\u001b[43mtemperature_series\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mtemperature_series\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 9\u001b[39m \u001b[43m \u001b[49m\u001b[43mwind_speed_series\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mwind_speed_series\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 10\u001b[39m \u001b[43m \u001b[49m\u001b[43mlinke_turbidity_factor_series\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mlinke_turbidity_factor_series\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 11\u001b[39m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 12\u001b[39m \u001b[43m \u001b[49m\u001b[43msurface_orientation\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mSurfaceOrientation\u001b[49m\u001b[43m(\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m=\u001b[49m\u001b[43m(\u001b[49m\u001b[43msurface_orientation\u001b[49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43munit\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mradians\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 13\u001b[39m \u001b[43m \u001b[49m\u001b[43moptimal_surface_tilt\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mresult\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mSurface Tilt\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m.\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 14\u001b[39m \u001b[43m \u001b[49m\u001b[43moptimal_pv_power\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mresult\u001b[49m\u001b[43m[\u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43mMean PV Power\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m]\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 15\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n", "\u001b[36mFile \u001b[39m\u001b[32m/spacetime/pvgis/pvgis-prototype-public/pvgisprototype/api/surface/graph_power_output.py:62\u001b[39m, in \u001b[36mgraph_power_output\u001b[39m\u001b[34m(longitude, latitude, elevation, timestamps, timezone, spectral_factor_series, temperature_series, wind_speed_series, linke_turbidity_factor_series, photovoltaic_module, mode, surface_orientation, surface_tilt, min_surface_orientation, max_surface_orientation, min_surface_tilt, max_surface_tilt, optimal_surface_tilt, optimal_surface_orientation, optimal_pv_power)\u001b[39m\n\u001b[32m 59\u001b[39m surface_tilt_values = numpy.linspace(min_surface_tilt, max_surface_tilt, num=\u001b[32m50\u001b[39m)\n\u001b[32m 61\u001b[39m \u001b[38;5;28;01mfor\u001b[39;00m surface_tilt_value \u001b[38;5;129;01min\u001b[39;00m surface_tilt_values:\n\u001b[32m---> \u001b[39m\u001b[32m62\u001b[39m mean_power_output = \u001b[43mcalculate_photovoltaic_power_output_series\u001b[49m\u001b[43m(\u001b[49m\u001b[43mlongitude\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mlongitude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 63\u001b[39m \u001b[43m \u001b[49m\u001b[43mlatitude\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mlatitude\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 64\u001b[39m \u001b[43m \u001b[49m\u001b[43melevation\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43melevation\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestamps\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimestamps\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 65\u001b[39m \u001b[43m \u001b[49m\u001b[43mtimezone\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mtimezone\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mspectral_factor_series\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mspectral_factor_series\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 66\u001b[39m \u001b[43m \u001b[49m\u001b[43mphotovoltaic_module\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mphotovoltaic_module\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 67\u001b[39m \u001b[43m \u001b[49m\u001b[43mtemperature_series\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mtemperature_series\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 68\u001b[39m \u001b[43m \u001b[49m\u001b[43mwind_speed_series\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mwind_speed_series\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 69\u001b[39m \u001b[43m \u001b[49m\u001b[43mlinke_turbidity_factor_series\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43mlinke_turbidity_factor_series\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 70\u001b[39m \u001b[43m \u001b[49m\u001b[43msurface_orientation\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43msurface_orientation\u001b[49m\u001b[43m.\u001b[49m\u001b[43mvalue\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\n\u001b[32m 71\u001b[39m \u001b[43m \u001b[49m\u001b[43msurface_tilt\u001b[49m\u001b[43m \u001b[49m\u001b[43m=\u001b[49m\u001b[43m \u001b[49m\u001b[43msurface_tilt_value\u001b[49m\n\u001b[32m 72\u001b[39m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m.value.mean()\n\u001b[32m 73\u001b[39m mean_power_output_values.append(mean_power_output)\n\u001b[32m 74\u001b[39m surface_tilt_values_degrees = numpy.linspace(math.degrees(min_surface_tilt), math.degrees(max_surface_tilt), num=\u001b[32m50\u001b[39m)\n", "\u001b[36mFile \u001b[39m\u001b[32m/spacetime/pvgis/pvgis-prototype-public/pvgisprototype/log.py:429\u001b[39m, in \u001b[36mlog_function_call.