%% 6  Plot i 2D ( i x,y - planet)
%% 6.1  Plot av data lagrad i en vektor
% Takaways
% plot(u)  plottar koordinaterna (värdena) i vektorn u  med index längs första axeln och koordinater (värden) längs andra.
% Med olika tillägg kan man styra utseendet av grafen. Googla matlab line specification för alternativ,
% Tillägget 'LineWidth' (eller  'linewidth' ) styr tjocklek på linjer i plottar.
% Antag att u är data i form av en rad- eller kolonnvektor. Vi vill illusterar data grafiskt. I Matlab kan man göra det med kommandot
% plot( u )
% som markerar punkter i planet vars andra koordinater är olika värden på datan (koodinater i  u ) och vars första koordinater är tillhörande index (vilken plats datan står på i  u ).
% Pröva detta med
% u = ( x_v.^3 - x_v ) ./ ( 1 + x_v.^2 )
% där  x_v = linspace( -2 , 2 , 10 ) :



% Som du  ser har Matlab successivt förbundit punkterna med räta linjesegement. Vill man se både punkter och linjerna kan man använda tillägget  '-o' , som ger linjer ( '-' ) och en cirkel ( 'o' ) som markör kring varje punkt. Vill man bara se punkerna kör man tillägget  'o' . Vill man ha streckade linjer, kvadrat som markör, färgen röd  och tjockare linjer kan man göra det med tilläggen
% '--sr' , 'LineWidth', 2
% där  s  står för square och  r  för red. Vill du kolla vilka alternativ som som finns googlar du matlab line specification.
% Pröva detta nu:



%
%% 6.2  Plot av y-värden som beror på x-värden
% Takeaways
% plot( lista_x , lista_y ) plottar punkter vars första koordinater finns i  lista_x  och vars andra koordinater finns i   lista_y . De binds samman med linjesegment (om inget annat specas).
% Alla kurvor Matlab ritar består av (flera små) linjesegment. Zommar man tillräckligt ser man bara räta linjenstycken.
% Namn på axlar kan specas med  xlabel( 'text' ) ,  ylabel( 'text' ) .
% Värdena i  u  i 6.1 beror ju på värden i  x_v , så vi vill kanske hellre ha  x-värden längs den horisonella axeln än index. Det fixar man med
% plot( lista_x , lista_y )
% där lista_x är en vektor med x-koorlidnater och lista_y en  vektor med samma antal värden som lista_x. Matlab kommer då att successivt förbinda punkter med första koordinat från lista_x och andra koordinat från lista_y .
% Pröva detta nu, med  x_v = linspace( -2 , 2 ) och  y_v = (x_v.^3 - x_v ) ./ ( 1 + x_v.^2 ) :



% Nu har vi x-värden längs horisonella axeln och y-värden längs den vertikal. Vi namnger axlarna och lägger på ett rutnät:



% Som du märker ser grafen inte länger ut som punkter successivt förbundna med räta linjesegment. Det beror på att vi nu har 100 punkter, eftersom vi använt linspace  utan att speca nåt annat antal. Drar vi ner till 10 punkter får vi följande:



% Matlab ritar alltid kurvor i planet genom att successivt förbinda punkter med linjesegment!
% Uppgift 6.1
% a)  Bestäm koordinaterna för den 34:e punkten i  plot( x_v, y_v ) , med  x_v = linspace( -2 , 2 ) och  y_v  som ovan.
% b)  Plotta och markera punkten. Zooma in och så att du ser den och att grafen gör en "knyck" där.
% Lösning



