+1 Daumen
2,6k Aufrufe

Ich habe fast keine Ahnung von Matlab, kann mir hier jemand helfen:

Programmieraufgabe:

a) Schreiben Sie die MATLAB-Funktion NewtonV(x0,tol,maxiter), welche für eine fest vorgegebene Funktion \( f : \mathbb { R } ^ { n } \rightarrow \mathbb { R } ^ { n } \) ausgehend vom Startwert \( x0 \in \mathbb { R } ^ { n } \) solange Newton-Iterationen durchführt, bis das Abbruchkriterium \( \left\| x _ { k + 1 } - x _ { k } \right\| _ { 2 } \leq \text { tol } \) erreicht wurde oder eine maximale Anzahl an Iterationen maxiter überschritten wurde. Die Funktion soll in \( z \in \mathbb { R } ^ { n } \) die letzte Newton-Iterierte, in iter ∈ ℕ die Anzahl der durchgeführten Iterationen sowie eine Variable \( b \in \{ 0,1 \} \) (die 0 ist, falls die maximale Anzahl Iterationen erreicht wurde, sonst 1) zurückgeben.

Verwenden Sie als Approximation der Jacobimatrix die zentrierten Differenzen

$$\frac { \partial f _ { i } } { \partial x _ { j } } \approx \frac { f _ { i } \left( x + e _ { j } h \right) - f _ { i } \left( x - e _ { j } h \right) } { 2 h }$$

mit h = 10^{-6}. Die Funktion f soll dabei in einer separaten MATLAB-Funktion f(x) für Eingabewerte \( x \in \mathbb { R } ^ { n } \) und Rückgabewerte \( y = \left( f _ { 1 } ( x ) , \ldots , f _ { n } ( x ) \right) ^ { T } \in \mathbb { R } ^ { n } \) umgesetzt werden und so aufgestellt sein, dass mit obiger Funktion eine Lösung des folgenden Gleichungssystems (mit n = 2) ermittelt werden kann:

$$\begin{array} { r } { x _ { 1 } ^ { 2 } + x _ { 2 } ^ { 2 } + \frac { 3 } { 5 } x _ { 2 } = \frac { 4 } { 25 } } \\ { x _ { 1 } ^ { 2 } - x _ { 2 } ^ { 2 } + x _ { 1 } - \frac { 8 } { 5 } x _ { 2 } = \frac { 7 } { 50 } } \end{array}$$

Die MATLAB-Funktionen sollen dabei folgende Gestalt haben:

function [z,iter,b] = NewtonV(x_0,tol,maxiter)
...
end
function [y] = f(x)
...
end

b) Schreiben Sie das MATLAB-Skript main_NV.m, welche ausgehend von den Startwerten (1,1)T und (-1,-1)T unter Verwendung der MATLAB-Funktion NewtonV jeweils ausgibt, ob das Newton-Verfahren konvergiert ist, wie die Approximation an die Lösung lautet und wie viele Iterationen dazu benötigt wurden. Hierbei sei maxiter = 100 und tol = 10^(-5).


Mein Ansatz:

x = 2 % Startwert

j = 5 % Anzahl der Durchläufe 

for i = 1:j % Beginn der Schleife 

fx = x2 - 2; % Funktion

dx = 2*x; % Ableitung der Funktion 

x = x - fx/dx % Berechnung

end

Aber man darf denk ich ja nicht die normale Iterationsformel verwenden, sondern diese Approximation oder nicht?

Avatar von

Lol, den Kurs habe ich auch besucht.

1 Antwort

+1 Daumen

Hey,

dein Ansatz ist eigentlich schon recht brauchbar. In Matlab könnte eine Implementierung, die die Toleranz, Ableitung, Funktion und Iteration berücksichtigt, ca. so aussehen:

function x = Newton(f, fabl, x, iter, err)

% f Funktion Bsp: x^3-4
% fabl Ableitung von f Bsp: 3x^2
% x Startwert
% iter Anzahl an Iterationen (für die Schleife)
% err Absolute Fehler für die Toleranz

fprintf('x(0) = %10g \n', x)
for n = 1:iter
    d = f(x)/fabl(x);
    x = x - d;
    fprintf('x(%i) = %10g \n', n, x)
    if abs(d) < err
        fprintf('Konverg. erreicht...! \n')
        return
    end
end

Avatar von

Ein anderes Problem?

Stell deine Frage