53
Einleitung Mathematische Operationen Programmieren Grafik NumerischeStr¨omungssimulation Markus Uhlmann Institut f¨ ur Hydromechanik SS 2010 Bemerkung : Verweise auf zus¨ atzliche Information zum Download erscheinen in dieser Farbe V13 1 / 54

Numerische Str omungssimulation · Einleitung Mathematische Operationen Programmieren Gra k Fragen, die in dieser Vorlesung diskutiert werden MATLAB als Programmiersprache I Kontrollstrukturen

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

EinleitungMathematische Operationen

ProgrammierenGrafik

Numerische Stromungssimulation

Markus Uhlmann

Institut fur Hydromechanik

SS 2010

Bemerkung: Verweise auf zusatzliche Information zum Download erscheinen in dieser Farbe

V13 1 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

2. VORLESUNG

MATLAB – Einfuhrung

V13 2 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Fragen, die in dieser Vorlesung diskutiert werden

Mathematische Operationen

I Wie benutzt man MATLAB als Taschenrechner?

I Wie erstellt und manipuliert man Vektoren?I Matrizen und Mehrdimensionale FelderI Vektoren/Matrix Opeartionen

V13 3 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Fragen, die in dieser Vorlesung diskutiert werden

MATLAB als Programmiersprache

I KontrollstrukturenI FunktionenI Datenstrukturen

Grafik

I Welche Funktionen stehen zur grafischen Darstellung zurVerfugung?

V13 4 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

MotivationProgrammstart

Wozu MATLAB?

Werkzeug in Wissenschaft und Technik

I Numerische Mathematik

I Datenanalyse

I Grafische Darstellung

I Datenerfassung

I . . .

V13 5 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

MotivationProgrammstart

Wozu MATLAB? (2)

Verringerung des Programmieraufwandes

I Vielzahl von Funktionen vordefiniert

I Effiziente und prazise numerische Algorithmen

I Benutzerprogramme sind kompakt

I Weite Verbreitung

V13 6 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

MotivationProgrammstart

Wozu nicht MATLAB?

MATLAB ist eine Interpretersprache

I wenn es auf extreme Effizienz ankommt:Kompilersprache bevorzugt (C, C++, FORTRAN,. . .)

V13 7 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

MotivationProgrammstart

Geschichte

I entworfen in den 1970ern von C. Moler

I ursprunglich als Werkzeug in der Lehre (lineare Algebra)

I MATLAB = MATrix LABoratory

I seitdem mehrfach umgeschrieben und standig erweitert

V13 8 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

MotivationProgrammstart

Umfang des Programmes

I integrierte Entwicklungsumgebung

I Bibliothek mathematischer Funktionenerweiterbar durch Dutzende von “Toolboxes”

I Programmiersprache

I Grafik

I Schnittstellen zu externen Programmen, Geraten

V13 9 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

MotivationProgrammstart

Open Source Alternative

GNU OCTAVE

I akzeptiert weitgehend den Syntax von MATLAB

I (Homepage)

V13 10 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

MotivationProgrammstart

Entwicklungsumgebung

I Oberflache: Kommandofenster, Variablenbersicht, . . .

I Editor/Debugger starten durch Klicken auf Dateiname

V13 11 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

MotivationProgrammstart

Erste Schritte

I Interaktion meist uber Kommandozeile

I Eingabeaufforderung mit “>>” dargestellt

I HilfeI uber Kommandozeile: “>> help topic”

z.B “>> help general”

I uber Menu “Help”

I Demos: “>> help demo”

I weitere Ressourcen zu MATLAB: siehe Anhang

V13 12 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

MATLAB als Taschenrechner

I Eintippen in Kommandozeile (gefolgt durch “Enter”):>> 2+3/4*5ans =

5.7500

I Hinzufugen eines Semikolons: keine Ausgabe>> 2+3/4*5;

⇒ Prioritat der Operatoren:

(),^,*/,+-

V13 13 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Variablen

I Variablen werden in der Regel nicht deklariert

I numerische Daten: intern als “double precision” behandelt

I Variablennamen: 1 Buchstabe, gefolgt vonBuchstaben/Zahlen/Underscore; max. Lange: 63

I Gross- & Kleinschreibung!

I legal: MeineVariable, gUter Name

I illegal: 1Variable, var-vec, &fach

