• Keine Ergebnisse gefunden

Programmieren f¨ur Physiker

N/A
N/A
Protected

Academic year: 2022

Aktie "Programmieren f¨ur Physiker"

Copied!
2
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Programmieren f¨ ur Physiker

Institut f¨ur Theoretische Physik

Interfakultatives Institut f¨ur Anwendungen der Informatik

Dr. S. Gieseke, Dr. A. Mildenberger SS 2010 – Blatt 06

http://comp.physik.uni-karlsruhe.de Bearbeitungszeitraum: bis 26. Mai 2010

Aufgabe 15: Interpolation mit kubischen Splines Pflichtaufgabe Bei numerischen Berechnungen tritt h¨aufig der Wunsch nach weiteren

”Funktionswerten“ von Datens¨atzen auf, von denen nur einzelne Punkte bekannt sind. Mittels einer Modellannahme

¨uber die zugrundeliegende Funktion k¨onnen neu zu berechnenden Punkte interpoliert werden.

Eine h¨aufig eingesetzte Methode sind sogenannte kubische Splinefunktionen.

Gegeben seien die St¨utzstellen ∆ = {a = x0 < x1 < . . . < xn = b} und die zugeh¨origen FunktionswerteY ={y0, y1, . . . , yn}, gesucht ist die kubische SplinefunktionS(Y;x), die durch diese Punkte f¨uhrt. Bei kubischen Splines werden abschnittsweise Polynome dritter Ordnung durch je zwei aufeinanderfolgende Punkte gelegt, so dass die Polynome selbst und ihre ersten beiden Ableitungen stetig an den Stellen xi, i = 1, . . . , n−1 anschließen. Das Problem wird eindeutig l¨osbar, wenn zus¨atzlich zwei Randbedingungen vereinbart werden: In dieser Aufgabe soll gefordert werden, dass die zweite Ableitung der Splinefunktion an den R¨andern x=aund x=b verschwindet.

Zentral bei der Berechnung der kubischen Splinefunktion sind die sogenannten

”Momente“, die zweiten Ableitungen an den St¨utzstellenMj :=S′′(Y, xj). F¨ur diese gilt das folgende tridiagonale (n+ 1)×(n+ 1) Gleichungssystem

2 λ0 0 . . . 0 µ1 2 λ1 . .. ... 0 µ2 2 . .. 0

... . .. ... ... λn1

0 . . . 0 µn 2

·

 M0

M1

M2

... Mn

=

 d0

d1

d2

... dn

mit den Gr¨oßen (j= 1, . . . , n−1) λj = xj+1−xj

xj+1−xj1

, µj = xj−xj1

xj+1−xj1

, dj = 6

xj+1−xj1

µyj+1−yj

xj+1−xj

− yj−yj1

xj−xj1

und den Randbedingungenλ0n=d0 =dn= 0.

In diesem System wird zun¨achst die untere Nebendiagonale eliminiert. Setze µ0 = 2 und f¨uhre f¨uri= 1,2, . . . , n nacheinander aus: f :=−µii−1,

µi := 2 +f·λi1, di :=di+f·di1.

Die neu berechneten Werteµ0, . . . , µn bilden dann die Diagonale des umgeformten Systems, die Nebendiagonaleλ0, . . . , λn−1 bleibt unver¨andert.

Nun die R¨ucksubstitution:Mn:=dnn und dann f¨uri=n−1, . . . ,0:Mi = (di−λiMi+1)/µi. Mit denMi sind die Koeffizienten vonS(Y;x) vollst¨andig bekannt:

S(Y;x) =αjj(x−xj) +γj(x−xj)2j(x−xj)3 f¨ur x∈[xj, xj+1] mit

αj =yj, βj = yj+1−yj

xj+1−xj

−2Mj +Mj+1

6 (xj+1−xj), γj =Mj/2, δj = Mj+1−Mj

6(xj+1−xj).

(2)

Implementieren Sie dieses Verfahren in einem C++-Programm. Verwenden Sie zum Testen die Datei/home/ck10/daten/a15-interpol.dat(steht auch auf der WWW-Seite), die einige Wer- tepaare (x, y) enth¨alt. Sie d¨urfen voraussetzen, dass diex-Werte aufsteigend geordnet sind.

Mittels einerwhile (datei >> ...) Schleife k¨onnen Sie aus der Datei Wertepaare (xi, f(xi)) in zwei Felder einzulesen, bis das Ende der Datei erreicht ist.

Werten Sie die Splinefunktion an 300 ¨aquidistantenx-Werten zwischen minimaler und maxima- ler St¨utzstelle aus und schreiben Sie jeweils x und den Wert der Splinefunktion zeilenweise in eine Datei. Die urspr¨ungliche Punktedatei und die von Ihnen erzeugte Ergebnisdatei schauen Sie sich bitte in einem geeigneten Plot-Programm (z.B. xmgrace oder gnuplot) an. Stellen Sie bitte die Ausgabe so ein, dass die gegebenen und die neu berechneten Funktionswerte durch verschiedene Farben oder Symbole erkennbar sind.