%
%% 6.3  Grafer till funktioner
% Takeaways
% Matlab har en rad inbyggda funktioner. Lär dig hur de (vanligaste) skrivs!
% Begreppet  vektoriserad  funktion.
% Att multiplikation, division och potens med en konstant inte är vektoriserade.
% Vektoriserad multiplikation, division och potens skrivs  u .* v  ,  u ./ v respektive  u .^v .
% Addition och subrtraktion är vektoriserade.
% Matlab optimerar upplevelsen genom att automatiskt välja skalor längs axlar om man inte specar nåt annat.
% axis( [ x_m , x_M , y_m , y_M ] )   sätter axlarna så att första axeln går mellan  x_m  och  x_M , och den andra mellan  y_m  och  y_M .
% Vi har ju i pricip ritat grafen till funktionen  f(x) = \frac{ x^3 - x }{ 1 + x^2 }   över intervallet  [ -2,\, 2] , fast det kanske inte framgått så tydligt. Det skulle blivit tydligare om vi definierat funktionen och därefter ritat grafen. Matlab har en rad inbyggda funktioner som  sin,  cos, och   tan . En del av dem skrivs annorlunda än vad som är vanligt i mateamatisk text. T.ex.
% \ln x,\, \log_{10}x   skrivs   log( x )  resp. log10( x )
% \mathrm{e}^x  skrivs  exp( x )
% \sqrt{ x }  skriv  sqrt( x )  eller  x^0.5  eller  x^.5
% \arctan x, \, \arcsin x,\, \arccos x skrivs atan(x),  asin(x)  resp.  acos(x).
% Alla dessa funktioner, utom potensfunktioner  x^a , är vektoriserade i Matlab. Det betyder att de går att räkna ut dem på en vektor (lista)  u  av tal, så att t.ex  log( u )  resulterar i en vektor där koordinaterna är natruliga logaritmen av motsvarande koordinater i  u . Funktionen beräknas koordinatvis (eller punktvis).
% Pröva detta nu, med  u  en vektor med 10 tal och fuktionen cosinus av den. Plotta  u  och  resultatet i samma figur:



%
% Uppgift 6.2
% a)  Välj 10 jämnt fördelade tal mellan  -\pi och  \pi. Gör en tabell över värden till funktionen  f(x) = 2\cos x + 3\sin x i dessa tal.
% b)  Plotta funktionen över intervallet  [-\pi,\, \pi].



%
% Potensfunktioner, dvs funktioner av typen  f(x)=x^a\, , där a är en konstant är inte vektoriserade i Matlab. Det finns en anledning till det. Multiplikation i Matlab betyder multiplikation av matriser, eftersom allt är uppbyggt kring sådan. Det går inte att utföra matrismultiplikation av en vektor med sig själv (så vida den inte är en 1x1-matris). Rimligen ska  x^2  betyda  x*x vilket i allmänhet inte är definierat. För att kvadrera talen i listan (vektorn)  x  punktvis måste vi skriva x.^2 för att vektorisera kvadraten. På samma sätt är multiplikation och division inte vektoriserade. Punktvis multiplikation (eller division) av  två vektorer (listor)  x  och  y  med samma antal   åstadkommer man med  x .* y  respekive x ./ y .
% Multiplikation och division med en konstant är vektoriserade i Matlab. Om x  är en vektor är t.ex. resultatet av  2 * x (eller  x * 2 ) och  x / 2  att varje koordinat fördubblas respektive halveras.  Det gör inget om man skulle råka använda  .*  eller  ./  i dessa fall.
% Pröva detta med  x = [ 1 2 3 ]  och  y = [ -2 3 -5 ] :



%
% För att vektorisera potensfunktionen  x^a  skriver man  x.^a , dvs punktvis potens med  a  i listan  x .
% Pröva detta med   x = [ 9 16 25]  och   a = 0.5 :



%
% Uppgift  6.3
% Plotta funktionen f(x) = x \ln x^2
%   och  över intervallen [-2,\, 2]  respektive [-2,\, 4]\, .



