Lösungen zu den ¨Ubungen — Mathematik für Informatiker

Werbung
Lösungen zu den Übungen — Mathematik für Informatiker
Komplexität und Berechenbarkeit
PostCorProbSolver::usage =
"’PostCorProbSolver’ ist ein verfänglich falscher Name. Das Programm löst
das Post´sche Korrespondenzproblem nicht für alle Instanzen auf den Array
’strArr1’ und ’strArr2’. Es kann lediglich bis zu einer vorgegebenen
Rekursionstiefe ’break’ versuchen, eine Lösung zu finden. Wird dann keine
Lösung gefunden, bricht das Programm ab und versucht sein Glück auf einem
anderen Weg falls vorhanden. Ohne diesen Mechanismus läuft das Programm
Gefahr, aufgrund der Halbentscheidbarkeit des zugrundeliegenden Problems,
nicht zu terminieren.
Mit geeigneten Heuristiken kann das Programm verfeinert werden - viel
Spass dabei! ";
Aufgabe 1
a)
nn
b)
n!
c)
|{0, 1}n | = 2n ,
|{0, 1}m | = 2m .
2n
Zahl der Funktionen = (2m )
d)
= 2m2
n
(* Testlauf *)
f nicht invertierbar, wenn m < n. Sei also nun m ≥ n:
arr1 = {"01", "0", "100"};
arr2 = {"11", "010", "00"};
PostCorProbSolver[arr1, arr2, 100]
Zahl der Funktionen = 2m (2m − 1) . . . (2m − 2n + 1)
Aufgabe 2
a)
Problem gelöst mit Lösungsstring: "010001100"
Indexfolge= {2, 3, 1, 3}
Berechenbar, denn tan(π/4) = 1. Also π = 4 arctan(1).
Mit d. Taylorreihe von arctan kann π beliebig genau berechnet werden.
b)
Man weiss nicht, og g berechenbar ist.
c)
h ist berechenbar, auch wenn wir h nicht kennen.
c)
Aufgabe 6 Reguläre Grammatik:
G = ({S, T }, {0, 1}, P, S)
P = {S → 1T,
T → 0T,
T → 1T,
T → 0}
Aufgabe 3 Nein, denn es gibt überabzählbar viele reelle Zahlen, aber nur abzählbar viele Programme (Turingmaschinen).
Aufgabe 4
a)
b)
Das Beispielprogramm zeigt, dass es eine TM gibt, die
nach endlicher Zeit hält, wenn die Instanz des Problems
lösbar ist. Ist die Instanz nicht lösbar, so hält die TM,...oder
auch nicht! ⇒Das Problem ist halbentscheidbar.
Hier gibt es eine Lösung: Die Reihe der Paare: 2,3,1,3
Die Folge lautet dann: 010001100
Regulärer Ausdruck: 1(0|1)∗ 0
(* Der BackTracker *)
BackTrack[index_, break_, strArr1_, strArr2_, solStr1_,
solStr2_, soltab_] :=
Module[{i, RetVec, RetStr, concat1, concat2, len, solv},
(* Vorinitialisierung *)
RetVec = {False, "", "", soltab};
If[index < break,
(* Alle Möglichkeiten durchgehen *)
For[i = 1, i <= Length[strArr1] && RetVec[[1]] == False ,
i++,
concat1 = solStr1 <> strArr1[[i]];
concat2 = solStr2 <> strArr2[[i]];
Aufgabe 7
len = Min[StringLength[concat1],
StringLength[concat2]];
(* ist Zwischenlösung gültig? *)
If[StringTake[concat1, len] == StringTake[concat2, len],
(*Indexfolge merken*)
solv = Append[soltab, i];
(* Ist es die endgültige Lösung ? *)
If[ concat1 == concat2,
RetVec = {True, concat1, concat2, solv},
(*Sonst Backtracker rekursiv aufrufen*)
RetVec =
BackTrack[index + 1, break, strArr1, strArr2,
concat1, concat2, solv];
(*Wenn Kein Ergebnis -> Backtrack!*)
If[RetVec[[1]] == False,
RetVec = {False, solStr1, solStr2, soltab}] ;
];
];
];
a)
Der Nachweis der Korrektheit von Turingmaschinen umfasst das Finden von Endlosschleifen. Dieses ist jedoch
unentscheidbar (Halteproblem). Nach der Church’schen
These ist das Halteproblem auch für C-Programme unentscheidbar. Damit ist dann auch die (schwierigere) Verifikation von C-Programmen unentscheidbar.
b)
Betrachte die Menge alle C-Programme, die nur Zeilen
der Form
printf(”<TEXT_i>”);
enthalten. Diese Menge ist zwar unendlich gross, jedoch
ist die Korrektheit entscheidbar, denn die Programme
enthalten keine Schleifen und Verzweigungen. Damit muß
zum Nachweis der Korrektheit nur geprüft werden, ob die
Konkatenation aller Texte gleich dem Text ist, der ausgedruckt werden soll und ob die im Text vorkommenden
Zeichen erlaubte Zeichen in Strings sind.
Aufgabe 8 Zu zeigen ist, dass R überabzählbar unendlich
ist.
Beweis:
Ann.: R ist abzählbar. Dann ist auch [0, 1) abzählbar und es
existiert eine Folge (xi ) mit [0, 1) = {xi | i ≥ 1}
];
RetVec
];
(* Das Prog *)
PostCorProbSolver[strArr1_, strArr2_, break_] := Module[{ret},
ret =
Block[{$RecursionLimit = Infinity},
z.B. könnte die Folge so anfangen:
BackTrack[0, break, strArr1, strArr2, "", "", {}]];
If[ret[[1]], Print["Problem gelöst mit Lösungsstring: ", ret[[2]]],
Print["Halbentscheidbarkeit hat durchgeschlagen!"]];
x1 = 0,1111111111111111111111...
If[ret[[1]], Print["Indexfolge= ", ret[[4]]]];
]
x2 = 0,2222222222222222222222...
1
x3
x4
x5
x6
x7
..
.
=
=
=
=
=
0,1212121212121212121212...
0,1234567890123456789012...
0,1231231231231231231231...
0,3149567452095874532490...
0,0985666255245348345302...
Aufgabe 13 Die Wahrscheinlichkeit für zwei aufeinanderfolgende Einsen in der Folge ist p2 und für zwei aufeinanderfolgende Nullen ist sie (1 − p)2 . Sei n = |(an )n∈{0,1} | und
m = |(bn )n∈{0,1} | die Länge der Ergebnis-Folge (bn )n∈{0,1} .
Dann gilt
dann wählen wir eine Zahl 0,2121111..., die sicher kein Ele1
1
2
2
ment dieser Folge ist, was im Widerspruch zur Annahme der m = 2 (1 − p − (1 − p) ) · n = 2 · 2 · p(1 − p) · n = p(1 − p) · n.
Abzählbarkeit von [0, 1) steht.
Allgemein lautet der Beweis:
Computeralgebra
x1 = 0, a11 , a12 , a13 , ...
x2 = 0, a21 , a22 , a23 , ...
x3 = 0, a31 , a32 , a33 , ...
..
.
mit aij ∈ {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
Sei nun (y) := 0, b1 b2 b3 b4 ... wie folgt definiert:
1 falls aii 6= 1
bi :=
2 falls aii = 1
Aufgabe 14
a)
fac[n_] :=
For[{a
a = a
If[n <
]
fac::usage = "fac[n] computes the factorial of n"
b)
Fac[0] := 1;
Fac[n_] := n * Fac[n - 1] /; n > 1
Fac[_] := Print["Not defined"];
damit sind alle Folgen (xi ) von (y) verschieden. Laut Annahme
Fac::usage
existiert aber eine Folge xn mit (y) = (xn ), was zum Widerspruch führt.
Folgerung: Die Menge R \ Q der irrationalen Zahlen ist über- Numerik
abzählbar.
Aufgabe 16
Aufgabe 9 Die Menge ist leer. (Siehe Gödel´sche Sätze)
In[5]:= Table[PNorm[{1,2,3,4,5},p], {p,1,50}]
Out[5]=
{15., 7.4162, 6.0822, 5.59365, 5.36022,
...
5.00001, 5.00001, 5., 5., 5., 5., 5., 5.}
Aufgabe 10 Da bei einem Modul m höchstens m verschiedene Zahlen in der Folge auftreten können, muss sich spätestens
nach m Folgengliedern eine Zahl wiederholen. Dann wiederholt
sich aber zwingend die ganze Folge, denn bei einem linearen
Kongruenzgenerator hängt die Zahl xn nur von der Vorgängerzahl xn−1 ab. Bei gleichem xn−1 ist damit auch xn gleich. Die
Folge wiederholt sich also periodisch.
Das Gesagte gilt übrigens für alle Generatoren, bei denen xn
nur von der Vorgängerzahl xn−1 oder einer anderen Zahl vor
xn abhängt.
Um bei festem Modul m die Periode zu verlängern, kann man
zur Bestimmung von xn eine Funktion f wählen, die von zwei
Vorgängerzahlen abhängt, z.B. xn = f (xn−1 , xn−2 ). Die maximale Periodendauer ist dann m(m − 1).
Aufgabe 18
EquiPoints[a_, b_, n_, f_] := Module[{j, x},
x = N[a + j (Abs[b - a]/(n - 1))];
Table[{x, f[x]}, {j, 0, n - 1}]
]
ChebyshevPoints[a_, b_, n_, f_] := Module[{k, x},
x = N[-Cos[(2k - 1) Pi/( 2n)]];
t = (a + b)/2 + (b - a) x /2;
Table[{t, f[t]}, {k, 1, n}]
]
PolyIntPol[n_,
Module[{i,
If[bEqui,
PntVec =
PntVec =
Aufgabe 12
b)
c)
= "Fac[n] computes the factorial of n"
PNorm[x_,p_] := N[(Sum[Abs[x[[i]]]^p, {i,1,Length[x]}])^(1/p)]
Table[PNorm[{1,2,3,4,5},p], {p,1,50}]
Zufallszahlen
a)
Module[{a, b},
= 1; b = n}, b > 1, b--,
* b];
0, Print["Not defined"], a]
Die Folge 101010101010 . . . ist absolut symmetrisch, aber
nicht zufällig, denn die Bits sind nicht unabhängig.
a_, b_, f_, bEqui_:True, Ext_:1] :=
j, m, y, g, x, s, t, PntVec},
EquiPoints[a, b, n, f],
ChebyshevPoints[a, b, n, f]];
m = Table[If[i == 0,1,(Part[PntVec, j + 1, 1])^i ],
{j, 0, n - 1} , {i, 0,n - 1}];
y = Table[Part[PntVec, j + 1, 2], {j, 0, n - 1}];
g = LinearSolve[m, y];
Die Häufigkeit aller Buchstabenpaare (11, 10, 01, 00)
zählen und testen ob sie gleich häufig sind. Die Folge
101010101010 . . . würde diesen Test offensichtlich nicht
bestehen. Allgemein kann man die Häufigkeiten aller nBit-Blöcke testen. Die relative Häufigkeit jedes der 2n nBit-Blöcke sollte nahe bei 1/2n liegen, denn dann sind die
Blöcke gleichverteilt.
func[x_] := g . Table[x^i, {i, 0, n - 1}];
Print["Koeffizientenmatrix:\n", N[MatrixForm[g]], "\nPlot:"];
s = Plot[{f[x], func[x]}, {x, a - Ext, b + Ext},
DisplayFunction -> Identity];
t = ListPlot[PntVec, DisplayFunction -> Identity,
PlotStyle -> PointSize[0.015]];
Show[{s, t}, DisplayFunction -> $DisplayFunction, PlotRange -> All];
Die Folge der Zahlen xi besitzt eine Periode, die höchstens die Länge n − 2 hat, wobei n der Modul ist. Die
Periode kann nicht die Länge n haben, denn die Zahlen 0
und 1 können in der Folge nicht vorkommen. Andernfalls
wäre die Periode gleich 1. Die Folge der Zufallsbits hat
dann eine Periode von höchstens n − 2.
]
PolyIntPol::usage = "PolyIntPol computes the polynomial interpolation of ’n’
points on a given function ’f’ in a specified interval between ’a’ and
’b’.The points are calculated equidistant in the interval with ’bEqui’ = True
(Default:=True), or with the Chebyshev-abscissa with ’bEqui’ = False. You can
extend the picture on the x-axis with the factor ’Ext’(Default:=1.0). Prototype:
PolyIntPol[n,a,b,f,bEqui,Ext]"
2
Koeffizienten fuer eine Linearkombination der
Basisfunktionen f[[1]],...,f[[k]]."
Aufgabe 19
a)
Wertetab = ReadList["ueb2neu.dat",Number, RecordLists -> True]
f[x_] := Exp[-x^2];
PolyIntPol[11, -2, 10, f]
ftab =
f4[x_]
f3[x_]
f2[x_]
f1[x_]
f0[x_]
20
15
10
xtab = Transpose[Wertetab][[1]]
ytab = Transpose[Wertetab][[2]]
5
-2
LeastSq[xtab,ytab,ftab]
2
4
6
8
Show[ListPlot[Transpose[{xtab,ytab}], DisplayFunction -> Identity],
Plot[{Sum[a[[i]]ftab[[i]][x], {i,1,Length[ftab]}],f[x]+3000},
{x,Min[xtab],Max[xtab]},
DisplayFunction -> Identity],
DisplayFunction -> $DisplayFunction,
Prolog -> PointSize[.01]
]
10
-5
-10
Aufgabe 20
a)
{f0,f1,f2,f3,f4}
:= x^4
:= x^3
:= x^2
:= x
:= 1
Display["ueb2neu.eps",%20,"EPS"]
Wenn man aus dem Modul aus Aufgabe 18 den Parameter func“
löscht, so ist dieser nach Beenden der Funktion PolyIntPol“” noch
”
bekannt. Die Funktion:
g[x_] := Sum[a[[i]]ftab[[i]][x], {i,1,Length[ftab]}]
Sumqu = Sum[(g[xtab[[i]]] - ytab[[i]])^2, {i,1,Length[xtab]}]
Max[Table[Abs[f[i] - func[i]], {i, -2, 10, 12/99}]]
bringt dann die Lösung: 1.39222
b)
c) Plot von Originalfunktion, Punkten und Lösungsfunktion:
Für diese Aufgabe wird der Funktionsaufruf “Max“ in die Funktion “PolyIntPol“ eingebunden:
40000
PolyIntPol[n_, a_, b_, f_, bEqui_:True, Ext_:1] :=
20000
Module[{i, j, m, y, g, func, max, x, s, t, PntVec},
If[bEqui,
PntVec = EquiPoints[a, b, n, f],
PntVec = ChebyshevPoints[a, b, n, f]];
m = Table[
10
If[i == 0, 1, (Part[PntVec, j + 1, 1])^i], {j, 0, n - 1}, {i, 0,
n - 1}];
y = Table[Part[PntVec, j + 1, 2], {j, 0, n - 1}];
-20000
g = LinearSolve[m, y];
15
20
25
30
35
40
45
func[x_] := g.Table[x^i, {i, 0, n - 1}];
-40000
Print["Koeffizientenmatrix:\n", N[MatrixForm[g]], "\nPlot:"];
(*Funktionserweiterung :*)
Print["Maximumnorm auf 100 Stützstellen: " ,
Max[Table[Abs[f[i] - func[i]], {i, a, b, Abs[b - a]/99}]]];
s = Plot[{f[x], func[x]}, {x, a - Ext, b + Ext},
DisplayFunction -> Identity];
t = ListPlot[PntVec, DisplayFunction -> Identity,
PlotStyle -> PointSize[0.015]];
Aufgabe 24
Show[{s, t}, DisplayFunction -> $DisplayFunction, PlotRange -> All];]
und anschließend zweimal aufgerufen mit
1 3
x
2
+ 23 x2
und
s1 (x) = − 21 x3 + 23 x2
a)
s0 (x) =
b)
Weil die zweite Ableitung an beiden Randpunkten nicht Null ist.
• Äquidistante Interpolation (bEqui:=False)
Ergebnis: Maximumnorm auf 100 Stützstellen: 1.39222
• Tschebyscheff-Interpolation (bEqui:=True)
Ergebnis: Maximumnorm auf 100 Stützstellen: 0.191125
Aufgabe 22
a)
Aufgabe 26
f[x_] := -(x-10)(x-20)(x-30)(x-40)+.5 x^3
Plot[f[x],{x,0,50}]
Wertetab = Table[{x,f[x]+6000 Random[]}, {x,8,46,1}]
ListPlot[Wertetab]
LeastSq[x_,y_,f_] := Module[{A,b,n,k},
k = Length[f];
n = Length[x];
A = Table[Sum[f[[l]][x[[i]]] f[[j]][x[[i]]], {i,1,n}],
{l,1,k}, {j,1,k}];
b = Table[Sum[y[[i]] f[[j]][x[[i]]], {i,1,n}],
{j,1,k}];
a = LinearSolve[A,b]
]
LeastSq::usage = "LeastSq[x,y,f] berechnet aus den Wertepaaren
(x[[i]],y[[i]]) eine Tabelle aller
TriDiag[hi_] := Module[{i, j, len},
len = Length[hi] + 1;
Table[
Switch[i - j,
0, 2 (hi[[i]] + hi[[i + 1]]),
-1, hi[[i + 1]],
1,hi[[i]],
_, 0],
{i, 1, len - 2}, {j, 1, len - 2}]
];
3
b)
Aufgabe 27
konvergent:
CubicSpline[x_, y_] :=
Module[{hi, ri, TriVec, y2, ai, bi, ci, di, func, s, k},
len = Length[x];
hi = Table[(x[[i + 1]] - x[[i]]), {i, 1, len - 1}];
ri =
N[Table[((6(y[[i + 1]] - y[[i]]))/
hi[[i]]) - ((6(y[[i]] - y[[i - 1]]))/hi[[i - 1]]), {i, 2,
len - 1}]];
TriVec = TriDiag[hi];
y2 = Join[{0}, LinearSolve[TriVec, ri], {0}];
c)
ai = N[Table[(y2[[i + 1]] - y2[[i]])/( 6 hi[[i]]), {i, 1, len - 1} ]];
bi = N[Table[y2[[i]]/2, {i, 1, len - 1}]];
ci =
N[Table[((y[[i + 1]] - y[[i]])/
hi[[i]]) - ((y2[[i + 1]] + 2 y2[[i]]) hi[[i]] /6), {i, 1,
len - 1}]];
di = y;
func =
N[Table[(ai[[i]]*(s - x[[i]])^3) + (bi[[i]]*(s x[[i]])^2) + (ci[[i]]*(s - x[[i]])) + di[[i]], {i, 1,
len - 1}]];
Show[
Table[Plot[func[[k]], {s, x[[k]], x[[k + 1]]},
DisplayFunction -> Identity], {k, 1, Length[func]}],
ListPlot[Transpose[{x, y}], DisplayFunction -> Identity,
PlotStyle -> PointSize[0.02]],
DisplayFunction -> $DisplayFunction];
];
Aufgabe 28
Funktionsaufruf:
Points2 = Table[{i, \[ExponentialE]^(-i^2)}, {i, -2, 10, 13/11}];
x = Transpose[Points2][[1]];
y = Transpose[Points2][[2]];
CubicSpline[x, y]
Ergebnis:
0.8
0.6
0.4
0.2
-2
2
4
6
8
10
Aufgabe 30
a)
y=a / x n
y=x
x
1
0
x + x/a ist symmetrisch zu y = x.
x
b)
Bew.:
c)
y = a/x,
x ↔ y : x = a/y ⇒ y = a/x.
Kurve flacher machen bei gleichem Schnittpunkt mit y = x.
Aufgabe 31
a)
Def.: (an )n∈N konvergiert gegen a gdw.
∀ε > 0∃N ∈ N∀n ≥ N |an − a| ≤ ε.
4
divergent:
alternierend konvergent:
alternierend divergent:
„ «
1
n n∈N
(n)n∈N
«
„
1
(−1)n
n
n∈N
((−1)n )n∈N
Quotientenkriterium; Jede beschränkte monotone Folge konvergiert.
Herunterladen