%% Első gyakorlat: Ismerkedés a Matlabbal
%% 1. Matlab parancsablak: Alapműveletek, értékadás, függvényhívás
% Számoljuk ki az alábbi értékeket!
%
% 12 + 25, \quad 23 \cdot 12, \quad \frac{\pi}{2}, \quad \sqrt{3} - 1, \quad e^3
%          2. Számítsuk ki a d = \ln(a)\cos(2b) + \frac{4c}{\sqrt{a}} értéket, ha a=10, b=\pi és c=4.

a=10;
b=pi;
c=4;
d=log(a)*cos(2*b)+4*c/sqrt(a)

%          3. Adjuk értékül az x változónak a \sqrt{2} - 1 értéket, majd számoljuk ki az x^2 + 3x - 1 kifejezés értékét!

format long % Így lehet több tizedesjegyet kiíratni.
x=sqrt(2)-1
vegeredmeny=x^2+3*x-1

%
%% 2. Vektorok és mátrixok
% A Matlabban definiálhatunk vektor és mátrix adatszerkezeteket. Egy sorvektor megadható szögletes zárójelben, szóközzel vagy pedig vesszővel elválasztott elemeivel.

v = [1 2 3]

% Oszlopvektor hasonlóan definiálható, de az elemeket pontosvesszővel választjuk el.

w = [1; 2; 3]

% Megadható továbbá vektorok transzpontáltja is az alábbi parancs segítségével.

w = v'

% A w vektor i-edik koordinátájára a w(i) paranccsal hivatkozhatunk.

w(3)

% Több elemre hivatkozás esetén a : parancsot használhatjuk.

w(1:2)

% Egy adott vektor méretét a length és size parancsokkal kérdezhetjük le.  Teszteljük őket: mi a különbség?

length(w)
size(w)
size(w,1)

% Nagyobb méretű vektort definiálhatunk a linspace parancs segítségével is. A linspace(a, b, n) parancs az [a,b] intervallumot felosztja n darab ponttal n-1 darab egyenlő részre.

linspace(0, 10, 10)

% Mátrixot szögletes zárójelek segítségével definiálhatunk, a sorokat pedig pontosvesszővel elválasztva adhatjuk meg.

A = [1 2 3; 4 5 6; 7 8 9]

% Egy mátrix elemére az adott sor és oszlop megadásával hivatkozhatunk.

A(2, 2)

% Mátrixok sorára vagy oszlopára a : jellel hivatkozhatunk (ekkor az egész sort vagy oszlopot kapjuk vissza).

A(:,2)

% Csupa nullákból álló m \times n-es mátrixot a zeros(m, n) paranccsal adhatunk meg.

A = zeros(2, 4)

% Az n \times n-es egységmátrixot pedig a eye(n) függvény adja meg. Teszteljük, mit ad meg a zeros(n) és a ones(n) parancs!

eye(4)

% A megfelelő méretű mátrixok összege, különbsége és szorzata a +, -, * operátorok segítségével adható meg. Négyzetes mátrixok determinánsát a det(A), inverzét az inv(A) függvény segítségével számolhatjuk ki.

A = [1 2 3; 4 5 6; 7 8 9]

det(A)
inv(A)

B = [1 2 3; 4 4 6; 7 8 9]

det(B)
inv(B)

% A diag(A) függvény egy n \times n-es mátrix főátlójában lévő elemeket adja vissza.

diag(A)

% Ha a diag függvény bemenő paramétere egy vektor, akkor ezekből az elemekből készíthetünk egy diagonál mátrixot. Ha a diag függvénynek egy második bemenő paramétert is megadunk, akkor a diagonálon kívüli (alatta, fölötte) elhelyezkedő elemekre is hivatkozhatunk.

diag(A, 1)

%
%         4. Az előbbiek segítségével álkítsuk elő azt az 5 \times 5-ös mátrixot, amelynek a főátlója alatti diagonálisban kettesek, a főátló feletti diagonálisban viszont egyesek szerepelnek, a többi eleme pedig nulla!

v1=ones(4,1);
v2=2*ones(4,1);
D=diag(v1,1)+diag(v2,-1)