Aufgabe 16: Polynom-Interpolation freiwillig

Ein anderer Modellansatz (vgl. Aufgabe 15) zur Interpolation ist es, durch n+ 1 gegebene Datenpunkte (xi, f(xi)),i= 1, . . . , n+1 ein Polynom vom Gradnzu legen. Dieses kann dann zur Berechnung von weiteren Funktionswerten benutzt werden. Eine algorithmische Formulierung hierf¨ur ist das Verfahren von Neville, das Sie in der Vorlesung kennengelernt haben.

Setzen Sie das Verfahren in einem C++-Programm um. Werten Sie damit das Interpolations- Polynom, so wie in Aufgabe 15, an 300 ¨aquidistanten St¨utzstellen aus, schreiben Sie diese Werte in eine Datei und vergleichen Sie grafisch Polynom-Interpolation und Spline-Interpolation. Was beobachten Sie an den R¨andern?

Zum Knobeln: Nim-Spiel freiwillig

Beim Nim-Spiel in der hier betrachteten Variante gibt es zwei Spieler und zwei H¨aufen mit Streichh¨olzern auf dem Tisch. Die Spieler sind abwechselnd am Zug und haben dabei jeweils folgende zwei M¨oglichkeiten: Entweder von genau einem Haufen ihrer Wahl eine beliebige Zahl (≥1) an H¨olzchen zu entfernen, oder aber von beiden H¨aufen genau die gleiche Zahl an H¨olzchen zu entfernen. In jedem Zug muss also immer mindestens ein Streichholz weggenommen werden.

Wer mit seinem Zug das letzte Streichholz (oder die letzten Streichh¨olzer) wegnehmen kann, hat gewonnen.

Schreiben Sie zun¨achst ein C++-Programm, welches Sie dieses Spiel mit zwei Spielern spielen l¨asst. In diesem Fall soll das Programm also die Streichholzh¨aufen verwalten und dabei von beiden Spielern abwechselnd g¨ultige Z¨uge erfragen, bis ein Spieler gewonnen hat.

Interessant ist es, sich zu ¨uberlegen, welche Strategie in diesem Spiel zum Gewinn f¨uhrt. Gibt es Haufengr¨oßen, von denen aus der Sieg erzwungen werden kann?

Ersetzen Sie in Ihrem Programm einen Mitspieler durch den Computer und bringen Sie ihm Ihre Gewinnstrategie bei.

Hinweis: Es ist zweckm¨aßig, mit zwei zuf¨alligen Stapeln von je etwa 5 bis 25 Streichh¨olzern zu beginnen. Um dies zu erreichen, k¨onnen Sie vom Rechner erzeugte Zufallszahlen verwenden.

Nach der Anweisung #include <cstdlib> im Kopf des Programms k¨onnen Sie mit rand()%a ganzzahlige Zufallszahlen im Intervall [0, a[ erzeugen. Initialisieren Sie den Generator durch einmaligessrand((unsigned int)time(0)) am Anfang des Programms.

Referenzen

ÄHNLICHE DOKUMENTE

F¨ ur sehr kleine ǫ wird eine Unterscheidung nicht mehr funktionieren, da rationale Zahlen im Rechner nicht beliebig genau dargestellt sind.. Gehen Sie in Ihrem Programm

Aufgabe 28: Kochsche Schneeflocke freiwilliges Zusatztestat 1 In dieser Aufgabe soll mit C ++ eine grafische Ausgabe der Kochschen Schneeflocke programmiert werden. Auf der

F¨ ur sehr kleine ǫ wird eine Unterscheidung nicht mehr funktionieren, da rationale Zahlen im Rechner nicht beliebig genau dargestellt sind.. Gehen Sie in Ihrem Programm

Geben Sie nun die Ergebnisse in Form einer Tabelle aus, dabei soll pro Teilnehmer in einer Zeile die Teilneh- mernummer, die Einzelpunktzahlen und die Gesamtpunktzahl stehen..

Die Spieler sind abwechselnd am Zug und haben dabei jeweils folgende zwei M¨oglichkeiten: Entweder von genau einem Haufen ihrer Wahl eine beliebige Zahl (≥ 1) an H¨olzchen zu

Aufgabe 21: Quersumme freiwillig Schreiben Sie eine rekursive Funktion, die die Quersumme, also die Summe der Ziffern, einer positiven Zahl berechnet.. Verwenden Sie diese Funktion,

Aufgabe 26: Acht-Damen-Problem Pflichtaufgabe Auf einem Schachbrett sollen acht Damen so platziert werden, dass keine Dame eine andere Dame schlagen kann.. Im Schachspiel bewegen

(a) Beginnen Sie die Berechnung mit nur einem Intervall (N = 1) und verdoppeln Sie die Intervall-Anzahl so oft, bis die relative ¨ Anderung zweier aufeinanderfolgender Berechnungen