% Här finns tvä saker att lägga märke till:
% 1)  Matlab anpassar skalorna på y-axlarna olika, för att man ska få optimal upplevelse. Å andra sidan gör det att de två graferna ser lite olika ut där de borde sammanfalla. Ett sätt att fixa detta är att tala om för Matlab mellan vilka tal de båda axlarna ska utsträckas mellan. Det gör man med kommandot
% axis( [ x_0  x_1  y_0  y_1 ] )
% där x-axeln då kommer att ritas mellan  x_0 och  x_1  samt y-axeln mellan  y_0  och  y_1 . Pröva detta nu i uppgiften, så att skalorna i de båda figurerna blir samma. Det gör inget om det blir lite "luft" kring grafen!
% 2)  Grafen över intervallet  [ -2,\, 4]  gör ett märkligt uppehåll kring  origo. Vad kan det bero på? Funktionen f(x) = x\ln x^2  är definierad för alla  x utom  x=0\,. När man använder  linspace( -2 , 2 )  kommer talet  0  inte med i listan, men det gör det när vi väljer  linspace( -2 , 6) ! Det gäller alltså att hålla ordning på definitionsmängden när man plottar en graf.
%
%% 6.4  Egna funktioner i Matlab  - anonymt
% Takeaway
% Begreppet anonym funktion.
% Hur man med  title  lägger till en rubrik till en figur.
% Hur man plottar flera grafer med ett och samma plot-kommando.
% När vi plottar grafen till en funktion f(x)  skulle vi kanske helst vilja göra det med
% plot( x_v , f(x_v) )
% Det skulle varit bekvämt om det gick att få in en funktion i Matlab med t.ex.
% f(x) = x * log( x^2 ) (Funkar inte!!)
% Filosofin i Matlab är emellertid att bokstäver (eller namn) måste stå för konkreta värden, så  x  kan inte utan vidare användas som en variabel i matematisk mening (som kan anta godtyckliga värden). Sättet att införa  x  som variabel är att introducera den med  @(x) . Man kan ändå inte skriva
% f(x) = @(x) x * log( x^2 )  (Funkar inte!!)
% dels eftersom  x  i vänstra ledet inte är introducerat som variabel när det används och dels eftersom vänstra ledet ska vara ett namn (parenteser är inte tillåtna i namn). Det som funkar är
% f = @(x) x * log( x^2 )
% Nu är vänstra ledet ett namn på en (konkret!) regel som står i högra ledet. Detta sätt att definiera en funktion i Matlab kallas lite kryptiskt för att göra en anonym funktion. Anledningen är att den, t.ex. till skillnad från inbyggda funktioner som  sin , bara är tillgänglig under den aktuella sessionen (om inget annat görs).
%  För att beräkna f(2) med Matlab ger man helt enkelt kommandot
% f( 2 )
%
% Pröva detta nu:



%
% Men om vi ska rita grafen till  f(x)  fungerar detta ändå inte, eftersom vi inte vektoriserat multiplikationen och potensen. Vi fixar det med
% f = @(x) x .* log( x.^2 )
% Uppgift 6.4
% Plotta grafen till  f(x) = x\mathrm{e}^{1/x} kring origo. Rita över lämplig definitionsmängd, så att man får en uppfattning om funktionens beteende. Sätt beteckningar på axlarna och en titel på figuren.
% Lösning



