Opdracht 2 (17 september 2014) Drie onderdelen; stuur de drie bijbehorende bestanden naar [email protected] Deadline maandag 29 september 12:00 uur. Vooraf: Enige Matlab Tips 1. Een tekstbestand met data inlezen en opslaan in een vector of matrix. Het bestand http://personal.vu.nl/a.a.n.ridder/numprog/src/proefdata.txt bevat 30 data, weergegeven in 10 rijen en 3 kolommen. Om met deze data te kunnen rekenen in een matlabprogramma, moet je eerst het bestand downloaden naar je eigen drive (H:). NB: bewaar als zogeheten platte tekst. Veronderstel nu dat je met Matlab in een current directory bezig bent waarin ook het bestand proefdata.txt staat. Het volgende programma leest het bestand en maakt een 10 × 3 matrix aan waarin de data komen. function A = datainlezen fi = fopen(’proefdata.txt’,’r’); A = fscanf(fi,’%f’,[3,10])’; fclose(fi); end Toelichting: • Met fopen wijs je het betreffende bestand aan een variabele toe, hier fi, en geef je aan of je het bestand wil lezen of schrijven. • Door fscanf ga je inderdaad het bestand lezen (scannen); • ’r’ betekent lezen (read ). • ’%f’ betekent dat de data als reele getallen (floats) worden gelezen (dus niet als gehele getallen). • De data worden rijgewijs ingelezen en kolomgewijs opgeslagen. Dus door A = fscanf(fi,’%f’); krijg je ´e´en kolomvector A met achtereenvolgens (onder elkaar) −4.00, −7.92, 5.23, 4.14, 9.56, . . .. En door A = fscanf(fi,’%f’,[3,10]); wordt A een 3 × 10 matrix waarin de i-de rij de i-de kolom van de data is. Dus die moet je transponeren om het goede resultaat te krijgen (zie de apostrofe aan het eind van fscanf. • Weet je wel dat de data in drie kolommen staan, maar je weet niet hoe lang die kolommen zijn, kies dan een voldoende grote lengte, bv (in dit geval) 100: A = fscanf(fi,’%f’,[3,100])’; het resultaat is toch een 10 × 3 matrix. 2. De lijst met invoerargumenten van een functie kan ook vectoren of matrices bevatten. Bijvoorbeeld, de matrix A van tip 1 wordt gebruikt in het volgende (deel)programma: 1 function main A = datainlezen; x = linspace(1,10,101); y = funf(x,A); plot(x,y); end function y = funf(x,A) h1 = prod(prod(abs(A))); h2 = max(max(A)); y = log(h1)./x + x.^(sqrt(h2)); end Toelichting: • De functie datainlezen staat natuurlijk wel in het volledige programma. Q Q • prod(prod(abs(A))) berekent i j |aij | en max(max(abs(A))) berekent maxi,j aij . • Een enkele aanroep van prod (prod(A)) geeft een rijvector van de kolomsgewijze producten. Idem voor max. • Een alternatief programma is het product en het maximum in main te berekenen en in de argumenten van funf aan te roepen. Dan hoeft niet meer de matrix A in de argumentenlijst: function main A = data_inlezen; p = prod(prod(abs(A))); m = max(max(A)); x = linspace(1,10,101); y = funf(x,p,m); plot(x,y); end function y = funf(x,a,b) y = log(a)./x + x.^(sqrt(b)); end P 3. Als x een vector is van lengte n, en je wilt ni=1 log(xi ); in Matlab sum(log(x)); 4. In Matlab probeer je zoveel gevectoriseerde berekeningen te doen. Bijvoorbeeld bij plotten: function grafiekplot(a,b) x = linspace(a,b,501); y = fun(x); 2 plot(x,y); end function y = fun(x) % x mag vector zijn y = ...; end In sommige gevallen is dat deels niet mogelijk. Bijvoorbeeld de functie n X f (x) = τix . i=1 Hierin is τ = (τ1 , . . . , τn ) een rij gegeven getallen. function grafiekplot(a,b,tau) x = linspace(a,b,501); y = zeros(1,501); for i=1:501 y(i) = fun(x(i),tau); end plot(x,y); end function y = fun(x,tau) % x is scalar; tau is vector y = sum(tau.^x); end Toelichting: τ is een vector; elk element wordt tot de macht x (getal) berekend (vandaar de punt), en dan worden alle τix gesommeerd. Je kunt niet tau.^x doen met zowel τ als x een vector. 5. Matlab kent de volgende functies: gamma(x) voor Γ(x); zoals bekend: ∞ Z Γ(x) = tx−1 e−t dt. 0 gammaln(x) voor log Γ(x); d psi(x) voor dx log Γ(x) = d dx Γ(x) /Γ(x), ook wel de digamma functie genoemd. Beschrijving van het probleem Zij X een continue stochastische variabele met kansdichtheidsfunctie f (x|α, λ) = λ(λx)α−1 e−λx , Γ(α) x > 0, waarin vormparameter α > 0 en schaalparameter λ > 0. Dit is de bekende Gamma verdeling, met verwachting E[X] = α/λ. 3 Opdracht (a) Schrijf een Matlabprogramma om in ´e´en figuur de grafieken van de functie f te plotten op [0.2, 6] voor de combinaties (α = 0.5, λ = 1), (α = 0.5, λ = 3), (α = 2.5, λ = 1), (α = 2.5, λ = 3). Geef elke grafiek een andere kleur, en geef met een legend aan welke kleur bij welke combinatie hoort. Schrijf je Matlabprogramma in een scriptfile genaamd opdr2a jeachternaam.m (vervang jeachternaam door je achternaam in kleinde letters). Opdracht (b) In het bestand http://personal.vu.nl/a.a.n.ridder/numprog/src/xdata.txt staan 500 waarnemingen van X bij schaalparametert λ = 1 maar bij een onbekende vormparameter α. De bedoeling is om α te schatten met behulp van de maximum likelihood methode. Noteer L(α) voor de likelihood, `(α) = log L(α) voor de log likelihood, d `(α) voor de afgeleide van de log likelihood. In dit onderdeel wordt geen `0 (α) = dα vraagd een Matlabprogramma te schrijven om de grafieken van `(α) en `0 (α) te plotten. Werk daartoe eerst de uitdrukkingen van deze twee functies op papier uit voordat je hun code programmeert. Het plotinterval heeft α als x-as en wel tussen α = 0.5 en α = T . Experimenteer zelf met T totdat `(α) duidelijk een unimodaal gedrag vertoont. Zet er ook de ”x-as”bij (bv als de grafiek van de functie f (·) ≡ 0) zodat je kunt zien in de figuur dat `(α) een maximum heeft waar `0 (α) = 0. Schrijf je Matlabprogramma in een scriptfile genaamd opdr3b jeachternaam.m (vervang jeachternaam door je achternaam in kleinde letters). In dat programma heeft T natuurlijk een door jou gevonden waarde. Onderdeel (c) In dit onderdeel bepaal je het maximum α∗ van `(α) in het interval [0, T ] op twee manieren: (i). Pas de Matlabfunctie fminbnd toe op `(α), zie bv het voorbeeld tijdens het eerste college. (ii). Pas bisectie toe op `0 (α). De code van bisectie moet je zelf programmeren en toepassen op `0 (α). Zie bijvoorbeeld de code van de false position methode toegepast tijdens het college: http://personal.vu.nl/a.a.n.ridder/numprog/src/falseposvb.m.txt Rapporteer in de output van beide methoden: de gevonden optimale parameter α∗ in 6 decimalen en de waarde van `(α∗ ) in 6 decimalen. En van methode (ii) (bisectie) druk ook het aantal iteraties en de lengte van het laatste inklemmingsinterval af. Tenslotte, vergelijk de twee resultaten ook door α = E[X] te schatten via het gemiddelde van de data. Schrijf je Matlabprogramma in een scriptfile genaamd opdr3c jeachternaam.m (vervang jeachternaam door je achternaam). 4
© Copyright 2024 ExpyDoc