Kf1 - Differentialekvationer och tekniska beräkningar del A, TMA 225 - 2003

Datorstudioövning 1: Piecewise Polynomial Lab

Du startar PP Lab inifrån Matlab genom att först skriva >> setmatlabpath (för att komplettera Matlab's path), följt av >> 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.) Tips: Det är just dessa bägge storheter som du skall beräkna för hand på en enkel mesh med tre delintervall, och med u(x) = x^2 respektive u(x) = sin(pi*x), i Uppgift 5 på denna veckas Räkneuppgifter. Du kan alltså använda PP Lab för att kontrollera dina svar! I denna uppgift är meshen inte likformig men vi skall se längre ned hur man kan flytta noder.

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.

En annan sak du kan experimentera med är alternativet change values som finns i samma meny som Move nodes. När du valt detta alternativ kan du modifiera det styckvisa polynomet (det behöver inte vara en interpolant) precis som ovan genom att ``klicka och dra'' (nu i vertikalled). Du kan ändra värdet på vikten/komponenten för en basfunktion i taget. Prova om du på detta sätt kan minska felet ytterliggare i fallet ovan med fyra delintervall. Notera att den gröna linjen visar aktuell basfunktion (gånger sin vikt/komponent). Vilken del av det styckvisa polynomet (den blå linjen) ändras när du ändrar vikten/komponenten för en viss basfunktion? Du kan också se hur den analytiska formeln för det styckvisa polynomet ändras i textraden ovanför fönstret. Tänk noga igenom hur det styckvisa polynomet är uppbyggt som en summa av viktade basfunktioner, d.v.s. som en linjärkombination av basfunktionerna.

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: Georgios Foufas
Last modified: 2003-03-12