Matematik med Matlab M1 och TD1 1999/2000 sid. 35 av 47 6 Lokala extr Anpassning med minsta kvadratmetoden. 6.1 Gradientmetoden att hitta lokala min/max. Uppgift 1: Skriv en funktionsfil fun61.m funktionen. de partiella derivatorna och. Skriv en funktionsfil gradfun61.m gradienten till fun61. Den senare funktionsfilen skall ha utseendet function [px,py]=gradfun61(x,y) px= uttrycket som du py= uttrycket som du Spara dina filer i bibliotek! Kontrollera med what att matlab hittar dem! Kontrollera att de fungerar som du Vi skall nu den geometriska betydelsen av gradienten till funktionen. Till att med genererar vi koordinatmatriser x och y som i med av [x,y]=meshgrid(a:(b-a)/20:b,c:(d-c)/19:d); samt matrisen z = fun61(x,y);. Vi kan sedan antingen an gradfun61.m och Matlab de matriserna px = och py = med kommandot [px,py]=gradfun61(x,y); eller Matlab numeriskt gradienten med programmet [px,py] = gradient(z,h,k);, h= (B-A)/20 och k = (D-C)/19. Notera att gradient an bara i matrisen z att gradienten, om inte h och k lagom blir det en ganska approximation. Testa varianterna. att samtidigt rita ni or och gradientvektorerna an vi kommandosekvensen: contour(x,y,z), hold on, quiver(x,y,px,py), hold off Genom att A, B, C, D ser vi var funktionen har max eller min. Uppgift 2: en skriptfil som ov generering av matriser och ritning av ni or och gradienter. A, B, C,D att B-A = D-C. Ge kommandot axis( square ) efter quiver blir vinklarna korrekta och man ser att gradienten vink mot ni orna. Nu har ni sett vad gradienten geometriskt. Gradienten en vektor som pekar i den riktning mest. Kraftigare betyder gradientvektor. Om vi er en funktions lokala maximum kan vi 1) en startpunkt. Troligen har vi inte en punkt har lokalt maximum. 2) gradienten i denna punkt. 3) ett (litet) tal. Troligen kommer att vara om inte stort. 4) differensen. Upprepa 3) och 4) tills i liten. er vi minimum skall vi i riktningen. Eftersom vi har skrivit en funktionsfil gradienten det enkelt att i godtycklig punkt. Utan denna funktionsfil skulle vi an det numeriska programmet [px,py] = gradient(z,h,k) vet vi ju inte i vilka punkter som gradientvektorn skall vilket komplicerar det hela. Inom parentes kan att om man om man vill an gradient man, varje punkt, skapa matriser [x,y]=meshgrid([xi-h,xi,xi+h],[yi-k,yi,yi+k]) med ( ) och och z = fun61(x,y). Man gradientmatrisen som ovan. Punkten motsvaras av [x(2,2),y(2,2)], ges gradienten i punkten av [px(2,2),py(2,2)]. Uppgift 3: Komplettera programmmet uppgift att det dels ritar ni or och gradienter till en given funktion i ett valt dels succesivt stegar fram i gradientens riktning a er fram till ett ovan som fungerar bra) till en lokal minpunkt given startpunkt. Programmet skall succesivt rita en * i de punkterna att att Ni or och gradienter skall synas i varje bild. skall stoppa a mellan och punkt mindre ett givet tal, tex. (A mellan punkter P och Q ges av norm(p-q)). Testa med olika startpunkter. om skriptfilen till funktionsfil. Minpunkt och i denna punkt skall skrivas ut
Matematik med Matlab M1 och TD1 1999/2000 sid. 36 av 47 Kontrollera resultatet genom att ut gradienten i slutpunkten. kursens webbsida finns en funktionsfil som du kan titta och modifiera om du tycker uppgiften. Redovisning: Utskrift av ett fungerande program samt utskrift av slutbilden.@ 6.2 Minsta kvadratmetoden Antag att vi studerar en process av slag och att vi intresserade av en variabel som vi vet eller tror kan beskrivas av en modellfunktion, och parametrar men funktionen snart och att och vi vid vissa tidpunkter. Vi har ett antal par och skall och att mellan och kurvan blir god som Samma situation studerade vi i algebra vi anpassade exempelvis en linje eller en andragradskurva till givna punkter. De modellfunktioner vi an ledde till ekvationssystem parametrarna och (och ). Vi sedan ekvationssystemet med minsta kvadratmetoden och de parametrarna som minimerade. Om systemet inte vi ta till annan metod att finna minimum av felfunktionen, till exempel gradientmetoden. Uppgift 4: oss anta att vi gjort vid tidpunkterna och Vi antar att den matematiska modellen ger sambandet En perfekt mellan modell och skulle att det fanns och som satisfierade ekvationssystemet. Systemet saknar och vi er och som minimerar felfunktionen T ditt program upgift denna funktion. Redovisa med plot av och funktionen med de och insatta. Skriv in dessa i grafen. 6.3 Minstakvadratmetoden en realistisk modell. (Extrauppgift erbetyg.) I detta kapitel skall vi dels metoden ovan en mer realistisk modell, dels utarbeta ett program som enkelt kan an olika modeller och med En nackdel med till uppgift 4 ju att vi skriva in modellfunktionen och dess gradient lika som vi gjort. Risken skrivfel naturligtvis stor om man har. Den modellfunktion som skall an dessutom ganska komplicerad det enklast att ge den i en separat funktionsfil. Vi skriver en separat funktionsfil av felfunktionen vi er och modellfunktionen vara invariabel. I kapitlet bland annat tredimensionella matriser som bra att till om man skall arbeta med funktioner av tre variabler. 6.3.1 Modellfunktionen Betrakta en kemisk reaktion att er till ett via ett intermediat.. Reaktionerna sker med reaktionshastigheterna resp. Detta att koncentrationerna av satisfierar ett system av differentialekvationer:. Med begynnelsevillkoren och villkoret till detta system.
Matematik med Matlab M1 och TD1 1999/2000 sid. 37 av 47 Antag nu att man i ett experiment koncentrationen av B vid ett antal tidpunkter och vill reaktionskonstanterna och. Modellfunktionen. I fallet blir. 6.3.2 Hur kan man hantera att programmet som ni skrev till gradientmetoden funktionen som skall minimeras och dess gradient skrivas in i funktionsfiler. kan man olika strategier. Den enklaste att som i ov uppgift skriva in hela uttrycket som skall minimeras i en fil. Vid komplicerade modellfunktioner och med detta inte bra. En att skriva dels funktionsfiler modellfunktionen och dess gradient, dels funktionsfiler felfunktionen och dess gradient. De senare skall ha modellfunktion med gradient som invariabler. i funktionsfiler vilka vi sedan kan gradientmetoden. 6.3.3 Funktionsfiler felfunktionen och dess gradient. Felfunktionen, som jag kallar errfun, skall ha modellfunktionen samt parametrarna och som invariabler. Dessutom in En ju att ha en som invariabler. vi problem vi skall bilda den sammansatta funktionen som bara ha och som invariabler. den utesluten. Ett annat alternativ att skriva in i errfun.m. vi in i denna fil och om vi vill variera Dessutom skall ju samma in i gradienten till errfun. Dubbelt arbete och risk felskrivningar. den utesluten eller synnerligen metoden med globala variabler, som vi utnyttjat tidigare. En global variabel kan ju av funktionsfiler om man ger instruktioner. mig om att de variabler som normalt an i en funktionsfil de som anges som invariabler i deklarationsraden function [ut1,ut2]=fun(in1,in2,in3). som i en funktionsfil erkar inte, och erkas inte heller av, arbetsminnets variabler, (z=fun(x) ger naturligtvis variabeln z ett nytt om den fanns innan.) Jag repeterar hur tekniken med global variabel till: namnet den globala variabeln. Det skall vara att du inte riskerar att an det i annat sammanhang av misstag, det skall vara osannolikt att det finns som global variabel i annat matlabprogram Ett svenskt ganska ord skrivet med stora er (utan fungera. oss an namnet MAETDATA. Ge kommandot global MAETDATA i Ge matrisen som namnet MAETDATA Skriv in en rad global MAETDATA i funktionsfilen och ge sedan matrisen MAETDATA ett enklare namn tex D=MAETDATA;. Detta inte men minskar skrivarbetet i function z=errfun(f,a,b) % z=errfun( fun,a,b) ger kvadratiska avvikelsen mellan y(t) och % fun(a,b,t). % Funktionen fun skall i funktionsfilen fun.m % Invariabler i denna skall vara 3-dim matriser skapade med meshgrid. % a och b skall vara 2-dim matriser av samma typ alstrade med % [a,b]= meshgrid(a0,b0), a0, och b0 radmatriser. % skall finnas som en global variabel i form av en % matris MAETDATA med t=maetdata(1,:); y=maetdata(2,:) % z=errfun( fun,a,b) en 2-dim matris av samma typ som a och b. global MAETDATA D=MAETDATA; t=d(1,:); y=d(2,:); a0=a(1,:); b0=b(:,1) ; % a0 och b0 de radvektorer som genererade invariablerna a och b. [A,B,T]=meshgrid(a0,b0,t);[A,B,Y]=meshgrid(a0,b0,y); % genereras 3-dim matriser av
Matematik med Matlab M1 och TD1 1999/2000 sid. 38 av 47 % A och B konstanta i tredje indexet. A(:,:,1) = a, B(:,:,1)=b % T och Y varierar endast i tredje indexet. z=sum((y-feval(f,a,b,t)).^2,3); % Summering tredje index summering Gradienten till felfunktionen kallas graderrfun. Den partiella derivatan av felfunktionen med avseende vi med kedjeregeln till. Funktionsfilen graderrfun.m har, precis som gradfun61, utvariabler. Invariabler de till errfun samt gradienten till modellfunktionen. function [za,zb]=graderrfun(f,gradf,a,b) % [za,zb]=graderrfun( fun, gradfun,a,b) ger gradienten till kvadratiska % avvikelsen mellan y(t) och fun(a,b,t). % Funktionen fun skall i funktionsfilen fun.m % Funktionen gradfun skall i funktionsfilen gradfun.m % Invariabler i dessa skall vara 3-dim matriser skapade med meshgrid. % a och b skall vara 2-dim matriser av samma typ alstrade med % [a,b]= meshgrid(a0,b0), a0, och b0 radmatriser. % skall finnas som en global variabel i form av en % matris MAETDATA med t=maetdata(1,:); y=maetdata(2,:) % za och zb 2-dim matriser av samma typ som a och b. global MAETDATA D=MAETDATA; t=d(1,:); y=d(2,:); a0=a(1,:); b0=b(:,1) ; % a0 och b0 de radvektorer som genererade invariablerna a och b. [A,B,T]=meshgrid(a0,b0,t);[A,B,Y]=meshgrid(a0,b0,y); % genereras 3-dim matriser av [P,Q]=feval(gradf,A,B,T); % av av gradienten till modellfunktionen. za=sum(-2*(y-feval(f,a,b,t)).*p,3); zb=sum(-2*(y-feval(f,a,b,t)).*q,3); % med errfun.m 6.3.4 Funktionsfiler modellfunktionen och dess gradient. har vi en komplikation, modellfunktionen, som kallas expfun, ges av olika uttryck om eller. Ett liknande problem enkelt i uppgift 4.1 (varierande med av bl.a x>=0. T kan vi inte likadant ty uttrycken som skall an inte definierade erallt. En konstruktion som (x>0)./x producerar NaN x=0. det av kommentarerna i funktionsfilen hur man kan hantera denna i olikheten som definierar matrisen M diskuteras efter programfilerna. Kontrollera av gradienten. function y=expfun(a,b,t) % expfun(a,b,t) = a/(a-b)*(exp(-b*t) - exp(-a*t)) om a~=b % abs((a-b)*t) >= 10^(-8)) % expfun(a,b,t) = a*t*exp(-a*t) om a==b abs((a-b)*t) < 10^(-8)).
Matematik med Matlab M1 och TD1 1999/2000 sid. 39 av 47 % t, a och b skall vara 3-dim matriser av samma typ, % y blir matris av samma typ. if size(t)~=size(a) size(t)~=size(b) error( matriserna t,a,b skall vara av samma typ ) end % kontrolleras att de tre matriserna a,b och t av samma typ. % Om avviker stoppas och ett felmeddelande visas. M=abs((a-b).*t) < 10^(-8); % M en 3-dim matris som 1 om villkoret ovan uppfyllt, 0 annars. K= find(m); % K en lista de positioner elementet i M 1. J= find(1-m); % J en lista de positioner elementet i M 0. % K de platser y = a*t*exp(-a*t) J de andra platserna. y=zeros(size(t)); % Eftersom y skall definieras succesivt med de uttrycken skapas % en matris av typ. y(j)= a(j)./(a(j)-b(j)).*(exp(-b(j).*t(j)) - exp(-a(j).*t(j))); y(k)= a(k).*t(k).*exp(-0.5*(a(k)-b(k)).*t(k)); function [yprima,yprimb]=gradexpfun(a,b,t) % [yprima,yprimb]=gradexpfun(a,b,t) ger de partiella derivatorna av expfun % med avseende a resp b. % yprima = -b/((a-b)^2)*(exp(-b*t) - exp(-a*t)) +a*t/(a-b)*exp(-a*t) % om a~=b (abs(a-b) >= 10^(-6)) % yprimb = a/((a-b)^2)*(exp(-b*t) - exp(-a*t)) -a*t/(a-b)*exp(-b*t) % om a~=b (abs(a-b) >= 10^(-6)) % yprima = (t-a*t^2/2)*exp(-a*t) om a==b (abs(a-b) < 10^(-6) ). % yprimb = -b*t^2/2*exp(-b*t) om a==b (abs(a-b) < 10^(-6) ). % t, a och b skall vara 3-dim matriser av samma typ, % y blir matris av samma typ. if size(t)~=size(a) size(t)~=size(b) error( matriserna t,a,b skall vara av samma typ ) end % kontrolleras att de tre matriserna a,b och t av samma typ. % Om avviker stoppas och ett felmeddelande visas. M=(abs(a-b).*t) < 10^(-5); % M en 3-dim matris som 1 om villkoret ovan uppfyllt, 0 annars. K= find(m); % K en lista de positioner elementet i M 1. J= find(1-m); % J en lista de positioner elementet i M 0.
Matematik med Matlab M1 och TD1 1999/2000 sid. 40 av 47 % K de platser expfun(a,b,t) = a*t*exp(-a*t) J de andra platserna. yprima=zeros(size(t)); yprimb=zeros(size(t)); % Eftersom yprima och yprimb skall definieras succesivt med de uttrycken % skapas matriser av typ. yprima(j) = -b(j).*(exp(-b(j).*t(j))-exp(-a(j).*t(j)))./((a(j)-b(j)).^2)+... a(j).*t(j).*exp(-a(j).*t(j))./(a(j)-b(j)); %... betyder: rad. yprima(k) = (t(k)-0.5*a(k).*(t(k).^2)).*exp(-a(k).*t(k)); yprimb(j) = a(j).*(exp(-b(j).*t(j))-exp(-a(j).*t(j)))./((a(j)-b(j)).^2)-... a(j).*t(j).*exp(-b(j).*t(j))./(a(j)-b(j)); yprimb(k) = -0.5*a(K).*(t(K).^2).*exp(-a(K).*t(K)); 6.3.5 Den sammansatta funktionen. Funktionen som skall minimeras kan nu skrivas errfun( expfun,a,b). Vi kan nu skriva funktionsfiler ning av denna funktion, fun62.m och dess gradient gradfun62.m. Filen fun62.m ser ut function z=fun62(a,b) z=errfun( expfun,a,b); Filen gradfun62.m skrivs analogt. Uppgift 5: Skriv funktionsfilerna fun62.m och gradfun62.m. filerna errfun.m, graderrfun.m, expfun.m, gradexpfun.m och testdata.m som vanligt kursens webbsida. Ge kommandot global MAETDATA, MAETDATA=testdata(20);. minimum fun62.m med gradientmetoden samma som ni gjorde fun61.m. Funktionen testdata genererar slumpvisa data. Om du den flera du olika resultat varje Redovisa samma som i uppgift 4. 6.3.6 V inte M=(a-b==0) i filerna expfun.m och gradexpfun.m? Om Matlab exakt skulle M=(a-b==0) fungera. Givetvis Matlab, precis som alla numeriska program, med approximationer. kan exempelvis divisioner, och mycket ge oanade resultat. blir det om, som i detta fall, en differens av lika stora tal. all precision i kalkylerna, det enda som finns kvar avrundningsfelen. Antag till exempel att vi skall kvoten. Maclaurinutveckling av ger att den kan skrivas v kvoten. kvoten 1. andra sidan kan inte datorn ta med siffror vid av om och ge samma med Matlabs noggrannhet. Skillnaden vara eps dvs oavsett vad. En rimlig gissning att datorn ger kvoten orimliga. En enkel kontroll med h=10.^(-10:-1); y=6*(exp(h)-1-h-.5*h.^2)./h.^3 ger att y 1 om h = 10^(-4) men avviker kraftigt mindre h. Samma typ av kontroll ger som an i programmen ovan. Uppgift 6: och vara kontinuerlig i hela -planet, skall.. Testa vilka som kvoten blir orimlig och skriv sedan en funktionsfil av