1/18 VU Numeriek Programmeren 2.5 Charles Bos Vrije Universiteit Amsterdam 3 april 2013
2/18 Overzicht Vlotte intro in Ox Hands on
3/18 Minimale elementen Minimale elementen Ox-programma: voeg de standaard headers in, #include <oxstd.h> definieer je hoofdprogramma, main(){} en doe iets binnen die haken, main(){print ("Hallo wereld")} Stijl-elementen: Commentaar: Wat, waarom, wanneer, wie Splits initialisatie, berekening, output Zinnige naamgeving variabelen ir, dval, mx
Voorbeeld 1: Klein programma /* np_w0vb1 Purpose : Provide a first example on Ox Date : 29/3/2013 Author : Charles Bos */ # include <oxstd.h> main () { decl ir, ic, dval, mx; // Initialisation ir= 5; ic= 3; dval = 3.0; // Calculate mx= dval * ones (ir, ic ); } // Output print (" The matrix is ", mx ); 4/18
5/18 Gebruik van functies Je uiteindelijke berekeningen worden te groot om allemaal in main() te doen. Gebruik functies Iedere functie doet een taak De taak is duidelijk uit de naam van de functie Definieer duidelijk wat de functie in en uit gaat (commentaar)! Uitkomsten uit functies: Als het een enkelvoudige output is, maak evt gebruik van het return mx; statement Vang in bij de aanroep het resultaat weer op, vergelijk mx= ones (ir, ic ); mx= CreateMatrix (ir, ic, dval );
6/18 Voorbeeld 2: Functie /* CreateMatrix ( const ir, const ic, const dval ) Purpose : Create a matrix of size ir x ic, with value dval Inputs : ir, ic integer, number of rows and columns dval double, value to place in matrix Return value : my matrix of size ir x ic, with value dval in all elements */ CreateMatrix ( const ir, const ic, const dval ) { decl my; } my= dval * ones (ir, ic ); return my; main () {... // Calculate mx= CreateMatrix (ir, ic, dval );... }
7/18 Adressen Het lastigste punt van Ox: Adressen Wat te doen als info heen en weer gegeven moet worden? Gebruik een adres! Stuur het adres van bijv mx naar de functie, via &mx In de functie komt het adres aan: CreateMatrix(const amy, const ir, const ic, const dval). Wijzig de gegevens op het adres, e.g. amy[0]= rann(2, 3); Evt kun je (als de matrix al bestaat), ook een enkel element wijzigen: amy[0][1][2]= 4.5;
8/18 Voorbeeld 3: Adressen /* CreateMatrix ( const amy, const ir, const ic, const dval )... Outputs : amy address, on output a matrix of size ir x ic, with value dval in all elements Return value : ir boolean, TRUE if all went well */ CreateMatrix ( const amy, const ir, const ic, const dval ) { amy [0]= dval * ones (ir, ic ); } return! ismissing (dval ); // Check if dval was a correct value main () {... // Calculate ir= CreateMatrix (&mx, ir, ic, dval );... }
9/18 Opgaven Opgave 1 Maak een random matrix aan van maat 3 x 5. Print deze matrix, eerst simpel met een Ox opdracht, dan element-voor-element (for-loop), met gebruik van logische routines. Opgave 2 Maak een random matrix aan van maat 3 x 5. Bepaal de som van de elementen, element-voor-element, met gebruik van logische routines.
10/18 Analyse I Magische getallen n = 3, k = 5, de maat van de matrix Initialisatie Creeer de matrix mx met random waarden Printen Gebruik een routine PrintMatrix, die de matrix rij-voor-rij gaat printen mbv routine PrintRijMatrix. Routines PrintMatrix. In: mx. Out: Print op scherm PrintRijMatrix. In: mx, i. Out: Print van rij i op scherm. Of, alternatief: Input is vx, een rij-vector PrintElementMatrix. In: mx, i, j. Out: Print van element i, j op scherm. Of, alternatief, input is dx.
11/18 Live coding Zie scherm... Een uiteindelijke routine: Listing 1: np w0sumb.ox /* SumElementMatrix ( const adsum, const dx ) Purpose : Sum een element van een matrix, effectief double Inputs : adsum pointer, on input sum until this element dx double Output : adsum pointer to double, sum including this element Return value : None */ SumElementMatrix ( const adsum, const dx) { adsum [0]+= dx; }
Do s en don ts Gij zult Elk programma, elk bestand, beginnen met een uitleg-blok (tenminste naam programma, doel, datum, auteur) Gebruik maken van Hongaarse notatie mx, vb, df, ik, amx voor matrix, vector, double, integer, adres van matrix etc. Splits (indien enigszins nuttig) het programma op in logische deeleenheden, routines Geef elke routine een eenduidige uitleg van definitie van input/output Zorg voor duidelijke output van het programma, inclusief het hoogstnodige commentaar Gebruik GEEN globale variabelen (tenzij onafwendbaar, niet in deze cursus) Hou de routines kort (max 24 regels) Gebruik zinvolle namen voor programma s, routines, variabelen 12/18
13/18 Ox en Monahan I Monahan (2001) gebruikt (prachtige) Fortran voorbeelden. Maar... duidelijkheid boven ultieme snelheid: vb matrix-vermenigvuldiging, kolom/rij georienteerd Listing 2: np ay1.f95! Order of computation : row - wise through A do i=1, M S= 0. do j= 1, N S= S + A(i, j) * Y(j) end do Z(i)= S end do WRITE (*,20)! Write z do i= 1, M WRITE (*,30) Z(i) end do Listing 3: np ay2.f95! Order of computation : column - wise through Z= 0.! Initialise full vector Z do j= 1, N do i=1, M Z(i)= Z(i) + A(i, j) * Y(j) end do end do WRITE (*,20)! Write z do i= 1, M WRITE (*,30) Z(i) end do
14/18 Ox en Monahan II Monahan (2001) gebruikt (prachtige) Fortran voorbeelden. Maar... matrix-vermenigvuldigingen: Toegestaan (ZEER gewaardeerd) na week 2, veel duidelijker Listing 4: np ay1.ox vz= zeros (im, 1); for (i= 0; i < im; ++i) { ds= 0; for (j= 0; j < in; ++j) ds= ds + ma[i][j] * vy[j]; vz[i]= ds; } print (" Output z= ", vz ); Listing 5: np ay3.ox // In Ox : Using matrix multiplication vz= ma * vy; print (" Output z= ", vz );
15/18 Ox en Monahan III Monahan (2001) gebruikt (prachtige) Fortran voorbeelden. Maar... geheugen: geen direct probleem, overschrijf geen bestaande matrix als dat geen voordeel oplevert. Doe het wel als het duidelijker code geeft... ma= EliminateColumn (ma, i); EliminateColumn (&ma, i);
16/18 Ox en thuisgebruik VU heeft licentie voor thuisgebruik door studenten. Zie http://download.vu.nl/ login met vu/je-vunetid en paswoord kies de Ox versie die bij je systeem past NB: Grafische mogelijkheden ( OxMetrics) gebruiken we hier niet/nauwelijks; editor ( OxEdit) is voldoende.
17/18 Terugblik Wat hebben we gedaan? Discussie van Ox Eerste set programma s Hoe retourneer ik gegevens van routine naar routine? Thuis/HW: Bestudeer slides Bestudeer evt OxIntro, of oxcursus slides Zorg dat je de basis-programma s kunt repliceren, en vooral begrijpt...
18/18 Bibliografie Monahan, J. F. (2001). Numerical Methods of Statistics. Cambridge series on statistical and probabilistic mathematics. Cambridge: Cambridge University Press.