V13 14 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Zahlenformate

Numerische Typen in MATLAB

Typ Beispiel

Ganzzahl -156reelle Zahl 0.0634

(wissenschaftliche Notation: 6.34e-2)komplexe Zahl -3.78+i*5.47 (i =

√−1)

Inf (Unendlich) Teilen durch 0NaN (”Not a Number”) 0/0 oder Inf - Inf

I Ausgabeformat wird durch format kontrolliert

I Bsp.:

>> x=3.94959399393>> x =

3.9496

>> format long;>> x=3.94959399393>> x =

3.949593993930000V13 15 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Konstanten

Vordefiniert in MATLAB

I pi, Kreiskonstante π

I eps, Prazision der Gleitkommaarithmetik

I i,j, imaginare Einheit√−1

I Vorsicht:alle Konstanten konnen vom Benutzer berschrieben werden

V13 16 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Eingebaute Funktionen

I Trigonometrie: sin, cos, tan, ...

I Exponentiale: exp, log, sqrt, ...

I komplexe Zahlen: abs, imag, real, ...

I Rundung: round, mod, sign, ...

I Ubersicht uber die grundlegenden Funktionen:>> help elfun oder specfun oder elmat

V13 17 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Arbeiten mit aufgezeichneten Kommandos/Programmen

Verschiedene Optionen

1. Aufzeichnen der eingegebenen Kommandos einer Session:diary

2. Speichern des momentanen Zustandes (gesamter Speicher):save

3. Editieren/Aufrufen von eigenen Skripten:M-Files

V13 18 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Aufzeichnen mit diary

I diary(’dateiname’) startet Aufzeichnung aller Kommandosund deren Resultate in Datei

I Datei kann mit Texteditor bearbeitet werden

I diary on und diary off schalten Aufzeichnung ein/aus

V13 19 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Sichern des Arbeitsspeichers mit save

I save(’dateiname’) sichert die Werte aller momentanenVariablen in einer binaren Datei dateiname.mat

I Datei kann durch load(’dateiname’) geladen werden

I Anzeige der momentan aktiven Variablen & -dimensionen:>> whos

I mehr Information: >> help save und >> help load

V13 20 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Erzeugen von MATLAB-Scripts in Textfiles

M-Files

I Editieren in eingebautem Editor (oder beliebigem Texteditor)

I Kommentarzeilen starten mit %

I Speichern als: dateiname.m

I Laden in MATLAB durch Dateinamen (ohne “.m”):>> dateiname

V13 21 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Felder in MATLAB

Matrizen als grundlegende Elemente

I MATLAB arbeitet in der Regel mit Matrizen(2-dimensionalen Feldern)

I ein Skalar ist eine Matrix mit einem einzigen Element (1x1)

I ein Zeilenvektor ist eine Matrix mit einer Zeile (1xN)

I ein Spaltenvektor ist eine Matrix mit einer Spalte (Nx1)

I Mherdimensionale Felder sind moglich

Dimension eines Ausdruckes: size(ausdruck)

V13 22 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Vektoren

Zeilenvektoren

I Liste von Ausdrucken, durch Komma oder Leerzeichengetrennt, in eckigen Klammern.

Beispiel eines Zeilenvektors mit 3 Elementen:

>> vec = [1 3, sqrt(5)]

vec =

1.0000 3.0000 2.2361

>> size(vec)

ans =

1 3

>> length(vec)

ans =

3

V13 23 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Operationen mit Vektoren

Arithmetik

I Addition/Subtraktion von Vektoren gleicher Lange: +, -

I Multiplikation von Skalar und Vektor: *

Beispiel:

>> avec = [1 3 5]; bvec = [1 1 4];

avec-2*bvec =

-1 1 -3

I Operationen, die elementweise ausgefuhrt werden:

.* ./ .^

(Produkt, Division, Potenz)

Beispiel:

>> avec = [1 3 5]; bvec = [1 1 4];

avec.*bvec =

1 3 20V13 24 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Spaltenvektoren

I wie Zeilenvektoren, aber Elemente durch Semikolon oderZeilenende getrennt.

Beispiel: Erzeugung eines Spaltenvektors mit 3 Elementen

>> svec = [1; 3; sqrt(5)]

svec =

1.0000

3.0000

2.2361

>> size(svec)

ans =

3 1

