function Newtondemo2()
% En demonstration av konturlinjer och Newtonsmetod i 2 dimensioner.
% Newton tas stegvis och punkterna plottas ut.
% Såväl Jacobianan,"derivatamatrisen", som en differensapproximation
% finns med som funktioner.
%
% Vi betraktar systemet:
%      f1(x,y)=(x+3)*y^3-7)+18
%      f2(x,y)=sin(y*exp(x)-1)

clear all; close all;

% demo av kommandot contour:
f1=inline('(x+3).*(y.^3-7)+18','x','y');
f2=inline('sin(y.*exp(x)-1)','x','y');
xled=-1:0.1:2; yled=0:0.1:2;
[X,Y]=meshgrid(xled,yled);
F1=f1(X,Y);
figure(1)
contour(X,Y,F1)
figure(2)
F2=f2(X,Y);
C=contour(X,Y,F2,[-0.2,0,0.2]);
clabel(C)

% I figur3 ritar vi upp de två funktionernas 0-nivåer,
% väljer startpunkt och plottar nya punkter:
figure(3)
contour(X,Y,F1,[0,0],'r')
hold on
contour(X,Y,F2,[0,0],'b')
grid on
startx=ginput(1)'
plot(startx(1),startx(2),'*k')
xlabel('x');ylabel('y');title('Newtondemo')

% Nu kör vi metoden:
format long
slutx=Newtonsyst(@F,startx)
format short

% Newtons metod som en underfunktion:
function nollst =Newtonsyst(f,x)
 while 1
   p=menu('Vill Du ta ett Newtonsteg?','Ja','Nej');
   if p==2
       break
   end
   Fk=f(x);
   Jk=Jdiff(f,x);
   %Jk=J(x);
   dk=-Jk\Fk;
   nyttx=x+dk
   plot(nyttx(1),nyttx(2),'*k');plot([x(1);nyttx(1)],[x(2);nyttx(2)],'g')
   if norm(x-nyttx)/norm(x)<1e-5
       break
   end
   x=nyttx;
 end
 nollst=x;
 
 % Funktionen som underfunktion:
function f=F(x)
   f=[(x(1,:)+3).*(x(2,:).^3-7)+18 ; sin(x(2,:).*exp(x(1,:))-1)];
   
% Jacobianan, "derivatamatrisen", som underfunktion:   
function j=J(x)
   j=[x(2).^3-7 , (x(1)+3)*3.*x(2).^2 ; ...
      exp(x(1)).*x(2).*cos(exp(x(1)).*x(2)-1) , exp(x(1)).*cos(exp(x(1)).*x(2)-1)];

% Differensapproximation av Jacobianan som underfunktion:
function j=Jdiff(F,x)
   n=length(x);
   j=(F(x*ones(1,n)+1e-5*eye(n))-F(x*ones(1,n)-1e-5*eye(n)))/2e-5;