% Man får pröva sig fram till vad som är lämpliga delar av x-axeln att plotta över, för att få en så god bild som möjligt av grafen. I lösningen användes kommandot
% title( 'text' )
% för att ge en figurtext i figuren. Dessutom användes att man kan plotta flera grafer med ett enda plot-kommando. Man kan också plotta varje del av grafen med var sitt  plot  och använda  hold on  och  hold off , vilket gör koden mer lättläst.
%
%% 6.5  Egna funktioner i Matlab  --  m-filer
% Takeaway
% Med funktioner definierade i m-filer kan man spara funktioner mellan körningar och återanvända dem.
% En funktion sparad i en m-fil ska ha samma namn som m-filen.
% Innehållet i m-filen ska följa ett generellt schema. Se nedan.
% Filen ska sparas i Matlabs sökväg, alternativt ska man tala om för Matlab var filen finns: högerklicka på fliken med filens namn i Matalbs editor och välj Add to Search Path.
% Funktioner definierade av m-filer kan ha myckt mer generellt innthåll än anonyma funktioner, som bara kan bestå av en enda beräkningssats.
% Koden i m-filer kallas skript och kan vara (små) program, som gör mer än bara räknar ut ett (eller flera) värden.
% Kommandot  text( a , b , 'skrift' )  placerar texten  skrift  i figuren med nedre vänstra hörnet i punkten med koordinater (a , b) .
% Om man med möda knappat in en funktion i Matlab vill man kanske spara den, så att den kan användas vid ett senare tillfälle. Kanske vill man också dela upp konstruktionen av den i flera steg. Då är metoden med anonym funktion inte så lämplig.
% Det är då bättre att skriva den i en egen fil, ett så kallat skript, och spara resultatet på datron (eller i molnet, eller skolans filsystem). För att skriptet ska vara användbart, måste filen sparas i Matlabs sökväg, alternativt kan man göra Matlab medvetet om var den finns genom att adda dess adress till Matlabs sökväg.
% Ett skript som innehåller en funktion ska följa mallen
% function resultat = namn_på_funktionen( variabler )
%     steg som leder fram till beräkning av resultat med hjälp av variablerna.
% Filen ska sparas med namnet  namn_på_funktionen.m
% Exempel  Vi vill göra en funktion som vi vill kalla  kryss . Den ska till  två vektorer  u  och  v  med tre koordinater beräkna deras kryssprodukt, som alltså ska vara resultatet. Vi börjar skriptet med
% function res = kryss( u , v )
% Efter det ska det följa instruktioner för hur  res (dvs kryssprodukten) ska beräknas ugående från u och  v .
% Här är en möjlig lösning, där vi väljer att räkna ut koordinaterna i kryssprodukten var för sig och sen sätta ihop dem till resultatet ( res ):
% function res = kryss( u , v )
%     koord_1 = u(2) * v(3) - u(3) * v(2) ;
%     koord_2 = - (  u(1) * v(3) - u(3) * v(1) ) ;
%     koord_3 = u(1) * v(2) - u(2) * v(3) ;
%     res = [ koord_1  koord_2  koord_3 ]' ;
% Vi sparar filen med detta innehåll med namnet  kryss.m  i Matlabs sökväg. Efter det kan vi använda kommandot  kryss( u , v)  för att beräkna kryssprodukten av två vektorer  u  och  v  i rummet.
% Pröva detta med två vektorer i rummet:



%
% Skriptet innehåller kommandon som utförs (i tur och ordning) i Matlab; en typ av program alltså. Observera att varje rad i skriptet avslutas med  ; . Det är för att vi ska slippa utskrifter av kommandona på raderna, när vi exekverar (kör) programmet med kommandot  kryss( u , v ) . Bara resultatet ( res ) skrivs ut.
% Slut exempel.
%
% Uppgift 6.5
% När kapitalet  K = 100  placeras till räntan  r\%  med kontinuerlig kapitalisering är behållningen vid tiden  t (mätt i delar av år)  B(t) = K\mathrm{exp}(rt/100) . Illustrera behållingen som funktion av tiden med olika värden på r\,.
% (Vid årlig kapitalisering (uträkning av räntan) är  B(t) =K(1+ r/100)^t\,  och bara definierad när t är ett positivt heltal.)
% Lösning
% Vi ska rita grafen till  B(t) för flera olika värden på  r och väljer att göra ett skript med två variabler: t och r:
% function res = behallning( t , r)
%     res = 100 * exp( t * r /100 );
% och sparar det som behallning.m .



% Kommandot
% text( a , b , 'skrift' )
% placerar texten  skrift  i figuren med nedre vänstra hörnet i punkten med koordinater (a , b) .