%% CompMath-Vorlesung 21.10.2022
% Matrizen: Operationen, Loesen von Gleichungssystemen, spezielle Funktionen

close all; clc; clear; 

%% Elementweise Operationen  +, -, .*, ./, .\, .^ 
 disp('elementweise Operationen')
 x = 1:2:9;   % 1 x 5  Matrix  (Zeilenvektor)
 z = x+2;     % 1 x 5  Matrix  (Zeilenvektor)
 y = x.';     % 5 x 1  Matrix  (Spaltenvektor)
 
 v = x + z;   % 1 x 5  Matrix
 w = x.*z;    % 1 x 5  Matrix
 % s = x-y      % Fehler, da Dimensionen ungleich
 s = x.'-y;   % 5 x 1 Matrix
 whos
 %% Analog elementweise mit Matrizen
 A = [ 2 0 -1; -1 1  4 ];  % 2x3 Matrix
 B = [ 3 1  0;  1 0 -2 ];  % 2x3 Matrix
 
 C = A+B;                  % 2x3 Matrix
 D = A.*B;                 % 2x3 Matrix
 whos A B C D
 
%% Matrixoperationen (+,-), *, /, \, ^
% Kompatibilitaetsbedingung
disp('Matrixoperationen')

%E = A*B;                   % Fehler, Dimensionen inkompatibel

% Transponieren von B
B = B.';
whos A B
E = A*B                     % (Matrix 2x3) * (Matrix 3x2) ==> 2x2 Matrix
whos E

% Sonderfall potenzieren:
% A^2     ==>  Fehler, da A keine quadratische Matrix ist (#Zeilen == #Spalten) 
E^2       %    E ist quadratische Matrix  ==>  E*E  moeglich

% desgleichen mit Vektoren
v1 = x   .* y.';            % Elementweise 1x5
v2 = x.' .* y ;             % Elementweise 5x1
v3 = x*y;                   % Matrixweise  (1x5)*(5x1) ==> 1x1 Matrix
v4 = y*x;                   % Matrixweise  (5x1)*(1x5) ==> 5x5 Matrix

%% Loese lineares Gleichungssystem
%     3x - 2y -z = 0
%           y +z = 2
%     -x  +3y    = 2  

disp('Loesen eines (quadratischen, linearen) Gleichungssytems')

A = [3 -2 -1; 0 1 1; -1 3 0];
f = [0; 2; 2];
x = A\f;        %  Loest  A * x = f   linksseitig
disp(x)
% Probe;
fp = A*x;
% Residuum
res = f-A*x;
nr = norm(res);
disp(['Norm des Residuums: ',num2str(nr)] )
%% Was passiert bei x/(1+x)?  "/"-Operator
x = 1:10;             % re-definition of x
xq =  x/(1+x)         % rechtsseitiges Loesen eines GlS

whos x xq             %  skalar statt gewuenschter Vektor

%% spezielle Funktionen
disp('Spezielle Funktionen fuer Matrizen')
size(A)               % Anzahl der Elemente pro Dimension
numel(A)              % Gesamtanzahl der Elemente
% letzte Zeile 
A(end,:)

% zeros, ones, rand, eye, diag
ones(5)
C = diag(1:5);
p = diag(C)
%% Hoeherdimensionale Matrizen
%  siehe view_jpg.m

%% Meshgrid und Visualisierung einer Funktion z(x,y)
%          (x,y)  aus [1, 2]x[0.5, 2.5]
x = linspace(1,2,31);           %  x aus [1,2]
y = linspace(0.5,2.5,15);       %  y aus [0.5,2.5]
[xx,yy] = meshgrid(x,y);        %  Gitternetz erzeugen
zz = sin(3*pi*xx).*exp(2-yy);   %  zz(xx,yy) Gitterkoordinaten verwenden !!
surf(xx,yy,zz)                  %  Visualisiere die durch (xx,yy,zz) beschriebene Flaeche
 
%%
% publish('v_3_a.m')

