sellquiz
Version:
An open source domain-specific language for online assessment
211 lines (122 loc) • 8.85 kB
Plain Text
%course Mathematik 1
%quiz MA1 meets PI1
Java: Summe
Schreiben Sie einen Codeausschnitt, in dem die Summe $s=sum_(i=0)^n i$ berechnet wird.
* Variable `n` ist bereits deklariert worden. Der initiale Wert ist jedoch unbekannt und wird hier durch ein Fragezeichen dargestellt.
* Das ganzzahlige Ergebnis soll in Variable `s` stehen.
JavaBlock b
given 'int n = §23§;'
assert 's == 276'
$ #b $
%%%
Java: Potenzreihen
JavaMethod exp
assert 'Math.abs(exp(8, 1.0) - 2.71827876984127) < 1e-6'
assert 'Math.abs(exp(10, 0.5) - 1.6487212706873655) < 1e-6'
Definieren Sie eine Java-Methode mit dem Namen `exp` zur Annäherung der _Potenzreihe_ für $f(x)=e^x="exp"(x)=sum_(k=0)^(oo) 1/(k!) x^k$.
* Die Methode erhält einen ganzzahligen Parameter `n`.
* Die Methode berechnet $"exp"(x) approx sum_(k=0)^n 1/(k!) x^k$.
* Berechnen Sie $x^k$ mit `Math.pow(x, k)` .
* Für die Berechnung der Fakultät $k!$ steht Ihnen keine vorhandene Methode zur Verfügung. Berechnen Sie diese selbst innerhalb der Methode `exp` (Tipp: Ihre Methode besteht aus zwei geschachtelten Schleifen).
%_Tipp: Schreiben Sie zwei geschachtelte Schleifen. Die äußere Schleife berechnet die Summe; die innere Schleife berechnet die Fakultät._
_Hinweis: definieren Sie nur die Methode selbst. Vergessen Sie nicht die Methode als öffentlich und statisch zu deklarieren. Geben Sie keine Klasse an._
$ #exp $
%%%
Java: Polynome (1/3): Funktionswert bestimmen
Sei $f : RR -> RR$ ein Polynom $n$-ten Grades, also $f(x) = sum_(i=0)^n a_i x^i$ mit $a_0,...,a_n \in RR$ und $a_n != 0$ falls $n>1$.
Schreiben Sie eine Java-Methode mit dem Namen `polynom`.
* Parameter: ein Array `a` vom Typ `double` für die Koeffizienten $a_i$.
* Berechnen Sie $x^i$ mit `Math.pow(x, i)` .
* Rückgabe: $f(x)$.
_Hinweis: definieren Sie nur die Methode selbst. Vergessen Sie nicht die Methode als öffentlich und statisch zu deklarieren. Geben Sie keine Klasse an._
JavaMethod polynom
assert 'Math.abs(polynom(new double[] {4, -3, 0, 2}, 2.1) - 16.222) < 1e-6'
$ #polynom $
%%%
Java: Polynome (2/3): Ableitung
Sei $f : RR -> RR$ ein Polynom $n$-ten Grades, also $f(x) = sum_(i=0)^n a_i x^i$ mit $a_0,...,a_n \in RR$ und $a_n != 0$ falls $n>1$.
Schreiben Sie eine Java-Methode `polynom_ableiten`.
* Parameter (genau wie in der letzten Aufgabe): ein Array `a` vom Typ `double` für die Koeffizienten $a_i$.
* Zurückgegeben werden soll ein Array, welches das Polynom $f'(x)$, also das abgeleitete Eingabepolynom, beschreibt. _Tipp: Achten Sie darauf, dass das Ergebnisarray um genau ein Element kürzer ist, als das Eingabearray._
_Hinweis: definieren Sie nur die Methode selbst. Vergessen Sie nicht die Methode als öffentlich und statisch zu deklarieren. Geben Sie keine Klasse an._
JavaMethod polynom_ableiten
assert 'compare_arrays__double(polynom_ableiten(new double[] {4, -3, 0, 2}), new double[] {-3, 0, 6}, 1e-6)'
$ #polynom_ableiten $
%%%
Java: Polynome (3/3): Integration
Sei $f : RR -> RR$ ein Polynom $n$-ten Grades, also $f(x) = sum_(i=0)^n a_i x^i$ mit $a_0,...,a_n \in RR$ und $a_n != 0$ falls $n>1$.
Schreiben Sie eine Java-Methode `polynom_integrieren`.
* Parameter (genau wie in den letzten Aufgaben): ein Array `a` vom Typ `double` für die Koeffizienten $a_i$.
* Zurückgegeben werden soll ein Array, welches das Polynom $int f(x) dx$, also das integrierte Eingabepolynom, beschreibt. _Tipp: Achten Sie darauf, dass das Ergebnisarray um genau ein Element länger ist, als das Eingabearray._
_Hinweis: definieren Sie nur die Methode selbst. Vergessen Sie nicht die Methode als öffentlich und statisch zu deklarieren. Geben Sie keine Klasse an._
JavaMethod polynom_integrieren
assert 'compare_arrays__double(polynom_integrieren(new double[] {4, -3, 0, 2}), new double[] {0, 4, -1.5, 0, 0.5}, 1e-6)'
$ #polynom_integrieren $
%%%
Java: Newtonverfahren (1/3)
In dieser Aufgabe implementieren Sie das _Newtonverfahren_ zur näherungsweisen Bestimmung von Nullstellen.
* Die Aufgabe ist insgesamt in drei Teilaufgaben gegliedert. Sie können alle drei Aufgabenteile unabhängig voneinander bearbeiten und auswerten lassen.
* Ziel ist es, die Nullstelle von $f(x)=x^2+2-e^x$ zu bestimmen. Diese Aufgabe finden Sie auch im Mathematik 1 Skript auf den Seiten 102 und 103.
__Im ersten Aufgabenteil implementieren Sie eine Java-Methode mit dem Namen `f`.__
* Parameter: `x` (Gleitkommazahl).
* Geben Sie $y=f(x)=x^2+2-e^x$ zurück.
* Berechnen Sie $e^x$ mit `Math.exp(x)`. Den Import für die Mathematik-Bibliothek geben Sie selbst nicht an.
_Hinweis: definieren Sie hier ausschließlich die Methode `f`. Vergessen Sie nicht die Methode als öffentlich und statisch zu deklarieren. Geben Sie keine Klasse und keine `main`-Methode an._
JavaMethod f
assert 'Math.abs(f(1.23) - 0.09167046371032672) < 1e-6'
assert 'Math.abs(f(-0.53) - 1.6922950303216449) < 1e-6'
$ #f $
%%%
Java: Newtonverfahren (2/3)
__Im zweiten Aufgabenteil implementieren Sie eine Java-Methode mit dem Namen `fd` zur Bestimmung von $f'(x)$.__
* Parameter: `x` (Gleitkommazahl).
* Geben Sie $y=f'(x)$ zurück. Bestimmen Sie die Ableitung von $f(x)=x^2+2-e^x$ von Hand.
* Berechnen Sie $e^x$ mit `Math.exp(x)`. Den Import für die Mathematik-Bibliothek geben Sie selbst nicht an.
_Hinweis: definieren Sie hier ausschließlich die Methode `fd`. Vergessen Sie nicht die Methode als öffentlich und statisch zu deklarieren. Geben Sie keine Klasse und keine `main`-Methode an._
JavaMethod fd
assert 'Math.abs(fd(-1.5) - (-3.22313016014843)) < 1e-6'
assert 'Math.abs(fd(0.5) - (-0.6487212707001282)) < 1e-6'
$ #fd $
%%%
Java: Newtonverfahren (3/3)
__Im dritten Aufgabenteil setzen Sie das Newtonverfahren um, und verwenden dabei die Methoden aus den letzten beiden Aufgabenteilen.__
* Schreiben Sie eine Java-Methode mit dem Namen `newton`. Der erste Parameter `n` ist ganzzahlig. Der zweite Parameter `x0` gibt den Startwert an (welcher Datentyp passt hier?).
* Die Methode berechnet die Newtonfolge $x_{n+1} = x_n - (f(x_n))/(f'(x_n))$.
* Rufen Sie die Methoden der beiden letzten Teilaufgaben an den geeigneten Stellen auf.
* Sie geben $x_n$ zurück.
_Hinweis: definieren Sie hier ausschließlich die Methode `newton`. Vergessen Sie nicht die Methode als öffentlich und statisch zu deklarieren. Geben Sie keine Klasse und keine `main`-Methode an._
JavaMethod newton
hidden_method 'public static double f(double x) { return x*x + 2 - Math.exp(x); }'
hidden_method 'public static double fd(double x) { return 2*x - Math.exp(x); }'
assert 'Math.abs(newton(100, 1.0) - 1.3190736768573652) < 1e6'
$ #newton $
%%%
Java: Einfache Approximation eines Integrals
Für manche Integrale kann keine Stammfunktion angegeben werden.
* Ein Beispiel ist $int e^(-x^2) dx$.
* In solchen Fällen kann man das Integral _näherungsweise_ lösen. Hierzu gibt es verschiedene Verfahren.
In dieser Aufgabe nutzen wir die __Sehnentrapezformel__, da diese sehr einfach implementiert werden kann.
Die Näherung wird wie folgt berechnet: $int_a^b f(x) approx h( f(a)/2 + f(x_1) + ... + f(x_(n-1)) + f(b)/2)$ mit $h = (b-a)/n$ und $x_i=a+i*h$.
* Schreiben Sie eine Methode mit dem Namen `stf`.
* Die Parameter der Methode sind `a`, `b` und `n` (in dieser Reihenfolge). Entscheiden Sie, welche der Parameter vom Typ `double`, und welche vom Typ `int` sind.
* Sie können eine bereits vorhandene (aber hier nicht sichtbare) Methode `public static double f(double x) { ... }` zur Berechnung von $f(x)$ aufrufen.
JavaMethod stf
hidden_method 'public static double f(double x) { return Math.exp(-x*x); }'
assert 'Math.abs(stf(0.0, 1.0, 1000) - 0.746824163469049) < 1e-6'
$ #stf $
STOP
%%%
=== OLD ===
Java: Einfache Approximation eines Integrals
Für manche Integrale kann keine Stammfunktion angegeben werden.
* Ein Beispiel ist $int e^(-x^2) dx$.
* In solchen Fällen kann man das Integral _näherungsweise_ lösen. Hierzu gibt es verschiedene Verfahren.
In dieser Aufgabe nutzen wir die __Mittelpunktsregel__, da diese eher einfach implementiert werden kann.
Die Näherung wird wie folgt berechnet: $int_a^b f(x) approx h * sum_(k=1)^n f(a - h/2 + k*h)$ mit $h = (b-a)/n$
* Schreiben Sie eine Methode mit dem Namen `mpr`.
* Die Parameter der Methode sind `a`, `b` und `n` (in dieser Reihenfolge). Entscheiden Sie, welche der Parameter vom Typ `double`, und welche vom Typ `int` sind.
* Sie können eine bereits vorhandene (aber hier nicht sichtbare) Methode `public static double f(double x) { ... }` zur Berechnung von $f(x)$ aufrufen.
JavaMethod mpr
hidden_method 'public static double f(double x) { return Math.exp(-x*x); }'
assert 'Math.abs(mpr(0.0, 1.0, 1000) - 0.746824163469049) < 1e-6'
$ #mpr $