K2/Bt2 - TMK: Tillämpad matematik (TMA 682) - 2003/2004

Datorstudioövning 1: Piecewise Polynomial Lab

Du startar med att hämta de två filerna PP.fig och PPmod.m från kursens hemsida (enl. instruktionerna). Lägg dessa filer i din hemkatalog. Starta sedan Matlab och skriv
>> open('PP.fig')
. Du får då upp ett GUI (Graphical User Interface) på skärmen.

Börja med att välja en funktion nere i vänstra hörnet. Det finns tre fördefinierade funktioner men du kan också mata in en egen funktion genom att klicka i den vita rutan ovanför menyn choose fcn, mata in din funktion (observera att det skall vara point-wise operationer, t.ex. x.*(1 - x)), och trycka på Return. Den valda funktionen ritas med röd färg i fönstret.

Därefter väljer du max från menyn choose norm. Detta betyder att interpolationsfel (samt högerleden i interpolationsfeluppskattningarna) kommer att beräknas i max-norm. (Det andra alternativet rms, vilket är en förkortning för root mean square, mäter ett medelfel istället för max-fel. Detta återkommer vi till lite längre fram.)

Längst uppe till höger finns två menyer där du kan välja mellan continuous/discontinuous respektive degree 0/degree 1/degree 2. Välj till att börja med continuous och degree 1, vilket motsvarar styckvis linjära, kontinuerliga polynom (detta är default). (Men om du vill kan du förstås också experimentera med andra alternativ: t.ex. styckvis konstanta, diskontinuerliga polynom.)

Klicka nu på knappen create för att skapa en (likformig) mesh, det vill säga en indelning av intervallet i (lika långa) delintervall. Det finns en linjal ovanför denna knapp med vilken du kan ställa in önskat antal delintervall. Default är sex stycken delintervall. Ett styckvis linjärt, kontinuerligt polynom på den mesh du skapat ritas nu med blå färg. Observera att denna funktion inte är en interpolant, utan har mer eller mindre slumpmässigt valda nodvärden.

Genom att klicka på knappen interpolate nere till höger kan du nu skapa en interpolant till din inmatade (röda) funktion.

Notera värdet på interpolationsfelet ||u - v||. Här betecknar u den (röda) funktion du angav och v dess (blå) interpolant i V_h. Notera också värdet på faktorn ||h^2D^2u|| (där h är mesh-funktionen och D^2u betecknar andraderivatan u'') i högerledet av interpolationsfeluppskattningen. Beräkna kvoten ||u-v||/||h^2D^2u|| mellan dem. Jämför med teorin! (Kvoten kan inte vara större än 1/8 enligt interpolationsfeluppskattningen. Å andra sidan bör den inte vara alltför mycket mindre än 1/8: I detta fall skulle vi ju överskatta felet vilket inte heller är bra.)

Klicka på refine mesh (detta fördubblar antalet delintervall) och sedan på interpolate igen. Hur stort är interpolationsfelet nu? Med vilken faktor har det minskat? Stämmer det med teorin?

Repetera nu ovanstående för några olika funktioner.

Tryck på clear för att rensa fönstret, och välj sedan den fördefinierade funktionen 10*x.*exp(-5*x). Välj ånyo max från menyn choose norm, och skapa en mesh med fyra delintervall. Du får dra linjalen ovanför knappen create lite åt vänster innan du klickar på create. Blir det inte rätt första gången är det bara att försöka igen. Vilken är dimensionen på vektorrummet V_h nu när vi har fyra stycken delintervall?

Klicka på interpolate och notera interpolationsfelet (som bör vara något i stil med 0.31869). Frågan är nu: kan du flytta noderna i sidled så att felet blir mindre än 0.1 med fyra delintervall (och styckvis linjär, kontinuerlig interpolant)? Välj alternativet Move nodes i menyn precis under knappen create. Placera musmarkören vertikalt ovanför den nod du vill flytta, ``klicka och dra'' sedan noden dit du vill (i sidled). Klicka på interpolate varje gång du flyttat en nod. Notera hur felet ändras. Tävling: Vem kan få lägst fel? :) Hur skall noderna placeras? Om du vill få tillbaka den likformiga indelningen: klicka på knappen uniform mesh och sedan på interpolate.

Experimentera nu gärna själv en liten stund.

Om du vill kan du som sagt också prova andra typer av styckvisa polynom, t.ex. styckvis konstanta, diskontinuerliga polynom. Kan du empiriskt ta reda på hur interpolationsfeluppskattningen för dessa ser ut? Ledning: Den ser typiskt ut som ||u - v|| <= C ||h^mD^mu|| (där m alltså är lika med 2, och C är lika med 1/8 i fallet med styckvis linjära, kontinuerliga polynom). Välj t.ex. u(x) = sin(pi*x) och bestäm först m genom att notera med vilken faktor felet minskar när du förfinar meshen (t.ex. fördubblar antalet delintervall). Uppskatta sedan interpolationskonstanten C på lämpligt sätt. (Jämför med hur du gjorde ovan för styckvis linjära, kontinuerliga polynom.)

Lycka till!

Tillbaka till kurshemsidan.


Editor: Fredrik Bengzon
Last modified: 2003-09-02