%
%% 3. Grafika
% A Matlabban készíthetünk grafikonokat, többdimenziós felületeket is. A plot(x, y) utasítás segítségével felrajzolhatjuk azt a görbét, melyet az x(i), y(i) pontok egyenes szakaszokkal való összekötésével kapunk (x és y azonos hosszúságú vektorok).

x = linspace(0, 100, 200);
y = exp(x).*(cos(x) + sin(x));
plot(x,y)

% A plot utasításnak számos beállítási lehetősége van, például: görbe színe és vastagsága, ábra címe, tengelyek beállításai stb.
%
%         5. Ábrázoljuk a [-1,1] intervallumon az f(x) = x^3 - 1 függvényt. Állítsunk be az ábrának címet, továbbá a görbe legyen szaggatott, piros színű.

x=linspace(-1,1,40);
y=x.^3-1;
plot(x,y,'-- r')

%
%         6. Egészítsük ki az előző ábrát a sin(x) függvénnyel! A görbe színe legyen az előzőtől eltérő, továbbá szerepeljen jelmagyarázat is az ábránkon!

x3=linspace(-1,1,40);
y3=x3.^3-1;

x2=linspace(-1,1,40);
y2=sin(x2);

plot(x3,y3,'r',x2,y2,'b')
legend('piros','kek')

%
%% 4. M-fájlok
% A Matlabban létrehozhatunk m-fájlokat, melyek utasításokat tartalmaznak. Létrehozhatunk továbbá Matlab-fügvényt, melynek lehetnek bemenő adatai és kimenő adatai.
% function D = determinant(A)
% D = det(A);
% end
%
%% 5. Ciklusok
% A for / end ciklus segítségével utasításokat ismételhetünk meg. Általános alakja:
% for i = ciklusvaltozo_kezdoertek : ciklusvaltozo_novekedese : ciklusvaltozo_utolso_ertek
% utasitasok;
% end
%             7.  Határozzuk meg 1-től 100-ig az egész számok összegét a for ciklus segítségével!

sum=0;
for i=1:100
    sum=sum+i;
end
sum

%            8.  A for ciklus segítségével készítsünk egy olyan 5 \times 5-ös mátrixot, melynek diagonáljában 1 áll, a diagonál fölött 5, egyébként pedig 0 elemek helyezkednek el a mátrixban.

A=zeros(5);
for i=1:5
    A(i,i)=1;
end
for i=1:4
    A(i,i+1)=5;
end
A

%             9. Hozzunk létre egy olyan függvényt, melynek n a bemenő paramétere, a kimenő paramétere pedig az n-edik Fibonacci szám!
% A kódot lásd a fájl végén!

fibo(10)

%
% A while / end ciklus segítségével utasításokat ismételhetünk meg, amíg egy adott feltétel teljesül. Általános alakja:
% while feletel
% utasitasok;
% end
%             10. Készítsük el a 8. feladatban szereplő mátrixot a while utasítás segítségével!

A=eye(5);
i=1;
while i<5
    A(i,i+1)=5;
    i=i+1;
end
A

%
%% 6. Elágazások
% Az if / end utasítás segítségével elágazást készíthetünk. Általános alakja:
% if feltetel
%     utasitas_ha_feltetel_igaz;
% else
%     utasitas_ha_feltetel_hamis;
% end
%             11. Készítsük el a 8. feladatban szereplő mátrixot az if utasítás segítségével!

A=zeros(5);

for i=1:5
    for j=1:5
        if i==j
            A(i,j)=1;
        end
        if j==i+1
            A(i,j)=5;
        end
    end
end
A

%
%% 7. Matlab Help
% A Matlab online dokumentációja elérhető a Help menüből. A parancsablakba való begépeléssel információt kapunk az adott parancsról/hozzá kapcsolódó utasításokról. Adott parancsba kattintva majd az F1 gomb megnyomásával is előhozhatjuk.

help sqrt
sqrt(102)
help inverse

%
% A 9. feladat megoldása:

function out=fibo(n)
f=zeros(n,1);
f(1)=1;
f(2)=1;
for i=3:n
    f(i)=f(i-1)+f(i-2);
end
out=f;
end