%% 39   Vektorrum av polynom
% Innehåll
% 39.1   Polynom i Matlab
% 39.2   Vektorrummet
% 39.3   Andra baser för
%     39.3.1   Polynom genom givna punkter
%     39.3.2   Partialbråksuppdelning
%% 39.1   Polynom i Matlab
% Ett polynom p(t) i variabeln t\, är ett uttryck (funktion) av formen
% p(t)=c_1\,t^n+c_2\,t^{n-1}+\cdots + c_{n}\,t+c_{n+1}\,\qquad (1)
% där n\, är ett heltal \geq 0 och de reella talen c_1,\,c_2,\,\ldots,\,c_n,\,c_{n+1} är kända tal som kallas polynomets koefficienter. När c_1\not=0\, har polynomet grad n\,. Indexen skiljer sig åt vad som normalt används i matematik. Det brukliga är att skriva
% p(t) = a_n\,t^n+a_{n-1}\,t^{n-1}+\cdots+a_{1}\,t+a_{0},\,
% så att koeffiecenten a_i hör ihop med termen som har grad i\,. I Matlab representeras polynomet i (1) av enbart koefficienterna i form av en radvektor
% p = [ c_1  c_2  ...  c_n  c_(n+1) ]
% så att första koordinaten är koefficienten för  t^n\, där n är  i  length(p)-1 . Det betyder att du först måste veta antalet koordinater i  p   innan du vet vilken potens av variablen som c_1 hör ihop med.
% Säg nu att du vill addera polynomet
% q(t)=d_1\,t^m+d_2\,t^{m-1}+\cdots + d_{m}\,t+d_{m+1}\,
% q = [ d_1  d_2  ...  d_m  d_(m+1) ]
% till p(t)\,. Det betyder att du ska addera vektorerna  q  och  p . Men då måste de ha samma antal koordinater. Du löser det genom att fylla på med inledande nollor i det polynom som är av lägst grad.
% Testa nu att addera polynomen
% \begin{array}{rcl}
% p(t) &=& t^5 -2t^3 +5 t \,,\\
% q(t) &=& t^7 - t^4 + 6t^3 -3t +7
% \end{array}
% med Matlab.



% Säg att du nu istället vill multiplicera polynomen p(t)\, och q(t)\,. Matlab har en lite överranskande term för detta som är "convolve" (sv. falta)
% conv( p , q )
% Testa nu att multiplicera p(t)\, och q(t)\, med Matlab.



% Okej, det gick ju galant. Säg nu att du har ett polynom p(t)\, som är faktoriserat
% p(t) = (t-2)(t+3)^2(4+t+2t^2)\,
% och du vill ha in det i Matlab utan att med handräkning först utveckla faktoriseringen. Med faltning skulle det se ut så här
% conv(conv(conv( [1 -2] , [1 3]), [1 3]) ,[2 1 4])
% Det är både svårläst och besvärligt att mata in. Du hade föredragit nåt i stil med
% poly_mult( [1 -2], [1 3] , [1 3], [2 1 4] )
% så du bestämmer dig för att fixa detta. Din funktion  poly_mult  ska kunna ta emot ett varierande antal polynom. I Matlab finns nyckelordet (variabel arguments in, varierande antal argument in )
% varargin
% som du då har nytta av. När du använder  poly_mult  blir  varargin  en datastruktur som i Matlab kallas cell array. För att komma åt argument i  (input med index i) använder du då
% varargin{ i }
% Nyckelordet ( number of arguments in, antal argument in)
% nargin
% ger dig hur många argument (polynom) du gett  poly_mult . Med detta kan du definiera
%     function res = poly_mult( varargin )
%     res = 1 % Sätter res till 1 och ändrar sedan
%     for i = 1 : nargin
%         res = conv( res , varargin{i} ) ; % Upprepad multiplikation (faltning)
%     end
% i ett script och spara resutlatet som  poly_mult.m  i Matlabs sökväg.
% Testa nu att utveckla
% p(t) = (t-2)(t+3)^2(4+t+2t^2)\,



% Jaha, blev ju ganska OK. Men nu vill du plotta grafen till p(t)\,. Måste du då skriva polynomet som en anonym funktion? Nä, nä! Med komandot  polyval  (polynomial values) kan du beräkna  polynomet  p:s värde i en lista  tv (vektor) av värden på variabeln:
%  polyval( p , tv )
% Testa nu att plotta polynomet p(t)\, på intervallet [-4,\, 3]\,.