>> length(svec)

ans =

3

V13 25 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Transponieren von Vektoren

Der Hochkomma-Operator

I Umwandeln von Zeilen- in Spaltenvektoren (und umgekehrt):>>vektor’

Beispiel:

>> zvec= [1 3 5], svec = [1; 3; sqrt(5)]

zvec =

1 3 5

svec =

1.0000

3.0000

2.2361

>> zvec+2*svec’

ans =

3.0000 9.0000 9.4721

V13 26 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Arbeiten mit Vektoren

Reduktionsoperationen

I Summieren der Elemente eines Vektors: sum

Beispiel:>> vec = exp((1:20)/20); % erzeugt vektor der laenge 20

>> sum(vec) % summiert die elemente

ans = 35.2319

I Produkt der Elemente eines Vektors: prod

I Maximal-/Minimalwert der Elemente eines Vektors:max, min

V13 27 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Auffinden bestimmter Elemente

Die Funktion find

I ermittelt Indizes von Elementen, welche eine vorgegebeneBedingung erfullen: index vec = find(bedingung)

I Beispiel: Funktionswerte mit mindestens 90% desMaximalwertes bestimmen.x=(0:100)/100;

y=sin(2*pi*x).^2.*exp(3*x);

index=find(y>=0.9*max(y));

plot(x,y,’k-o’); hold on;

plot(x(index),y(index),’ro’);

plot([0 1],[1 1]*.9*max(y),’k--’);

I Nutzung der Funktion find fuhrt zu extrem effizientem Code

V13 28 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Weitere nutzliche Vektoroperationen

I Sortieren der Elemente: sort

I Unterdruckung von Mehrfacheintragen: unique

I Abfrage ob leeres Feld: isempty(Erzeugung eines leeren Feldes mit: [] )

I . . .

V13 29 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Matrizen

Definition

I Matrix = rechteckige Anordnung von Zahlen (Zeilen, Spalten)

I Bedeutung in linearer Algebra

Matrizen in MATLAB

I Matrix = zweidimensionales Feld

I Dimension: (M ×N), M Zeilen, N Spalten

I viele mathematische Operationen zur Auswahl

V13 30 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Generieren von Matrizen

Direkte Eingabe

I analog zu Vektoren: Elemente in eckigen Klammern,Zeilenende durch Semikolon markiert

I Beispiel: (2× 3) Matrix

>> Amat=[1, 2, 5; 3, 1, 4] % oder auch: Amat=[1 2 5; 3 1 4]

>> Amat =

1 2 5

3 1 4

>> size(Amat)

>> ans =

2 3

V13 31 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Generieren von Matrizen (2)

MATLAB Funktionen zur Initialisierung

I Matrizen mit konstanten Eintragen: ones, zeros

I zufallige Eintrage: rand

I Identitatsmatrix: eye

I Matrix mit einer besetzten Diagonalen: diag

I Beispiele:

konstante (3× 2) Matrix

>> Bmat=ones(3,2)*5

>> Bmat =

5 5

5 5

5 5

diagonale (3× 3) Matrix

>> Cmat=diag([1 2 3])

>> Cmat =

1 0 0

0 2 0

0 0 3V13 32 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Generieren von Matrizen (3)

MATLAB Funktionen zur Initialisierung

I Matrix erzeugung durch Verkettung/Aneinanderreihung von(Teil-)Matrizen Dimension beachten

konstante (3× 2) Matrix

>> Amat =

5 5

5 5

5 5

diagonale (3× 3) Matrix

>> Cmat =

1 0 0

0 2 0

0 0 3

>> Cmat =[A B]

>> Cmat =

5 5 1 0 0

5 5 0 2 0

5 5 0 0 3

@@@R

���

V13 33 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Der Doppelpunkt-Operator

I ”a:b:c” ist Abkurzung fur:Vektor mit Elementen von a bis c, Schrittweite b

Beispiel:>> 1:2:10

ans = 1 3 5 7 9

>> 5:-1:3

ans = 5 4 3

I Initialisieren eines Vektors/ Auswahlen von Teilbereichen

Beispiel:>> vec=(1:2:10)

ans = 1 3 5 7 9

>> vec(2:4)

ans = 3 5 7

I weitere Information: ”>> help colon”V13 34 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Indizierung von Matrizen

Ansprechen einzelner Elemente

