%% 13  Intervallhalvering och nollställen
%% 13.1 Intervallhalvering för nollställe till funktion
% Om en funktion f(x)\,, som är kontinuerlig på intervallet I = [a,\, b]\,,
% har olika tecken i a och b\,, så har den, enligt satsen om mellanligande värde, garanterat (minst) ett nollställe i nåt c\in [a,\, b]\,.
% En teknik att komma åt (en approximation av) ett sånt nollställe är att successivt halvera intervallet. Det är en repetitiv procedur som väl lämpar sig för en loop.
% Det finns tre tecken: positivt ( >0\,), negativt ( <0\,), och 0 (som varken är positivt eller negativt)
%
% Punkten m = (a+b)/2 är mittpunkten i intervallet [a,\,b]\,. Funktionen f kan inte ha samma tecken i a och m och b\,, för då skulle den ha samma tecken i a och b\,. Alltså växlar f tecken på [a,\, m] eller [m\, ,b]\,.Vi sätter
% I_1 = \left\{\begin{array}{rcl}
% [ a,\, m] &\mbox{ om } f \mbox{ har olika tecken i } a \mbox{ och } m\\
% [ m,\, b] &\mbox{ om} f \mbox{ har samma tecken i }  a \mbox{ och } m
% \end{array}
% Vi förenklar genom att kalla de ändpunterna i I_1 för a_1 repektive b_1, så att I_1 = [a_1,\, b_1]\,. I först fallet är alltså a_1=a och b_1=m\,, i det andra gälller att a_1 = m och b_1 =b\,. Det vi åstadkommit med I_1 är
% I\supset I_1
% längden på I_1 är hälften av längden av I\,, dvs l/2, om I har längden l\,,
% f har olika tecken i I_1:s ändpunkter och därmed  ett nollställe i I_1.
% Proceduren kan uppas och ger oss en följd av intervall så att
% I\supset I_1\supset \cdots \supset I_n\supset \ldots\,,
% längden av I_n är l/2^n\,,
% f har ett nollställe i I_n\,.
% Mittpunkten i intervallet I_n kommer nu att ha ett avstånd till nollstället i I_n som är \leq l/2^{n+1}, som går mot 0 när n\to \infty\,. Genom att välja n tillräckligt stort kan vi på så vis approximera ett nollställe till f med önskad nogrannhet (eller med tur hitta det exakt).
%
% Uppgift 13.1
% a)  Välj en kontinuerlig funktion f och ett intervall I\, i  f\!:s definitonsmängd, där f har positivt värde i ena ändpunkten och negativt i den andra. Skriv kod som resulterar i intervallet I_1 enligt ovan. Se till att om f har ett nollställe i I\!:s vänstra ändpunkt, så har  I_1 samma vänstra ändpunkt som I.
% Pröva koden på några olika intervall I\,.
% b)  Ändra så att koden kollar att f vilkoret i ändpunkterna av I och varnar om f\!:s värde är positivt i båda ändpunkterna, eller negativt i båda.
% Lösning



%



%
%% 13.2 Sekvensen av intervall i intervallhalvering
% I  13.1  presenterades teorin för intervall halvering och kod för att bestämma det första intervallet I_1 i en oändlig sekvens av avtagande intervall, där nästa är hälften så långt som sin föregångare, men ändå också innehåller ett nollställe till en given funktion.
% När man vill ha tag i sekvensen, gäller det att upprepa proceduren som ledde till I_1 från I\,, så att man får I_2 från I_1\,, etc. För detta är det lämpligt att använda en For-sats eller en While-sats. Vi vill hitta en approximation till ett nollställe till en funktion med viss noggrannhet. Då är det mindre lämpligt med en For-sats eftersom vi då måste bestämma oss vad n ska vara för att I_n har en längd som är tillräckligt liten. Det blir bättre med en While-sats där vi kör proceduren tills längden på intervallet är tillräckligt liten.
%
% Uppgift 13.2
% Välj en kontinuerlig funktion foch ett intervall I i f\!:s definitionsmängd. Skriv kod som
% varanar om f är positiv i båda ändpunkterna, eller negativ i båda.
% annars resulterar i en sekvens av intervall som ovan i 2.1 tills längden av sista intervallet är \leq 1e-2 .
% ritar grafen till f på I och illustera intervallen.
% Lösning

 

%
% Uppgift 13.3
% Skriv en Matlab-funktion  intervall_med_nollst.m ,  så att givet
% en kontinuerlig funktion  f ,
% ett intervall  I  i  f:s  definitionsmängd,
% en tolerans tol , (ett positivt litet tal),
% resulterar
% intervall_med_nollst( f , I , tol )
% en varning om  f  är positiv i båda ändpunkter til  I , eller negativ i båda.
% annars i ett intervall vars längd är \leq tol , och där  f  har ett nollställe.
% Pröva funktionen!
% Lösning
% Vi sparar koden nedan i filen  intervall_med_nollst.m :
% function res = intervall_med_nollst( f, I, tol)
%     a = I( 1 ) ;
%     b = I( 2 ) ;
%     if f(a)*f(b) > 0
%         var = 'Villkor i ändpunkter ej uppfyllt!'
%         disp( var )
%         res = [] % Tomt svar
%     else
%         while b-a > tol
%             m = ( a + b ) / 2 ;
%             if f(a)*f(m) > 0
%                 a = m ;
%             else
%                 b = m ;
%             end
%         res = [ a , b ] ;
%         end
%     end



%

