{ "cells": [ { "cell_type": "markdown", "id": "f96b7b86", "metadata": {}, "source": [ "(content:references:matlab_polynomfitting)=\n", "# 3. Polynomfitting\n", "\n", "Ziel dieser Übung ist das Fitting von Messdaten mittels Polynomen. Dazu sollen die Benutzer:innen im zu schreibenden Programm die notwendigen Stützstellen per Mauseingabe vorgeben können. Anschließend soll ein Polynom mit frei wählbarem Grad an die Messwerte gefittet werden.\n", "\n", "## Situation\n", "\n", "Für ein Simulations- und Optimierungsprogramm müssen Messwertverläufe in Form von Kennlinien bereitgestellt werden (Polynome).\n", "\n", "Zunächst muss dazu ein Programm geschrieben werden, welches Polynome eines beliebigen Grades auf Basis von gegebenen Stützpunkten berechnet.\n", "\n", "Diese Stützpunkte sollen dann vorerst von den Benutzer:innen händisch vorgegeben werden können.\n", "\n", "Zum Abschluss sollen optimale Polynome mit vorgefertigten Matlab-Routinen berechnet werden.\n", "\n", "MW_01.txt\n", "\n", "MW_02.txt\n", "\n", "MW_03.txt\n", "\n", "## 1. Polynomgenerator\n", "\n", "Erzeugen Sie ein neues Skript und legen Sie dort eine neue Function `main` an.\n", "Legen Sie außerdem eine Variable n für den Grad der zu erzeugenden Polynome an.\n", "Erzeugen Sie nun $n+1$ zufällige x- sowie y-Werte." ] }, { "cell_type": "code", "execution_count": null, "id": "48b61409", "metadata": {}, "outputs": [], "source": [ "%% file main.m\n", "\n", "x = 10*rand(n+1,1);" ] }, { "cell_type": "markdown", "id": "6a1b12d8", "metadata": {}, "source": [ "Legen Sie nun eine weitere Function `fitpoly` mit drei Eingabe- und einem Rückgabewerten an.\n", "\n", "Die Funktion soll am Ende dynamisch die Polynomkoeffizienten ermitteln." ] }, { "cell_type": "code", "execution_count": null, "id": "7997c453", "metadata": {}, "outputs": [], "source": [ "%% file fitpoly.m\n", "\n", "% x – x-Werte, y – y-Werte, n – Grad des Polynoms\n", "function p = fitpoly(x,y,n)\n", "\n", "% your code here" ] }, { "cell_type": "markdown", "id": "7a323baf", "metadata": {}, "source": [ "Polynome haben generell folgende Form ($n+1$ Koeffizienten bei Grad $n$):\n", "\n", "$$f(x)=p_{n+1} x^n + p_n x^{n-1}+p_{n-1} x^{n-2} + \\dots + p_1$$\n", "\n", "Bei Eingabe eines der x-Werte soll das Polynom den entsprechenden y-Wert zurückgeben. Dadurch ergibt sich ein lineares Gleichungssystem (LGS).\n", "\n", "Stellen Sie dieses LGS in Matrix-Form ($Ax = b$) auf und versuchen Sie dessen Struktur in das Matlab-Skript zu übertragen.\n", "Wie kann die Matrix $A$ abhängig von $n$ dynamisch erstellt werden?\n", "\n", "In der Variablen $p$ sollen schließlich die ermittelten Koeffizienten zurückgegeben werden.\n", "\n", "```{admonition} Tipp\n", ":class: tip\n", "Nutzen Sie eine `for`-Schleife zur Erzeugung der Matrix.\n", "```\n", "\n", "## 2. Polynomevaluierung\n", "\n", "Um die Richtigkeit der berechneten Koeffizienten zu prüfen wird eine Funktion benötigt, welche die ermittelten Polynome an den entsprechenden x-Werten auswertet.\n", "\n", "Legen Sie dazu eine neue Function `evalpoly` mit zwei Eingangs- und einem Rückgabewert an." ] }, { "cell_type": "code", "execution_count": null, "id": "200f46e5", "metadata": {}, "outputs": [], "source": [ "%% file evalpoly.m\n", "\n", "% p – Polynomkoeffizienten, x - Abfragestellen\n", "function y = evalpoly(p,x)\n", "\n", "% your code here" ] }, { "cell_type": "markdown", "id": "15cd78d6", "metadata": {}, "source": [ "Für die Polynome gilt allgemein weiterhin die o.g. Formel. Erzeugen Sie also ein Programm, welches basierend auf einer variablen Anzahl von Polynomkoeffizienten entsprechende y-Werte berechnet und zurückgibt.\n", "\n", "## Benutzerdefinierte Polynome\n", "\n", "Laden Sie die Messwerte in Ihr Programm (in der `main`-Function) und plotten Sie diese.\n", "Anschließend soll mittels der Funktion `ginput` eine Benutzereingabe möglich sein, über welche die Polynomstützpunkte händisch definiert werden.\n", "\n", "Diese sollen schließlich ausgewertet und das entsprechende Polynom geplottet werden.\n", "\n", "_Pseudocode:_" ] }, { "cell_type": "code", "execution_count": null, "id": "ac4df722", "metadata": {}, "outputs": [], "source": [ "% Hauptprogramm\n", "function main\n", "\tn = 3; % Gewünschter Grad des Polynoms\n", "\tImport der Messwerte\n", "\t% Öffnen eines figure-Fensters und ggf. Löschen von \n", "\t% bestehendem Inhalt\n", "\tfigure(1)\n", "\tclf\n", "\tPlotten der Messwerte\n", "\thold on\n", "\ti = 1; % Zählvariable\n", "\twhile i\n", "
- Hinweis: Dieses Video ist von YouTube aus eingebunden und nicht Teil des frei lizenzierten Materials! -

\n", "\n" ] } ], "metadata": { "kernelspec": { "display_name": "Octave", "language": "octave", "name": "octave" }, "language_info": { "file_extension": ".m", "help_links": [ { "text": "GNU Octave", "url": "https://www.gnu.org/software/octave/support.html" }, { "text": "Octave Kernel", "url": "https://github.com/Calysto/octave_kernel" }, { "text": "MetaKernel Magics", "url": "https://metakernel.readthedocs.io/en/latest/source/README.html" } ], "mimetype": "text/x-octave", "name": "octave", "version": "6.2.0" } }, "nbformat": 4, "nbformat_minor": 5 }