% Coolt! Men nu blir du sugen på att hitta nollställena till ett polynom p(t)\,. Du kommer vagt ihåg kommanodt  fzero  med vars hjälp du kan hitta ett nollställe till en funktion i närheten av en punkt. Behöver du använda det för ett polynom också, genom att först ändå skriva det som en anonym funktion? Nä, nä! Du hittar nollställena till ett polynom p  med kommandot
% roots( p )
% I matematik talar man egentligen om rötter til en ekvation och nollställen till en funktion så att nollställena till f(t)\, är rötterna till f(t)=0\,. Så lite lustigt blir kommandot, men  zeros  är ju redan använt till annat.
% Testa nu att bestämma nollställena till polynomet
% p(t)=t^6 +   7t^5   -29t^4  -340t^3  -871t^2  -835t  -525\,.



%
%% 39.2   Vektorrummet \mathbb P_n
% Mängden av polynom \mathbb P är ett delrum till C(\mathbb R)\,. Polynom är definierade på hela \mathbb R och kontinuerliga och tillhör därför C(\mathbb R)\,. Adderar du två polynom får du ett polynom igen och multiplicerar du ett polynom med en skalär blir det igen ett polynom. Mängden \mathbb P är alltså sluten under addition och multiplikation med skalär och därför ett delrum till C(\mathbb R)\,.
% Vektorrummet \mathbb P har oändligt dimension, eftersom polynomen t^n,\,t^{n-1},\,\ldots,\,t^2,\,t,\,1\,är linjärt oberoende för varje icke-negativt heltal n\,. Det fattar du om du försöker hitta vikter c_1,\,c_2,\,\ldots,\, c_n,\,c_{n+1}\, så att
% c_1\,t^n +c_2\,t^{n-1}+\cdots + c_{n-1}\,t^2+c_{n}\,t+c_{n+1}=0
% och kommer ihåg att 0, här betyder nollvektorn  i C(\mathbb R)\,, dvs funktionen som är konstant 0\,.Om nån av vikterna är skild från 0\, står det ett polynom i vänsterledet  som har en grad (inte är nollpolynomet) och ett sånt har högst så många nollställen som graden enligt faktorsatsen. I högra ledet står det en funktion som är 0 i alla reella tal. Alltså är alla vikter 0 och t^n,\,t^{n-1},\,\ldots,\,t^2,\,t,\,1\,är linjärt oberoende.
% Mängden \mathbb P_n\, av alla polynom av grad högst n\, tillsammans med nollpolynomet (som saknar grad) är ett delrum till \mathbb P\, eftersom summan av två såna är av grad högst n\, eller är nolllpolynomet och om du multiplicerar ett sånt polynom med en skalär är det igen av grad högst n\,eller nollpolynomet.
% Polynomen t^n,\,t^{n-1},\,\ldots,\,t^2,\,t,\,1\, liggger i \mathbb P_n och är linjärt oberoende enligt ovan. Deras linjära hölje är hela \mathbb P_n\, eftersom varje polynom är en linjärkombination av dem. Vikter som ska användas är det vi normalt kallar ett polynoms koefficienter. Det betyder att \mathcal S: t^n,\,t^{n-1},\,\ldots,\,t^2,\,t,\,1\,utgör en bas  (standardbasen) för  \mathbb P_n\, som alltså har dimension n+1\,.
%% 39.3   Andra baser för \mathbb P_n
% I tillämpningar vill du  ibland hitta andra baser än standardbasen för \mathbb P_n\, för att lösa problem.
%% 39.3.1   Polynom genom givna punkter
% Tre punkter (x_1,\,y_1),\, (x_2,\,y_2)\,och (x_3,\,y_3)\,med olika x-koordinater ligger på grafen till precis ett polynom q(x)\,i \mathbb P_2\,.Hur beräknar du polynomet?
% Eftersom q(x)\,ligger i \mathbb P_2\, kan det skrivas c_1\cdot x^2+ c_2\cdot x + c_3\cdot 1 = q(x)\,för några vikter c_1,\,c_2,\, c_3\,. Insättning av de tre punkterna leder till ekvationssystemet
% \left\{\begin{array}{rcrcrcr}
% c_1\,x_1^2 & \!+\! & c_2\,x_1&  \!+\! & c_3\cdot1 &\!=\! & y_1 \\
% c_1\,x_2^2 & \!+\! & c_2\,x_2&  \!+\! & c_3\cdot1 &\!=\! & y_2 \\
% c_1\,x_3^2 & \!+\! & c_2\,x_3&  \!+\! & c_3\cdot1 &\!=\! & y_3 \\
% \end{array}
% eller med matriser
% \left(\begin{array}{rrr}
% x_1^2 & x_1 & 1\\
% x_2^2 & x_2 & 1\\
% x_3^2 & x_3 & 1
% \end{array}\right)
% \left(\begin{array}{r}
% c_1 \\ c_2 \\ c_3
% \end{array}\right) =
% \left(\begin{array}{r}
% y_1 \\ y_2 \\ y_3
% \end{array}\right) \,,
% som du kan skriva A\mathbf c = \mathbf y\,. Här vill du se att det är lösbart. Är A alltid inverterbar?
% Du har, när du subtraherar första raden från de övriga, att
% \begin{array}{rcl}
% \mbox{det}\, A &=&
% \left| \begin{array}{rrr}
% x_1^2 & x_1 & 1 \\
% (x_2-x_1)(x_2+x_1) & x_2-x_1 & 0\\
%  (x_3-x_1)(x_3+x_1) & x_3-x_1 & 0
% \end{array}\right|
% =\\
%  & = &
% (x_2-x_1)(x_3-x_1)
% \left| \begin{array}{rrr}
% x_1^2 & x_1 & 1 \\
% x_2+x_1 & 1 & 0\\
%  x_3+x_1 & 1 & 0
% \end{array}\right| = \\
%  &=& (x_2-x_1)(x_3-x_1)(x_2-x_3)
% \end{array}
% som inte är 0 eftersom x-koordinaterna alla är olika. Alltså är A alltid inverterbar, så det finns precis ett polynom av grad 2 som går genom de givna punkterna. Koordinatvektorn för q(x) med avseende på standardbasen \mathcal S är därför
% [q(x)]_\mathcal S = A^{-1}\mathbf y
% Genom att välja en annan bas för \mathbb P_2 kan problemet lösas väsentligen enklare.
% Sätt
% \begin{array}{rcr}
% p_1(x) &=& \frac{(x-x_2)(x-x_3)}{(x_1-x_2)(x_1-x_3) }\\
% p_2(x) &=& \frac{(x-x_1)(x-x_3)}{(x_2-x_1)(x_2-x_3) }\\
% p_3(x) &=& \frac{(x -x_1)(x-x_2)}{(x_3-x_1)(x_3-x_2) }\,.
% \end{array}
% Polyomen är av grad 2 och har egenskapen att
% p_1(x_1) = 1, \quad p_1(x_2)=p_1(x_3) =0\\
% p_2(x_2) = 1, \quad p_2(x_1)=p_2(x_3)=0\\
% p_3(x_3) = 1, \quad p_3(x_1)=p_3(x_2)=0
% Genom att i tur och ordning sätta in x = x_1,\, x_2,\,x_3\, i c_1\,p_1(x)+c_2\,p_2(x)+c_3\,p_3(x)=0 ser du att c_1=c_2=c_3=0, så polynomen är linjärt oberoende och därför en bas \mathcal L\,  för \mathbb P_2\,som ju har dimension 3. (Polynomen p_1,\,p_2,\,p_3\, kallas ibland Lagrange-polynom, där av beteckningen \mathcal L\,.)
% Med denna bas kan du lätt bestämma polynomet som går genom de tre punkterna:
% q(x)=y_1\cdot p_1(x) + y_2\cdot p_2(x) +y_3\cdot p_3(x).
% Koordinatvektorn med avseende på basen \mathcal L\, för ett polynom p(x) i \mathbb P_2 är
% [p(x)]_\mathcal L=\left(\begin{array}{r}p(x_1) \\ p(x_2) \\ p(x_3) \end{array}\right)\,.
% Koordinatvektorn för q(x) med avseende på basen \mathcal L är därför
% ['q(x)]_\mathcal L = \left(\begin{array}{r}y_1 \\ y_2\\y_3\end{array}\right)\,.
% Basbytesmatrisen från basen \mathcal S\, till basen \mathcal L\, ges av
% P_{\mathcal L\gets \mathcal S}=\left(\begin{array}{ccc} [x^2]_\mathcal L & [x]_\mathcal L & [1]_\mathcal L\end{array}\right)=\left(\begin{array}{rrr} x_1^2 & x_1 & 1\\x_2^2 & x_2 & 1\\ x_3^2 & x_3 & 1\end{array}\right)\,
% och från basen \mathcal L\, till \mathcal S\, är den
% P_{\mathcal S\gets \mathcal L}=\left(\begin{array}{ccc} [p_1(x)]_\mathcal S & [p_2(x)]_\mathcal S & [p_3(x)]_\mathcal S\end{array}\right)=\left(\begin{array}{rrr} x_1^2 & x_1 & 1\\x_2^2 & x_2 & 1\\ x_3^2 & x_3 & 1\end{array}\right)^{-1}\,.
% Det betyder att du har att koefficientvektorn för q(x)\, med avseende på standardbasen för \mathbb P_2 är
% [q(x)]_\mathcal S =
% \left(\begin{array}{rrr}
% x_1^2 & x_1 & 1\\
% x_2^2 & x_2 & 1\\
% x_3^2 & x_3 & 1
% \end{array}\right)^{-1}\left(\begin{array}{r}
% y_1 \\ y_2\\y_3
% \end{array}\right)\,.
% I Matlab blir det mer exakt om du i stället löser ut [q(x)]_\mathcal S ur sambandet
% P_{\mathcal L\gets\mathcal S}[q(x)]_\mathcal S = [q(x)]_\mathcal L\,.
% Metoden i exemplet är inte begränsad till polynom av grad högst 2 vars graf går genom 3 givna punkter. Den fungar för att bestämma ett polynom av grad högst n vars graf går genom n+1\, givna punkter med olika första-koordinater. Matrisen P_{\mathcal L\gets\mathcal S}\, ska då har ha kolonner som består av potenserna n till 0\, av de olika x-koordinaterna.
% Uppgift 39.1   Plotta grafen till det polynom q(x) av grad högst 2\, vars graf går genom pukterna (-2,\,3),\, (-1, -4) och (2,\, 5)\,.
% Lösning



%
% Uppgift 39.2   Plotta graferna till de polynom av grad högst 5 som går genom de fem punkterna
% (a)  (-3,\, 1),\, (-2,\, 4),\, (1,\, -3),\, (3,\,0) och (5,\ 4)\,.
% (b)  ( -5,\, 3), (-3,\, -2),\, (0,-1),\,(2,\,3)\, och (4,\,-1)\,.
% Lösning   Neeeej! Då ska jag ju skriva upp en 6\times 6-matris. Jag orkar inte!
% Lugn och fin. Det fixar du lätt!



%
%% 39.3.2   Partialbråksuppdelning
%  Säg att du vill hitta en primitiv funktion till
% \frac{p(t)}{q(t)}\,.
% Om graden av p(t)\, är minst lika stor som graden av q(t)\, kan du göra polynomdivision och kvoten du då får är inget problem att integrera.
% Säg därför att att q(t) har grad n+1 och att p(t)\in \mathbb P_n. Om du uttrycker p(t) i standardbasen har du problem som du hanterar genom att välja en annan bas för \mathbb P_n\,! Vadå? - säger du. Jag brukar köra partialbråksuppdelning. Just det! Men den metoden går ut på att uttrycka p(t)\, i en bas för \mathbb P_n som bestäms av q(t)\,.
% Säg, för att illustrera principen, att q(t)=(1-t)(t-2)^2(1+t^2). Det betyder att n=4\, eftersom q(t) har grad 5\,. Enligt satsen om partialbråksuppdelning kan p(t)/q(t)\,skrivas
% \frac{p(t)}{(1-t)(t-2)^2(1+t^2)}= \frac{c_1}{1-t}+\frac{c_2}{t-2}+\frac{c_3}{(t-2)^2}+\frac{c_4t}{1+t^2}+\frac{c_5}{1+t^2}\,\qquad (1)
% för några konstanter c_1,\,c_2,\,\ldots,\,c_5\,. Du vill göra detta eftersom du vet att
%  \begin{array}{rcl}
%     \int\!\frac{dt}{1-t} &=& -\ln |t-1|\\
%     \int\! \frac{dt}{t-2} &=& \ln |t-2|\\
%     \int\! \frac{dt}{(t-2)^2 &=& -\frac{1}{t-2}\\
%     \int\! \frac{t}{1+t^2}\,dt &=& \frac12 \ln (1+t^2)\\
%     \int\! \frac{1}{1+t^2}\,dt &=& \arctan t
%   \end{array}
% Skriver du högerledet i (1) på gemensamt bråk blir täljaren monumental:
% c_1(t-2)^2(1+t^2)+c_2(1-t)(t-2)(1+t^2)+c_3(1-t)(1+t^2)+\\
% +c_4\,t(1-t)(t-2)^2+c_5(1-t)(t-2)^2\,.
% För att bringa ordning i detta sätter du
%   \begin{array}{rcl}
%     q_1(t) & = & (t-2)^2(1+t^2)\\
%     q_2(t) & = & (1-t)(t-2)(1+t^2) \\
%     q_3(t) & = & (1-t)(1+t^2)\\
%     q_4(t) & = & t(1-t)(t-2)^2 \\
%     q_5(t) & = & (1-t)(t-2)^2
%   \end{array}
% så att täljaren är
% p(t) = c_1\,q_1(t) +c_2\,q_2(t)+c_3\,q_3(t)+c_4\,q_4(t)+c_5\,q_5(t)\,.
% Här har du fem polynom i \mathbb P_4\,, som har dimension 5\,. Om de spänner \mathbb P_4 utgör de därför en bas \mathcal Q\, för \mathbb P_4\,.
% Från satsen om partialbråksuppdelning vet du att varje polynom av grad högst 4\, kan skrivas som en linjärkombination av av dessa fem polynom, eftersom (1) alltid är lösbart. Det betyder att de fem polynomen utgör en bas för \mathbb P_4\,.
% Ett sätt att se på partialbråksuppdelning är därför att det gäller att hitta ett polynoms koefficenter med avseende på denna bas. Normalt använder du basen \mathcal S:t^4,\,t^3,\,t^2,\,t,\,1\,\, när du skriver ett polynom av grad 4\,, men nu vill du skriva om det med koordinater (vikter, konstanter) i basen \mathcal Q: q_1,\,q_2,\,q_3,\,q_4,\,q_5\,. Enklast är att först bestämma koordinatbytesmatrisen från basen \mathcal Q till basen \mathcal S\,, eftersom du får de vanliga koefficienterna (med avseende på basen \mathcal S) genom utveckling:
% P_{\mathcal S\gets \mathcal Q}=
% \left(\begin{array}{rrrrr}
% [p_1]_\mathcal S & [p_2]_\mathcal S & [p_3]_\mathcal S & [p_4]_\mathcal S & [p_5]_\mathcal S
%  \end{array}\right)\,.
% Koefficienterna för p(t)\, med avseende på basen \mathcal C\, får du sen genom
% [p(t)]_\mathcal Q = P_{\mathcal Q\gets\mathcal S}[p(t)]_\mathcal S= P_{\mathcal S\gets\mathcal Q}^{-1}[p(t)]_\mathcal S\,
% eller i Matlab hellre genom att lösa ut [p(t)]_\mathcal Q\, i
% P_{\mathcal S\gets\mathcal Q}[p(t)]_\mathcal Q=[p(t)]_\mathcal S
% Här är [p(t)]_\mathcal S\, de "vanliga" koefficienterna i polynomet p(t)\, medan [p(t)]_\mathcal Q\, innehåller de konstanter du ska ha i partialbråksuppdelningen
% \frac{p(t)}{(1-t)(t-2)^2(1+t^2)}= \frac{c_1}{1-t}+\frac{c_2}{t-2}+\frac{c_3}{(t-2)^2}+\frac{c_4t}{1+t^2}+\frac{c_5}{1+t^2}\,.
% Uppgift 39.3    Beräkna
% (a)
% \int\! \frac{-t^4+7t^3-26t^2+26t-8}{(1-t)(t-2)^2(1+t^2)}\,dt
% (b)
% \int\! \frac{t^4-3t^3-10t^2+18t-8}{(1-t)(t-2)^2(1+t^2)}\,dt
% Lösning   Sätt nämnaren till  q(t) =(1-t)(t-2)^2(1+t^2)\,.
% När täljaren har grad högst 4\, finns det ingen anledning att göra polynom division.



%
%