%% Nemlineáris egyenletek megoldása
%  1. Vizsgáljuk meg az alábbi iterációkat konvergenciarend szempontjából (mindegyik 2-höz tart)! Milyen kezdőérték esetén tart a harmadik iteráció 2-höz?
% x_{k+1}=\frac{3x_k^2-4x_k-2}{x_k-1}\\
% x_{k+1}=\sqrt{3x_k/2+1}\\
% x_{k+1}=x_k-2+\frac{x_k}{x_k-1}

x=3; y=3; z=3; 
k=0;
fprintf('lépés          x                        y                         z\n')
fprintf('    0 %25.13f         %16.13f          %16.13f\n',x,y,z)
hibax=zeros(1,20); hibay=hibax; hibaz=hibax;
for k=1:20
x=(3*x^2-4*x-2)/(x-1); hibax(k)=abs(x-2);
y=sqrt(3*y/2+1); hibay(k)=abs(y-2);
z=z-2+z/(z-1); hibaz(k)=abs(z-2);
fprintf('  %3d%26.13f         %16.13f          %16.13f\n',k,x,y,z)
end

plot(log(hibay(1:19)),log(hibay(2:20)),'b-',log(hibaz(1:19)),log(hibaz(2:20)),'r-')
axis equal

%
%
% 2. Határozzuk meg a Newton módszerrel a p(x)=x^5-x^4-4x^3+4x^2+4x-4 polinom legnagyobb zérushelyét!

p=@(x)x.^5-x.^4-4*x.^3+4*x.^2+4*x-4;
pder=@(x)5*x.^4-4*x.^3-12*x.^2+8*x+4;
fplot(p,[0,2]);

%

zerushely=fzero(p,2)

%

x=2, for i=1:20 x=x-p(x)/pder(x), end

%
% 3. Oldjuk meg az
% x+y+z=0\\
% x^2+y^2+z^2=2\\
% x(y+z)=-1
% nemlineáris egyenletrendszert a Newton-módszer segítségével! Keressünk megoldást az (3/4,1/2,-1/2) pont közelében!

f=@(x)[x(1)+x(2)+x(3);x(1)^2+x(2)^2+x(3)^2-2;x(1)*(x(2)+x(3))+1]
J=@(x)[1,1,1;2*x(1),2*x(2),2*x(3);x(2),x(1),x(1)]

%

x=[3/4;1/2;-1/2], for i=1:10 x=x-J(x)\f(x), end

%

fsolve(f,[3/4;1/2;-1/2])

%
% 4. Adjuk meg az
% x^2+y^2=1\\
% x \sin(y)=1/3
% nemlineáris egyenletrendszer legalább egy megoldását!

f1=@(x,y)x.^2+y.^2-1
ezplot(f1), axis equal
hold on
f2=@(x,y)x.*sin(y)-1/3
ezplot(f2), axis equal
hold off

%

f=@(x)[f1(x(1),x(2));f2(x(1),x(2))]
J=@(x)[2*x(1),2*x(2);1,cos(x(2))]
x=[1;1], for i=1:20 x=x-J(x)\f(x), end

%

    fsolve(f,[0.4;0.9])

%
% 5. Minimalizáljuk az f(x,y)=(x-y)^2+(x^2-1)^2 függvényt!

g=@(x,y)((x-y).^2+(x.^2-1).^2)
fmesh(g);
f=@(x)g(x(1),x(2))

%

H=@(x)[-2+12*x(1).^2,-2;-2,2];
grad=@(x)[2*(x(1)-x(2))+2*(x(1).^2-1)*2.*x(1);-2*(x(1)-x(2))];

x=[2;2], 
for i=1:10 x=x-H(x)\grad(x), end

%

fminunc(f,[2;2])

%
%% Polinominterpoláció
%%  1. Adjuk meg a (-1,6), (0,3) és (1,2) pontokat interpoláló polinomot!

x=[-1,0,1];
y=[6,3,2];
z=polyfit(x,y,2)
xx=linspace(min(x),max(x),500);
yy=polyval(z,xx);
plot(x,y,'ro',xx,yy,'b-')

%
% 2. Interpoláljuk az f függvényt különböző alappontokon, és vizsgáljuk meg, hogy mi történik az alappontok számának növelésekor!

f=@(x)sin(x)
for n=3:10
x=linspace(0,pi,n);
y=f(x);
z=polyfit(x,y,n-1);
xx=linspace(min(x),max(x),500);
yy=polyval(z,xx);
figure
plot(x,y,'ro',xx,yy,'b-',xx,f(xx),'k-')
end