%% 23 Båglängd
% Takeawys
% Längden  L  av grafen till  f(x),\,\, a\leq x\leq b  kan beräknas med integralen \int_a^b\!\sqrt{1+(f'(x))^2}\,dx.
% Om  xv  och  fv  är radvektorer med värden mellan a och b respektive funktionvären i dessa kan man approximera  L  med  hjälp av dessa.
% Vi vill beräkna längden L av grafen till en funktion f(x),\, a\leq x\leq b, där vi förutsätter att f(x) har en kontinuerlig derivata på intervallet. Förklaringen till detta kommer senare.
% Dela in intervallet  [a,\, b] i  n lika långa delintervall
% [x_0,\, x_1],\, [x_1,\, x_2],\, \ldots ,\ [x_{n-1},\, x_n],
% (där a= x_0,\, b= x_n,) vardera av längd \Delta x = ( b - a)/n.  Delningspunkterna x_0,\, x_1,\, \ldots,\, x_n ger oss punkter
% P_0 = (x_0, \, f(x_0)),\, P_1 =(x_1,\, f(x_1)),\, \ldots P_n=(x_n,\, f(x_n))
% på grafen till f. Summan av avstånden mellan två på varandra följande punkter, |P_{i-1}P_i|,  bör vara en approximation till längden av grafen
% L \approx |P_0P_1|+ |P_1P_2|+\cdots +|P_{n-1}P_n|=\sum_1^n|P_{i-1}P_i|,$
% som bör bli bättre ju större värde på n vi väljer, så att L blir gränsvärdet av summan i högera ledet när n\to\infty.
% Vi har att
% |P_{i-1}P_i|=\sqrt{ (x_i-x_{i-1})^2+(f(x_i)-f(x_{i-1}))^2}=
% =\sqrt{(\Delta x)^2+(f(x_i)-f(x_{i-1}))^2}.
%
% Enligt medelvärdets satsen  finns ett  t_i\in[x_{i-1},\, x_i]  så att
% \frac{f(x_i )-f(x_{i-1})}{x_i-x_{i-1}}=f'(t_i),\mbox{ eller } f(x_i)-f(x_{i-1})=\Delta x \, f'(t_i).
% Det ger att
% |P_{i-1}P_i|=\Delta x \sqrt{1+f'(t_i)^2}
% där t_i är en tagg i  [x_{i-1},\, x_i]. Det betyder att
% L\approx \sum_{i=1}^n|P_{i-1}P_i|=\Delta x \sum_{i=1}^n\sqrt{1+f'(t_i)^2}
% där högra ledet är Riemannsumma för en taggad partition till
% \int_a^b\sqrt{1+f'(x)^2}\, dx.
% Eftersom vi förutsätter att f' är kontinuerlig på [a,\, b] är även integranden här kontinuerlig på intervallet och vi kan vara säkra på att integralen finns och är gränsvärdet av (godtyckligt) taggade Riemansummor när n\to 0. Detta gör det rimligt att
% L=\int_a^b\sqrt{1+f'(x)^2}\, dx.
% som kallas båglängden till grafen av f över intervallet [a,\, b].
% De intergraler som dyker upp i samband med beräkning av båglängd är notoriskt svåra att hantera och man tömmer ganska snabbt ut de fall där det går att hitta en primitiv funktion med hjälp av elementära funktioner (de vi normalt arbetar med). Då återstår att approximera L numerisk genom att beräkna summan av avstånd mellan valda punkter på grafen.
%
% Uppgift 23.1   Approximera båglängden av f(x)=x^2,\, \,0\leq x\leq 1 genom att beräkna summan av avstånden mellan 1001 på varandra följande punkter på grafen.
% Lösning



%
% Uppgift 23.2   Beräkna hur lång en studs är av en boll som studsas med vinkeln 30^{\circ} mot lodlinjen och studsar upp med farten 12 m/s.
% Lösning   Sen tidigare har vi filen bollbana.m , men den gav oss inte y som funktion av x, utan värden av x och y som funktioner av tiden t. Vi skulle kunna uttrycka y som funktion av x och använda formeln ovan, men det verkar onödigt komplicerat, eftersom vi redan kan få punkter längs banan med  bollbana.m . Vi väljer att utnyttja dessa istället.
% I filen bollbana.m var farten (hård-)kodad till  10 m/s . Vi ändrar  så att vi kan välja inte bara vinkel utan även utgångsfart  v0.  Kommandot
% bollbana2( vinkel_grader , v0 )
% resulterar i listor på x- och y-koordinater och tidpunkten då bollen tar mark efter studsen. Vi ändrar också från 100 till 1000 tidpunkter, eftersom vi ska beräkna längden av banan och vill ha lite precision.
% function [x_v , y_v, t_max] = bollbana2(vinkel_grader, v0)
%     g = 9.81 ; % Tyngdaccelerationen.
%     vinkel = vinkel_grader * pi /180 ; % Vinkel i radianer
%     t_max = 2 * v0 * cos( vinkel ) / g ; % Tidpunkt för nedslag
%     t_v = linspace( 0 , t_max , 1000) ; % 1000 tidpunkter
%     x_v = v0 * sin( vinkel ) * t_v ; % Banans x-koordinater
%     y_v = -g * t_v.^2 / 2 + v0 * cos( vinkel ) * t_v ; % Bananas y-koordinater
% Vi sparar filen som bollbana2.m .



%
%
%% 23. 2   Handfast approximation av båglängd
% Takeaways
% Kommandot  ginput  ger användar möjlighet att leverera positioner i ett figurfönster till ett väntande skript genom klick med musen i fönstret.
% Kommandot leverar en vektor med x- och en vektor med y-koordinater samt en tredje vektor med kod för vilken musknapp som använts vid klicken.
% Kommandot  ginput  (graphical input) kan användas för att hämta koordinaterna för musklick i ett figurfönster. Vill man hämta information för n stycken klick i figuren skriver man
% ginput( n ) .
% När kommandot står i ett skript gör körningen av det ett upphåll och inväntar att användaren klickar  n  gånger i  ett figurfönster. Kommandot levererar sedan två kolonnvektorer tillbaka till skriptet, som innehåller x- resptektive y- koordinater för det punkter man klickat på.
%
% Pröva detta nu med  n = 5  och plotta resultatet.



%
% Kommandot  ginput  levererar också en tredje kolonnvektor som innehåller vilka knappar på musen man använt. Vänsterknapp ger värdet 1, mittknapp 2 och högerknapp 3.
% Pröva detta nu med  n = 4  och använd olika knappar på musen.



%
% Vill man inte på förhand ange hur många klick som ska göras i figurfönstret kan man ange
% ginput( ) .
% Man avslutar då med retur-tangenten på tangetbordet.
% Pröva detta nu.



%
% Lite tråkigt är det ju att man inte direkt ser var man klickar, men det kan lösas!
% Uppgift 23.2   Skriv kod som tillåter användaren att klicka med vänster musknapp ett obestämt antal gånger i figurfönstret.
% Två på varandra följande punkter ska förbindas med en streckad linje och punkter markeras med stjärnor.
% När användaren klickar på annan  knapp på musen ska processen avslutas med en sista punkt.
% Koordinaterna där man klickat ska sparas i två listor; en  med x-kooridnater och en med y-koordinater.
% Lösning



%
% Det där var ju så kul att vi sparar i en m-fil  follow_the_dots.m . Vi behöver ingen input till kommandot, så när vi ritat en figur är det bara att ange  follow_the_dots  för att sätta igång processen.
% function [ xv , yv ] = follow_the_dots
%     [ xv , yv , knapp ] = ginput( 1 ) ; % Hämtar första punkten
%     plot( xv , yv ,'pr') % Markerar första punkten
%     while knapp == 1 % Kollar att vänster knapp tryckts ned
%         [ x , y , knapp ] = ginput( 1 ) ; % Hämtar ny punkt och knapp
%         plot( x ,y ,'pr') % Markerar nya punkten
%         plot( [ xv(end) , x ] , [ yv(end) , y ] , '--r', 'LineWidth', 2)
%             % Plottar mellan två senaste punkterna
%         xv = [ xv  x ] ; % Uppdaterar xv
%         yv = [ yv  y ] ; % Uppdaterar yv
% end
% Resultatet av kommandot  follow_the_dots  i ett skript blir att användaren får klicka i ett öppet figurfönster och markera ett polygontåg. Det resulterar också i  radvektorer  med x- respektive y-koordinater för de punkter som markerats.
% Pröva nu detta i ett fönster som innehåller grafen till grafen till f(x)=3\sin(x^2) + 5\cos(2x)  över intervallet [0,\, 2\pi] .



%
% Uppgift 23.3    Beräkna längden av grafen till f(x)=x^2,\quad 0\leq x\leq 2,
% a) med formeln för båglängd,
% b) med hjälp av punkter på grafen som du låter Matlab ta fram,
% c) med  follow_the_dots .
% Lösning



%