%% Musterlösung zur Newton-Iteration fuer Systeme
% Die Aufgabe ist als Skript mit lokalen Unter-Funktionen ausgeführt.
% Zugleich illustriert sie MATLAB(R)'s  _Markup_- und
% _Publish_-Möglichkeiten.
% 
% Übg. Num. Meth. I, SS 2014,18,20, C. Brand

%% Aufgabenstellung
% Lösen Sie das Gleichungssystem
% 
% $$\begin{array}{rcl} 
%      2x_1 - x_2         &=& e^{-x_1} \\ 
%      x_1 + 2\sin x_2   &=& \cos x_2
% \end{array}$$
% 
% mit dem Newton-Verfahren. Beginnen Sie mit |x = [1; 1]|.

%% Setze den Startwert, rufe Newton-Iteration auf
% In diesem Skript sind die Funktion, die Jacobi-Matrix sowie der iterative
% Prozess des Newton-Verfahrens als Unterfunktionen ausgefuehrt. Die
% Skript-Befehle setzen nur den Startwert und rufen die Unterfunktion zum
% Newton-Verfahren auf.
% 
x  = [1; 1];
nst=newton(x);
disp('Nullstelle:  ') 
format long g
disp(nst)

%% Newton-Iteration
% Ähnlich dem Fixpunkt-Musterprogramm.  
% Der Befehl disp gibt Info-Text aus
% 
function x = newton(x0)
itmax = 100;                   % maximale Iterationszahl
errlim = 1.e-5;                % Fehlerschranke
for i=1:itmax
    x = x0 -  Df(x0)\f(x0);    % Newton-Schritt
    if norm(x-x0)<errlim       % Abbruchkriterium: Änderung in 2-Norm 
                               % Ausgabe Iterationsanzahl
        disp(['Konvergenz nach ',num2str(i),' Iterationen'])  
        return
    end
    x0 = x;
end
disp(['keine Konvergenz nach ',num2str(i),' Iterationen!'])
x = NaN;
end
 
%% Funktion und Jacobi-Matrix
%
function y = f(x) 
y= [   2*x(1)-x(2)-exp(-x(1)) 
       x(1)+2*sin(x(2))-cos(x(2))
   ];
end

function dy = Df(x)
dy= [ 2+exp(-x(1))        -1  
         1          2*cos(x(2))+sin(x(2))
    ];
end