I Indexpaar, durch Komma getrennt: >> Amat(i,j)

Mehrere Elemente

I Indexbereich mit Doppelpunkt: >> Amat(3:6,j)

I gesamter Bereich mit Doppelpunkt >> Amat(:,j)

I Schlusselwort end fur obere Grenze: >> Amat(i,3:end)

I Indexvektoren: >> Amat([2 5],j)

I Ausprobieren! (z.B. “getting started” zum Thema Matrizen)

V13 35 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

GrundlagenFelder

Losung linearer Gleichungssysteme

Problemstellung

I technische Probleme → oft große lineare Gleichungssysteme

I A~x = ~b Matrix A, Vektoren ~x, ~b

I gegeben: A, ~b; gesucht: ~x → Losung: ~x = A−1~b

Losung mit MATLAB

I “backslash” Operator: >> x = A\bI MATLAB wahlt je nach Fall die effizienteste Methode

I Hilfe hierzu: >> help slash(Link zur Online Information zu linearer Algebra in MATLAB)

V13 36 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

KontrollstrukturenFunktionenDatenstrukturen

Kontrollstrukturen

Bedingungen

I Mehrstufige Auswahl: if ...elseif...else...end

I Vergleichsoperatoren: <, <=, >, >=, ==, ~=

I Logische Verknupfungen: &, |, ~, xor

I Hilfe zu den Vergleichsoperatoren: >> help relop

I Beispiel:if max(vec)<0 % ’vec’ sei ein gegebener vektor

disp(’alle Elemente negativ’)

elseif max(vec)==0

disp(’alle Elemente nicht-positiv’)

elseif isempty(vec)

disp(’leeres Feld’)

else

disp(’positives Maximum’)

endV13 37 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

KontrollstrukturenFunktionenDatenstrukturen

Schleifen

Zahlergesteuert

I for zaehler=ausdruck...end

I Beispiel: vec=[1 5 13];

for index=1:length(vec)

disp(vec(index))

end

Bedingungsgesteuert

I while ausdruck...end

I Beispiel:

a=6;

while a>0

a=a-rand;

end

V13 38 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

KontrollstrukturenFunktionenDatenstrukturen

Funktionen

Programmtext in sog. “M-Files”

I Programm ohne jegliche Parameter: Script

I Programmteil mit ubergabe von Parametern: Funktion

I Struktur einer Funktion: Datei funktionsname.m

function [output params]= funktionsname(input params)% Kommentare, Hilfstext...Kommandos...end

V13 39 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

KontrollstrukturenFunktionenDatenstrukturen

Funktionen (2)

Beispiel

I Funktion zur Bestimmung der Standardabweichung

I Datei standardabweichung.m

function [sigma]= standardabweichung(vec)% Standardabweichung eines Vektorsmittelwert=sum(vec)/length(vec);sigma= sqrt(sum((vec-mittelwert).^2)/length(vec));end

I Aufruf:>> myvec=[4 2.5 6.1 -8 -2];>> sigma=standardabweichung(myvec)>> sigma = 5.0221

V13 40 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

KontrollstrukturenFunktionenDatenstrukturen

Typische MATLAB Programmstruktur

I MATLAB-Script fungiert als “Hauptprogramm”

I Aufruf beliebiger Anzahl von Funktionen(siehe Beispiel “Pendel” weiter unten)

I Achtung: alle M-Files des Projekts mussen auffindbar sein(siehe: >> help path)

V13 41 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

KontrollstrukturenFunktionenDatenstrukturen

Benutzerdefinierte Datenstrukturen

Verschiedene Datentypen/-langen in einer Struktur

I Erzeugung (ohne Deklaration) durch Zuweisung an Elemente:

>> NeueStruktur.name=’Hans Meier’;>> NeueStruktur.alter=27;>> NeueStruktur.ruhepuls=42>> NeueStruktur =

name: ’Hans Meier’alter: 27ruhepuls: 42

I Details hierzu: >> help struct

V13 42 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Einfache Diagramme

Liniendiagramme

I plot(x,y) – Liniendiagramm mit Wertepaaren (x, y)

Beispiel:>> x=(0:100)/100;y=sin(2*pi*x);

>> plot(x,y);

erzeugt:

I Linientypen, Farbe, Strichstarke, etc.: ”>> help plot”

