Voraussetzungen
Programmier-Grundlagen
einfache AnnĂ€herungsformeln fĂŒr Integrale
Lerninhalte
Grundlagen und Realisierung numerischer Integration
Grundlagen und Realisierung numerischer Schrittweitensteuerung
Validierung von Programmroutinen mittels Unit Tests
Numerische Integration (mit Schrittweitensteuerung)#
Aufgabe 1: Vorarbeit mit Stift und Papier#
Entwickeln Sie mit Stift und Papier (und am besten auch einer Skizze) die Trapezregel zur numerischen Approximation von Integralen beliebiger Funktionen auf beliebigen Intervallen.
Aufgabe 2: Numerische Integration#
Die Simpson-Regel erweitert dieses Konzept. Statt einer Geraden wird hier zur Approximation eine Parabel durch die Randpunkte und den Mittelpunkt des Intervals gelegt und der FlÀcheninhalt darunter bestimmt. So kann die Fehlerordnung der Approximation erhöht werden. Die Integrationsformel lautet dann

Schreiben Sie ein Programm zur numerischen Berechnung von
Achtung
Denken Sie daran, dass Eingaben nicht immer mit der Funktionsweise Ihrer Funktion kompatibel sein mĂŒssen! Wie geht Ihre Funktion beispielsweise mit der Polstelle um, wenn jemand
%%file numInt.m
%function [I, dt]= numInt(f,a,b,tol)
% Compute numeric integral of f on [a, b] to tolerance tol via Simpson's rule. Step width is regulated via comparison to result of Trapezoidal rule.
% Inputs: function, lower boundary, upper boundary, tolerance
% Output: integration result, step size
function [I, dt] = numInt(f,a,b,tol)
% insert your code here
end
Aufgabe 3: Integration mit Schrittweitensteuerung#
Nun soll die Anzahl der verwendeten Teilintervalle so lange verdoppelt werden, bis die Differenz zwischen Simpson- und Trapezregel kleiner als die vom Benutzer vorgegebenen Toleranz tol
ist.
Der Vergleich der beiden Ergebnisse ermöglicht es, abzuschĂ€tzen, bei welcher Anzahl an Teilintervallen die gewĂŒnschte Genauigkeit erreicht wird. Durch eine derartige Schrittweitensteuerung kann zusĂ€tzlicher Rechenaufwand durch zu kleine Schrittweiten vermieden werden und trotzdem auf allen Intervallen die geforderte Genauigkeit erreicht werden.
Aufgabe 4: Test der Funktionsweise#
Testen Sie Ihre Funktion mit dem Unit Test. Sie sollten zumindest die ersten fĂŒnf der acht Anforderungen erfĂŒllen.
test_numInt()
Den Quellcode des Unit Tests können Sie hier ausklappen. Sehen Sie sich das Kapitel Unit Testing an, um Ihre Erinnerung an Unit Tests aufzufrischen.
Es werden die Ergebnisse von sieben Funktionen anhand der analytischen Lösungen (bzw. der numerisch zu erwartenden Reaktion) getestet. Der Vergleich lĂ€uft ĂŒber die Funktion assertVectorsAlmostEqual()
.
. Hier solltedf
= 2 sein. . Hier solltedf
= sein. . Hier solltedf
= sein. . Hier ist eine Schrittweitensteuerung notwendig. Das Ergebnis wird mit der Matlab-Routineintegral()
getestet.Das Integral sollte auch von rechts nach links funktionieren fĂŒr
.FĂŒr
dĂŒrfte die Schrittweite schnell zu klein werden. DafĂŒr testettest_numInt
, obnumInt.m
fĂŒr dieses Integral eine Fehlermeldung auswirft. Das geschieht mitassertExceptionThrown
.Ebenso sollte
sein.
Klappen Sie die Box aus, um test_numInt
nÀher anzusehen.
Show code cell source
function test_suite=test_numInt
% initialize unit tets
try
test_functions=localfunctions();
catch
end
initTestSuite;
%%%%%%%%%%%%%%%%%%%%%%%
% Basic tests %
%%%%%%%%%%%%%%%%%%%%%%%
function test_numInt_basic
% test function of basic function
a = 0;
b = 1;
f = @(x) x;
tol = 10^-6;
[I, df] = numInt(f,a,b,tol);
assertVectorsAlmostEqual(I,0.5)
function test_numInt_negativeStartOfInterval
% test function of negative start of interval
a = -1;
b = 1;
f = @(x) x;
tol = 10^-6;
[I, df] = numInt(f,a,b,tol);
assertVectorsAlmostEqual([I, df],[0, 2])
function test_numInt_moreComplexFunction
% test function of x^5 + x
a = 0;
b = 1;
f = @(x) x^5+x;
tol = 10^-6;
[I, df] = numInt(f,a,b,tol);
assertVectorsAlmostEqual([I, df],[2/3, 2^-10])
function test_numInt_stepsWidth
% test function of exp(x) to see if step width is correct
a = -1;
b = 1;
f = @(x) exp(x);
tol = 10^-6;
[I, df] = numInt(f,a,b,tol);
% !!! width (2^-9) determined via testing !!! 0.001953125000000
assertVectorsAlmostEqual([I, df],[exp(1) - 1/exp(1), 2^-9])
function test_numInt_stepsWidth_2
% test function of 1-cos(-0.33*x.^2-0.1*x +1) where step width control is necessary
a = 0;
b = 10;
f = @(x) 1-cos(-0.33*x.^2-0.1*x +1);
tol = 10^-6;
[I, df] = numInt(f,a,b,tol);
assertVectorsAlmostEqual(I,integral(f, a, b))
%%%%%%%%%%%%%%%%%%%%%%%
% More advanced tests %
%%%%%%%%%%%%%%%%%%%%%%%
function test_numInt_invertedInterval
% test function of inverted interval (start after end)
a = 1;
b = 0;
f = @(x) x;
tol = 10^-6;
[I, df] = numInt(f,a,b,tol);
assertVectorsAlmostEqual(I,-0.5)
function test_numInt_poleInIntervall
% test function of 1/x
a = -0.5;
b = 1;
f = @(x) 1/x;
tol = 10^-6;
assertExceptionThrown(@() numInt(f,a,b,tol))
function test_numInt_symmetricIntegral
% test function of 1/x
a = -1;
b = 1;
f = @(x) 1/x;
tol = 10^-6;
[I, df] = numInt(f,a,b,tol);
assertVectorsAlmostEqual(I,0)
Aufgabe 5: Vergleich mit der Praxis#
Vergleichen Sie Ihre Ergebnisse auch mit der Matlab-Routine Integral
. Ăberlegen Sie sich dazu wichtige KenngröĂen und Testfunktionen.
Hinweis
Neben der reinen Funktion, die Sie jetzt offensichtlich sehr gut realisiert haben, hat der Code allerdings noch weitere QualitĂ€tskriterien. Ein wichtiges Kriterium ist z. B. der Rechenaufwand bzw. die Zeit, die eine AusfĂŒhrung benötigt. Dieser kann hier noch optimiert werden, indem die berechneten Werte aus der jeweils vorherigen Iteration weiterverwendet werden, wodurch in jeder Iteration nur ein Drittel so viele Werte berechnet werden wie in der einfachen Implementierung. Aber das soll Ihnen vorlĂ€ufig erspart bleiben.