{ "cells": [ { "cell_type": "markdown", "id": "caa47946", "metadata": {}, "source": [ "# 5. Funktionsfitting und Newtonverfahren (nD)\n", "\n", "Die PV-Anlage aus der vergangenen Übung soll nun als Modell abgebildet und als Modul eines übergeordneten Programms simuliert werden.\n", "\n", "Für die Modellbildung stehen bereits verschiedene Messwerte zur Verfügung sowie eine den Messwertverlauf beschreibende e-Funktion. Damit diese Funktion aber auch realistische Werte wiedergeben kann, müssen zuvor ihre Parameter optimiert werden. Dazu wird das mehrdimensionale Newtonverfahren angewendet.\n", "\n", "## Situation\n", "\n", "Zur Simulation einer PV-Anlage wurden normalisierte Leistungsdaten ermittelt. Die Messwerte wurden dazu über einen Zeitraum von 24h im 10min-Takt aufgezeichnet.\n", "\n", "Um das Modell der Anlage in ein übergeordnetes Programm einzubinden, muss aus den Messwerten nun noch eine Funktionsvorschrift abgeleitet werden (sog. Fitting).\n", "\n", "Dazu eignet sich folgende Funktion\n", "\n", "$$P(t) = e^{-\\left(\\frac{t-a}{b}\\right)^2}$$\n", "\n", "Zur Ermittlung der Funktionsparameter wird das mehrdimensionale Newtonverfahren verwendet und in MATLAB implementiert.\n", "\n", "PV_measure_A.txt\n", "\n", "PV_measure_B.txt\n", "\n", "## Aufgabe\n", "\n", "1. Importieren Sie Datensatz A und legen Sie $t$ und $P$ je als globale Variablen an." ] }, { "cell_type": "code", "execution_count": null, "id": "796f316d", "metadata": {}, "outputs": [], "source": [ "% your code here" ] }, { "cell_type": "markdown", "id": "62365ea1", "metadata": {}, "source": [ "2. Legen Sie eine neue Function `fit_fcn` an, in welcher die zu fittende Funktion abhängig von $t$ und den Parametern $a, b$ ausgewertet wird." ] }, { "cell_type": "code", "execution_count": null, "id": "6e89e242", "metadata": {}, "outputs": [], "source": [ "function y = fit_fcn(t,params)\n", " \t% “params” muss als Vektor übergeben werden\n", " \ta = params(1);\n", "\tb = params(2);\n", " \ty = exp( -((t-a)/b)^2 );\n", "end" ] }, { "cell_type": "markdown", "id": "8f273ccd", "metadata": {}, "source": [ "3. Die Güte des Fittings wird durch den mittleren quadratischen Abstand zwischen Messwerten $P_m (t)$ und Funktionswerten $P(t)$ bestimmt. Die Funktionswerte hängen dabei von den gewählten Parametern $a, b$ ab:\n", "\n", "$$G(a,b) = \\frac{1}{n} \\sum_{i=1}^n {\\left(P(t_i)-P_{m_i}\\right)^2}$$\n", "\n", "Die Parameter $a, b$ sind also so zu bestimmen, dass $G$ minimal wird.\n", "\n", "Dazu muss nach beiden Parametern abgeleitet und Null gesetzt werden:\n", "\n", "$$\\frac{\\partial G}{\\partial a} = 0 = \\frac{1}{n}\\sum_{i=1}^n{2\\left(P(t_i)-P_{m_i}\\right)\\cdot\\frac{\\partial P(t_i)}{\\partial a}}$$\n", "$$\\frac{\\partial G}{\\partial b} = 0 = \\frac{1}{n}\\sum_{i=1}^n{2\\left(P(t_i)-P_{m_i}\\right)\\cdot\\frac{\\partial P(t_i)}{\\partial b}}$$\n", "\n", "Zur Vereinfachung können die Konstanten $n$ und $2$ heraus gekürzt werden:\n", "\n", "$$0 = \\sum_{i=1}^n{\\left(P(t_i)-P_{m_i}\\right)\\cdot\\frac{\\partial P(t_i)}{\\partial a}}$$\n", "$$0 = \\sum_{i=1}^n{\\left(P(t_i)-P_{m_i}\\right)\\cdot\\frac{\\partial P(t_i)}{\\partial b}}$$\n", "\n", "Sie benötigen also die partiellen Ableitungen der $e$-Funktion je nach $a$ und $b$. Diese Gleichungen werden **Bestimmungsgleichungen** genannt." ] }, { "cell_type": "markdown", "id": "efe97d1d", "metadata": {}, "source": [ "4. Legen Sie eine neue Function `fcn` an, in welcher Sie die Bestimmungsgleichungen abhängig von $a$ und $b$ auswerten:" ] }, { "cell_type": "code", "execution_count": null, "id": "efa8cdc7", "metadata": {}, "outputs": [], "source": [ "function f = fcn(params)\n", " \t% Aufruf der globalen Messwerte:\n", " \tglobal tm Pm\n", " \t% params ist ein Vektor und enthält a und b\n", " \ta = params(1);\n", "\tb = params(2);\n", " \t% Vor der Summenbildung wird die e-Funktion mit den\n", " \t% aktuellen Parametern ausgewertet\n", " \tf0 = fit_fcn(tm,params);\n", " \t% Nun werden die Bestimmungsgleichungen ausgerechnet:\n", " \t% (Partielle Ableitungen einfügen!)\n", " \tf(1,1) = sum( (f0-Pm).*%... );\n", " \tf(2,1) = sum( (f0-Pm).*%... );\n", "end" ] }, { "cell_type": "markdown", "id": "a7749ff2", "metadata": {}, "source": [ "5. Um die Jacobi-Matrix einer Funktion numerisch zu ermitteln, können Sie folgende `function` verwenden ($f$ muss als Functionhandle `@(a,b)` übergeben werden):" ] }, { "cell_type": "code", "execution_count": null, "id": "6036907b", "metadata": {}, "outputs": [], "source": [ "% Bestimmt die Jacobi-Matrix beliebiger Funktionen f durch Approximation\n", "function J = jac(x,f)\n", " % Dimension der Jacobi-Matrix bestimmt sich aus der Anzahl der Variablen \n", " % (=Spalten) und Anzahl der Gleichungen (= Zeilen)\n", " n = length(x);\n", " % Funktionswerte an der Stelle x\n", " f0 = f(x);\n", " for i = 1:n\n", " % Schrittweite zur Approximation der Ableitung\n", " h = sqrt(eps)*max(1.0e-8,abs(x(i)));\n", " % Zurücksetzen des x-Vektors auf Ausgangsposition\n", " x1 = x;\n", " % Erweitern der i-ten Komponenten von x um Schrittweite h\n", " x1(i)=x1(i)+h;\n", " % Berechnung einer Spalte der Jacobi-Matrix\n", " J(:,i) = (f(x1)-f0)/h;\n", " end\n", "end" ] }, { "cell_type": "markdown", "id": "5fc69e9e", "metadata": {}, "source": [ "6. Die Vorschrift des mehrdimensionalen Newtonverfahrens lautet:\n", "\n", "$$J(x_k)\\cdot h_k = -F(x_k)$$\n", "$$x_{k+1} = x_k + h_k$$\n", "\n", "Hierbei sind $F$ die Bestimmungsgleichungen und $J$ deren Jacobi-Matrix. Die Variable $x$ ist in unserem Fall ein Vektor und enthält die Parameter $a$ und $b$.\n", "\n", "Um das Newtonverfahren zu starten, benötigen Sie Startwerte für $a$ und $b$.\n", "Es eignen sich z.B.:\n", "\n", "$a = 12.8, b = 3.5$\n", "\n", "Das lineare Gleichungssystem aus der ersten Zeile können Sie mit dem Backslash-Operator (`\\`) lösen (`mldivide`):" ] }, { "cell_type": "code", "execution_count": null, "id": "03442a2f", "metadata": {}, "outputs": [], "source": [ "A\\b = x;" ] }, { "cell_type": "markdown", "id": "81834e86", "metadata": {}, "source": [ "7. Werten Sie nach der Bestimmung der Parameter deren Güte aus. Wie groß ist der mittlere quadratische Abstand zwischen Messwerten und Fitting?" ] }, { "cell_type": "code", "execution_count": null, "id": "95e3a6a6", "metadata": {}, "outputs": [], "source": [ "% your code here" ] }, { "cell_type": "markdown", "id": "ea3aaf6c", "metadata": {}, "source": [ "8. Wenden Sie das Verfahren auch auf Datensatz B an.\n", "\n", "## Lösung\n", "\n", "\n", "