V13 43 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Einfache Diagramme

Beschriftung von Diagrammen

I xlabel(’text’) erzeugt Beschriftung der horizontalen Achse

I analog: ylabel, title, legend

Beispiel:>> x=(0:100)/100;y=sin(2*pi*x);

>> plot(x,y);xlabel(’x-Achse’);ylabel(’y-Achse’);

>> title(’Linienplot’);legend(’sin(2*pi*x)’);

erzeugt:

V13 44 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Einfache Diagramme

Mehrfache Liniendiagramme

I mehrere Wertepaare in einem Kommando:plot(x1,y1,x2,y2,...)

I mehrere Kommandos, ”Festhalten” durch hold:plot(x1,y1);hold on;plot(x2,y2);

Beispiel:>> x=(0:100)/100;y1=sin(2*pi*x);y2=cos(2*pi*x);

>> plot(x,y1,x,y2);legend(’sin(2*pi*x)’,’cos(2*pi*x)’);

V13 45 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Einfache Diagramme

Verndern des Achsenbereiches

I axis([x1 x2 y1 y2]) setzt Ober- und UntergrenzenBeispiel: >> axis([0 0.5 0 1]);

V13 46 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Einfache Diagramme

Weitere Eigenschaften von Diagrammen

Benutzen der ”Handles” von Grafikobjekten

I ein ”Handle” ist die Identifikation eines GrafikobjektesBsp.: h=plot(x,y), Handle gespeichert in Variable h

I dient der Referenzierung (ahnlich Zeiger auf Objektdaten)

I Auflisten der Eigenschaften: get(h)

I Verandern von Eigenschaften: set(h,’Eigenschaft’,Wert)

Beispiel: Linienfarbe auf ’rot’, Linientyp auf ’gestrichelt’ setzenset(h,’Color’,’r’,’LineStyle’,’--’)

V13 47 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Einfache Diagramme

Export von Diagrammen

Gangige Grafikformate

I print -d format dateinameerzeugt Grafikdatei namens dateiname im Format format

I typische Formate: Postscript (eps), JPEG (jpeg),TIFF (tiff), PNG (png), . . .

Ausgabe als MATLAB Diagrammobjekt

I hgsave(handle,’dateiname’)erzeugt MATLAB-spezifische Grafikdatei namens dateiname

I Laden der Gafik durch hgload(’dateiname’)

I Vorteil: Diagramm kann weiterbearbeitet werden (3D Grafik!)

V13 48 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

Einfache Diagramme

Beispiele

Zufallsvariablen

I Erzeugung von Daten mit der rand Funktion

I Analyse, grafische Darstellung der Daten

Bewegung eines Doppelpendels

I

I (MATLAB Code)

V13 49 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

AufgabenLiteratur

Zusammenfassung

MATLAB

I Mathematische Operationen→ direkt anwendbar auf Vektoren

I Starken: numerische Mathematik, Datenanalyse, Grafik

I effizientes Programmieren durch machtigen Befehlssatz

I weitreichende Grafikmoglichkeiten

V13 50 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

AufgabenLiteratur

Aufgaben zum Nachdenken/Ausprobieren

I Erklaren Sie die Ausgabe erzeugt durch folgende Anweisungen:

t=0.1

n=1:10

e=n/10-n*t

I Erzeugen Sie einen Vektor mit 10 gleichmassig verteilten Werten im Intervall[0, 1] (einschlielich der Randwerte).

I Plotten Sie die Exponentialfunktion ex an den oben bestimmten Stutzstellen imIntervall [0, 1].

V13 51 / 54

EinleitungMathematische Operationen

ProgrammierenGrafik

AufgabenLiteratur

Aufgaben zum Nachdenken/Ausprobieren

Schreiben Sie eine Funktion, die einen Vektor (mit numerischenDaten) mittels “bubble sort” in aufsteigender Reihenfolge sortiert.Vergleichen Sie die Ausfuhrungszeit Ihrer Funktion mit der Zeit,die die MATLAB Funktion sort benotigt. (Hinweis: Zeitmessungmit Hilfe von tic,toc)

Erzeugen Sie ein Diagramm mit einem Kreis mit Radius r = 1.5.(Hinweis: das Achsenverhaltnis eines Diagramms kann mit demBefehl axis kontrolliert werden.)

V13 52 / 54