% MATLAB Tutorial
% ===============
% Kurze Einführung in Funktionen relevant zu unserer Vorlesung
% Erstellt von Sebastian Scherer sebastian.scherer@uni-tuebingen.de
% CC BY-SA 3.0 ( http://creativecommons.org/licenses/by-sa/3.0/ )

% Allgemeines:
% ============
% MATLAB ist eine
% 1) einfache Skriptsprache zur schnellen Manipulation von Matrizen,
% 2) vollständige IDE,
% 3) Sammlung etlicher wichtige mathematischer Bibliotheken + Toolboxen.
% 
% Kommerzielles (teures!) Produkt, für Studenten und Mitarbeiter kostenlos.
% 
% Download im CampusSoftware-Portal des ZDV: 
% https://services.zdv.uni-tuebingen.de/CampusSoftware/
%
% Interessante freie Alternativen:
% 
% - GNU Octave:
%   * Weitgehend kompatibel zu MATLAB ohne Toolboxen
%   * Keine symbolischen Berechnungen
%
% - (wx)Maxima:
%   * Freies Computer Algebra System
%
% - Python:
%   * NumPy/SciPy für numerische Berechnungen
%     http://wiki.scipy.org/NumPy_for_Matlab_Users
%   * matplotlib für plots
%     http://matplotlib.org/
%   * SymPy für symbolische Berechnungen
%     http://www.sympy.org/en/index.html

close all; % evtl. geöffnete plot-Fenster schließen
clear all; % Daten im Workspace löschen

% Einfaches Rechnen:
% ==================
% Taschenrecher-Ersatz:
% Setzt man am Ende einer Zeile kein Semikolon, wird das Ergebnis 
% direkt ausgegeben:

5+3 %#ok<*NOPTS> % Warne nicht vor fehlenden Semikolons

3^2 

sqrt(9)

cos(pi)

1/inf

% Variablen und Funktionen:
% =========================
% Variablen werden bei der ersten Zuweisung deklariert:

a = 5

b = 2 + a

% Das Ergebnis der letzten Operation kann aus der Variablen 'ans'
% ausgelesen werden (aber bitte nicht in Skripten verwenden):

ans

% Funktionen können "anonym" deklariert und anschließend verwendet werden:

parabel = @(x) 5*x.^2 + 2*x + 1
parabel(5)

% Für komplexere Funktionen empfiehlt es sich allerdings, diese in eine
% extra Datei auszulagern (s. beispielFunktion.m).
% Matlab durchsucht das aktuelle Verzeichnis + seinen Suchpfad
% (konfigurierbar).

beispielFunktion(5)

% Lineare Algebra:
% ================
% Matrizen oder Vektoren werden folgendermaßen eingegeben: Ein Semikolon
% markiert das Ende einer Zeile, zwischen Elementen einer Zeile kann man 
% ein Komma setzen (optional).

M = [1 2; 3 4]
v = [1; 2]

% Es gibt diverse Abkürzungen zur Erzeugung einfacher Matrizen:

I4 = eye(4)   % Identität
Z = zeros(4,4)
a = ones(4,1)
D = diag([1, 2, 3])

% Einer der hilfreichsten Operatoren ist der Doppelpunkt-Operator:

vi = 1:10
vi = 1:0.1:10

% Passende Dimensionen vorausgesetzt, können Vektoren und Matrizen einfach
% konkateniert werden:

B  = [I4 Z a]
B2 = [I4; Z]

% Matrizen und Vektoren werden mit "*" multipliziert:

M*v
M*M
5*M

% Elementweise Operationen werden durch einen vorangestellten Punkt
% ausgedrückt:
M.*M
M.^5

% "'" transponiert Matrizen:

M'
v'

% Zugriff auf einzelne Einträge geht über runde Klammern.
% Achtung: MATLAB verwendet 1-basierte Zählweise

M(1,2)
v(1)
v(end)

% Teilmatrizen bzw. Zeilen und Spalten werden über ":" selektiert:

M(:,1)
M(1,1:2)
v(2:end)

% Übrigens: Die meisten eingebauten Funktionen akzeptieren sowohl Skalare
% als auch Matrizen als Eingabe und werten Matrizen elementweise aus:

sin(M)

% Außerdem praktisch: Summieren über eine Dimension:

sum(M,1)
sum(M,2)

% Beispiel Rotation in 2D um 180° als homogene Transformationsmatrix:

rot = @(alpha) [cos(alpha), -sin(alpha), 0; sin(alpha), cos(alpha), 0; 0, 0, 1]
rot(180)
rot(pi)

% Plotten von Daten:
% ==================
% Gewünschten Wertebereich für x-Achse auswählen:

x = 0:0.01:2*pi;

% Zugheörige y-Werte berechnen und plotten:

plot(x, sin(x));

% Mehrere Kurven:

plot(x, sin(x), x, cos(x));
legend('sin', 'cos')

% 3D:

x = 0:0.01:10*pi;
plot3(sin(x),cos(x),x)

% Für mehr Details siehe Hilfe!

% Hilfreiche Funktionen beim Umgang mit Wahrscheinlichkeiten
% ==========================================================

% Zufallsvariablen erzeugen:
randn(10, 1) % normalverteilt N(0, 1)
rand(10, 1) % gleichverteilt zwischen 0 und 1

r2 = mvnrnd([0; 0], eye(2), 20) % n-D normalverteilt mit geg. mu, Sigma 

% Mean und Sample Covariance Matrix:
mu = mean(r2)
S = cov(r2)

x = -5:0.01:5;

% Wahrscheinlichkeitsdichte und kumulative Verteilungsfunktion:
plot(x, normpdf(x, 0, 1), x, normcdf(x, 0, 1));

% Wahrscheinlichkeitsdichte im mehrdimensionalen Fall:
mvnpdf(r2(1,:), mu, S)


% Symbolisches Rechnen
% ====================
% MATLAB enthält ein komplettes Computeralgebrasystem: Das frühere MuPAD.

% Symbolische Variablen werden mit dem Befehl syms deklariert.
% Falls sie nicht weiter spezifiziert werden, geht MATLAB von komplexen
% Zahlen aus. Wir rechnen meist mit reellen Zahlen.

syms x y z real

x + y

% Plotten von Symbolischen Funktionen:
% ====================================

syms x y z real
parabel(x)
ezplot(parabel, [-1,1])

% Etwas komplexer:
l = (x^2 + y^2)^2 - 20*(x^2 - y^2)
ezplot( l == 0 )

% Vereinfachen von Termen:
% ========================

term = sin(x)*cos(y) + sin(y)*cos(x)
terms = simplify(term)

% Manchmal gibt es unterschiedliche Möglichkeiten, einen Term zu
% "vereinfachen"

simple(10*(x^2 + y*(20+z)))

% Ableiten und integrieren:
% =========================

% Ableitung nach x:

d = diff(parabel(x), x)

% Unbestimmtes Integral: ("Stammfunktion")

s = int(parabel(x), x)

% Schönere Ausgabe:
% =================

pretty(rot(x))
latex(rot(x))

% Symbolische Berechnungen mit Matrizen:
% ======================================

syms px py pz x real
p = [px; py; pz]
R = rot(x)
R*p
diff(R*p, x)

% Jacobi-Matrix: 
d = sqrt(p'*p)
J = jacobian(d, p)

% Sonstiges:
% ==========

solve(parabel(x) == 1, x)

limit(1/x, x, 0)
limit(1/x, x, 0, 'right')
limit(1/x, x, 0, 'left')

limit(1/x, x, Inf, 'left')
