Inbyggda funktioner i MATLAB MATLAB innehåller som vi redan sett ett stort antal inbyggda funktioner (se Holly Moore: Appendix A, Chapman avsn. 2.14, MATLAB 8 avsn. 2.3, 2.6): Elementär matematik: abs,exp,log10,rem,sqrt,sum, Trigonometri: sin,cos,tan,asin,atan,sinh,atanh, Komplexa tal: abs,angle,conj,imag,real,isreal, Avrundning: ceil,fix,floor,ceil Slumptal: rand,randn,randi Matriser: ones,xeros,eye,det,sum, Dataanalys: max,min,mean,median,std,sort,size, In- och utmatning: input,disp,fprintf,save,load, Diagram i 2D: plot,polar,pie,bar,axis,legend,text Diagram i 3D: plot3,mesh,pie3,bar3, Symbolisk matematik: diff,int,matlabfunction,simplify,solve Special: pi,eps,i,j,inf,nan, Numeriska metoder: polyfit,polyval,quad,integral, fzero,root,ode45,ode23, Föreläsning 6 sid.1 SF 1518/19 ht 2015 14 sept.
Egendefinierade funktioner på.m-fil Väljer man function i menyn under knappen så får man denna mall i editorn: function [ output_args ] = untitled2( input_args ) %UNTITLED2 Summary of this function goes here % Detailed explanation goes here end Där ersätter man untitled2 med ett funktionsnamn, som inte kolliderar med de inbyggda, input_args med parameter(-rar), output_args med resultatvariabel(-ler), satser som bl.a. som ger resultatvärde i funktionskroppen (i det blanka före end). Exempel: function res = kvotkub(x,y) if x==0 & y==0 disp( 0/0, bryt? ); pause else res=x^3/y^3; end Sparas med knappen Save under namnet kvotkub.m Kan användas direkt: kvotkub(36,3) ger 1728 kvotkub(1,0) ger Inf Föreläsning 6 sid.2 SF 1518/19 ht 2015 14 sept.
Egendefinierade anonyma (inline) funktioner och funktionshandtag Man kan också definiera en anonym funktion direkt i programmet: kvotkuban = @(x,y)x^3/y^3 och anropa på samma sätt. Man skapar då ett funktionshandtag (function handle) och lägger det i variabeln, här kvotkuban. Man kan skapa ett funktionshandtag på många fler sätt: + för en sparad funktion: kv = @kvotkub + från ett namn i en sträng: kv = str2func( kvotkub ) ger @kvotkub + för en symbolisk funktion: syms x; f=sin(sin(x)); sinsin = matlabfunction(f) ger @(x)sin(sin(x)) kv(36,3) ger 1728 Föreläsning 6 sid.3 SF 1518/19 ht 2015 14 sept.
Funktioner som parametrar Man kan ge funktionshandtag (eller strängar med funktionsnamn eller funktionsuttryck) som parametrar till funktioner: function res=computef2(f,a,b);res=f(a,b); end Anropas v=computef2(@kvotkub,36,3) eller v=computef2(kv,36,3) (kv sattes till @kvotkub) men v=computef2(kvotkub,36,3) ger Error Ett antal bra funktioner för numeriska metoder anropas med funktionshandtag eller strängar som första parametrar: quad(@(x)sin(x^3),0,1,5e-8) integral(@(x)log(1/(1+x^2)),0,4) fzero(@(x)x^3-3^x,2.5) fzero( cos,[0,pi]) fzero( exp(x)-2,[0 1]) ode45(@de,[0.3 10],[0.1 0.2]) med function r=de(x,y); r=[y(2) -2*x*y(2)-y(1)^2]; Föreläsning 6 sid.4 SF 1518/19 ht 2015 14 sept.
Hitta rötter till icke-linjära ekvationer Rötterna till en ekvation, f(x)=0 kan i de flesta fall inte uttryckas i exakt eller sluten form utan behöver approximeras. Flertalet metoder för att hitta rötterna bygger på att man hittar en startapproximation och sedan iterativt (upprepat) hittar bättre approximationer. Metoderna konvergerar om man startar tillräckligt nära roten. En bra förberedelse för att hitta ett startvärde är att rita upp f(x). Exempel: Man vill veta om f(x) = x 3-3 x = 0 har fler rötter än den uppenbara 3. Låt oss på försök titta på intervallet [-2:4] och rita kurvan och linjen y=0. x=-2:0.01:4; f=x.^3-3.^x; plot(x,0.*x,x,f) Föreläsning 6 sid.5 SF 1518/19 ht 2015 14 sept.
Kurvan och noll-linjen En rot 2,5 utöver den uppenbara 3. Föreläsning 6 sid.6 SF 1518/19 ht 2015 14 sept.
Intervallhalvering Om man vet att i f(x)=0 funktionen f(x) har olika tecken i ändpunkterna av ett intervall, [a, b], (och är kontinuerlig) så måste det finnas minst en rot i intervallet. Med hjälp av en graf kan man stänga in precis en rot. Genom att successivt beräkna f((a+b)/2) kan man minska intervallet och stänga in rötterna, algoritm: för att hitta roten med mindre fel än epsilon. 1. m:=(a+b)/2; Bilda f(m). Om f(m)=0 så roten:=m (precis!). Avbryt. 2. Om f(m)*f(a)>0 (samma sida) a:=m, annars b:=m 3. Om b-a > epsilon så gör om från 1., annars roten:=(a+b)/2 4. Felskattning: (b-a)/2 = eps/2 För x 3-3 x = 0 finns en rot i intervallet [2.2, 2.8]. Föreläsning 6 sid.7 SF 1518/19 ht 2015 14 sept.
Exempel på intervallhalvering För x 3-3 x = 0 finns en rot, r, i intervallet [2.2, 2.8]. Lås oss beräkna den med tre decimaler, osäkerhet E< 5*10-4. Från början r=2.5±0.3, E=0.3, efter ett varv E=0.15, efter n varv E=0.3*2 -n. För E< 5*10-4 krävs 0.3*2 -n <5*10-4 Tiologaritmera: -n*0.301+0.477-1<0.699 4, n > 9.2 I MATLAB: f=@(x)3^x-x^3 a=2.2; b=2.8; i=0; while (b-a)/2>5e-4 i=i+1; m=(a+b)/2; if f(m)*f(a)>0 a=m else b=m end end i ger 10 rot=(a+b)/2 ger 2.4780 E=(b-a)/2 ger 2.9e-04 Föreläsning 6 sid.8 SF 1518/19 ht 2015 14 sept.
Newton-Raphsons metod Idé: För att hitta en rot till f(x)=0 utgår man från en första Approximation x 0 och använder derivatan för att dra en tangent som skär x-axeln närmare roten och upprepar detta tills man är tillräckligt nära: x n+1 = x n f(x n )/f (x n ) Om f är ett formeluttryck så kan man normalt lätt bilda derivatan f Föreläsning 6 sid.9 SF 1518/19 ht 2015 14 sept.
Exempel (EXS 2.6) med Newton-Raphson P(x)=4x 4-7x 3 + 5.5x 2 +27.5x 50 = 0. Hitta noga roten nära 1.5. P (x)=16x 3 21x 2 + 11x +27.5 p=[4-7 5.5 27.5-50] for k=1:4 %derivatan pprim(k)=(5-k)*p(k); end x=1.5; dx=1; format long ger 1.500000000000000-0.004926108374384 1.495073891625616-0.000013421067689 1.495060470557926-0.000000000099026 1.495060470458900 0.000000000000000 while abs(dx/x)>1e-12 px=polyval(p,x); pprimx=polyval(pprim,x); dx=-px/pprimx; disp([x dx]); x=x+dx; end Fördubblat antal decimaler varje varv Kvadratisk konvergens? Föreläsning 6 sid.10 SF 1518/19 ht 2015 14 sept.