# Gyakorlat 2019. 04. 03.
close all
output_precision(10)

disp("Gyakorlat 2019. 04. 03.");

disp("\n\
Nemlinaris egyenlet numerikus megoldasa: f(x) = 0, x = ?")

disp("\n\
f(x) = 0 => f(x) + x = x ~> g(x) = x megoldasa is erdekes.\n\
Az ilyen x ertek g()-nek fizpontja, ennek keresesenek egy modszere a\n\
fixpont iteracio:\n\
x0, g(x0), g(g(x0)), g(g(g(x0))), ...\n\
altalanosan x0 kezdeti becsles eseten xN = g^N(x0) ahol ^N a g fuggveny\n\
N kiertekeleset jelenti.")

disp("\n\
1. Pelda: cos(x) = x megoldasa [0, 1]-en")

x = -6 : 0.01 : 6;
figure (1)
plot(x, [cos(x); x]);
title("y = cos(x) es y = x metszespontja a megoldas");
grid on; # mutatja alapbol a koordinata racsot

disp("\n\
Valasszuk 1-et a kezdeti erteknek:")
1
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
cos(ans)
disp("Tovabbi kiertekelesek mar algoritmikusabban:")
for i = 1:20
  cos(ans)
endfor
disp("\n\
0.739085... stabilizalodik")

disp("\n\
=========================\n\n\
2. Pelda: f(x) = 1/2 x + 1 = x\n\n\
megoldasa: x = 2, ott a derivalt f'(2) = 1/2 => |f'(2)| < 1")

1
for i = 1:20
  1/2 * ans + 1
endfor

disp("\n\
Nezzunk kezdeti erteket a megoldas tuloldalarol:")
3
for i = 1:20
  1/2 * ans + 1
endfor

disp("\n\
Mindket esetben monoton tartanak az iteraltak a megoldashoz")

disp("\n\
=========================\n\n\
3. Pelda: f(x) = -1/2 x + 1 = x\n\n\
megoldasa: x = 2/3, ott a derivalt f'(2/3) = -1/2 => |f'(2/3)| < 1")

0.3
for i = 1:20
  -1/2 * ans + 1
endfor

disp("\n\
Nezzunk kezdeti erteket a megoldas tuloldalarol:")
2
for i = 1:20
  -1/2 * ans + 1
endfor

disp("\n\
Mindket esetben oszcillalva (nagyobb-kisebb mint a cel) tartanak\n\
az iteraltak a megoldashoz")

disp("\n\
=========================\n\n\
4. Pelda: f(x) = 2 x + 1 = x\n\n\
megoldasa: x = -1, ott a derivalt f'(-1) = 2 => |f'(-1)| > 1")

1
for i = 1:20
  2 * ans + 1
endfor

disp("\n\
Nezzunk kezdeti erteket a megoldas tuloldalarol:")
-2
for i = 1:20
  2 * ans + 1
endfor

disp("\n\
Mindket esetben monoton elfele tartanak a megoldastol")

disp("\n\
=========================\n\n\
5. Pelda: f(x) = -2 x + 1 = x\n\n\
megoldasa: x = 1/3, ott a derivalt f'(1/3) = -2 => |f'(1/3)| > 1")

0.1
for i = 1:20
  -2 * ans + 1
endfor

disp("\n\
Nezzunk kezdeti erteket a megoldas tuloldalarol:")
2
for i = 1:20
  -2 * ans + 1
endfor

disp("\n\
Mindket esetben oszcillalva eltartanak az iteraltak")

disp("\n\
=====================================\n\
Altalanosan:\n\
Ha f(x*) = x* es |f'(x*)| < 1, akkor ha\n\
x0 eleg kozel van x*-hoz, akkor az iteraltak konvergalnak, ha \n\
|f'(x*)| > 1 akkor divergalnak (lokalisan).\n\n\
Ha f'(x*) > 0 akkor monoton modon, \n\
ha f'(x*) < 0 akkor oszcillalo modon viselkednek")

disp("\n\
A fixpont iteraciot pokhalo (cobweb) diagramon szemleltethetjuk")

disp("\n\
cobweb.m -et toltsetek le!")

figure (2)
title("1/2 x + 1 pokhalo diagramja")
f = @(x) 1/2 * x + 1
cobweb(f, -1, 4, 1, 5)

figure (3)
title("-1/2 x + 1 pokhalo diagramja")
f = @(x) -1/2 * x + 1
cobweb(f, -1, 4, 1, 5)

figure (4)
title("2 x + 1 pokhalo diagramja")
f = @(x) 2 * x + 1
cobweb(f, -10, 40, 1, 5)

figure (5)
title("-2 x + 1 pokhalo diagramja")
f = @(x) -2 * x + 1
cobweb(f, -20, 20, 1, 5)