Polynomanpassningsprogram



Relevanta dokument
Polynomanpassningsprogram

Kurvanpassning. Kurvanpassning jfr lab. Kurvanpassning jfr lab

Interpolation Modellfunktioner som satisfierar givna punkter

Mer om texter i MATLAB och om iterativ lösning av linjära ekvationssystem

a = a a a a a a ± ± ± ±500

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 14:e januari klockan

1.1 MATLABs kommandon för matriser

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Introduktion till MATLAB

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 26 november 2015 Sida 1 / 28

8.5 Minstakvadratmetoden

Moment Viktiga exempel Övningsuppgifter

TAIU07 Matematiska beräkningar med Matlab

Föreläsning 5. Approximationsteori

MATLAB the Matrix Laboratory. Introduktion till MATLAB. Martin Nilsson. Enkel användning: Variabler i MATLAB. utvecklat av MathWorks, Inc.

Laboration 5: Regressionsanalys. 1 Förberedelseuppgifter. 2 Enkel linjär regression DATORLABORATION 5 MATEMATISK STATISTIK FÖR I, FMS 012, HT-08

TANA17 Matematiska beräkningar med Matlab

Idiotens guide till. Håkan Lyckeborgs SPSS-föreläsning 4/ Av: Markus Ederwall, 21488

Laboration 4: Lineär regression

FK2005 Datorövning 3

x 2 x 1 W 24 november, 2016, Föreläsning 20 Tillämpad linjär algebra Innehåll: Projektionssatsen Minsta-kvadratmetoden

Vane-Log. Loggningsprogram för Geotechs El-vinginstrument. Ingenjörsfirman Geotech AB Datavägen ASKIM (Göteborg)

Determinanter, egenvectorer, egenvärden.

Minimanual CASIO fx-9750gii

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 9p av totalt 20p Hjälpmedel: MATLAB

Lägg märke till skillnaden, man ser det tydligare om man ritar kurvorna.

DN1212/numpm Numeriska metoder och grundläggande programmering Laboration 1 Introduktion

Moment 1.15, 2.1, 2.4 Viktiga exempel 2.2, 2.3, 2.4 Övningsuppgifter Ö2.2ab, Ö2.3. Polynomekvationer. p 2 (x) = x 7 +1.

Minstakvadratmetoden

TANA17 Matematiska beräkningar med Matlab

f(x) = x 2 g(x) = x3 100

Laboration Fuzzy Logic

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Hjälpmedel: MATLAB

Laboration: Grunderna i MATLAB

TAIU07 Matematiska beräkningar med Matlab

Inledning till OpenOffice Calculator Datorlära 2 FK2005

Minsta-kvadratmetoden

Rapportexempel, Datorer och datoranvändning

f(x) = x 2 g(x) = x3 100 h(x) = x 4 x x 2 x 3 100

Variabler. TANA81: Beräkningar med Matlab. Matriser. I Matlab skapas en variabel genom att man anger dess namn och ger den ett värde:

Numeriska metoder och grundläggande programmering för T1

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

TANA17 Matematiska beräkningar med MATLAB för M, DPU. Fredrik Berntsson, Linköpings Universitet. 9 november 2015 Sida 1 / 28

DN1212/numpp Numeriska metoder och grundläggande programmering Laboration 1 Introduktion

9 Skissa grafer. 9.1 Dagens Teori

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

OH till Föreläsning 5, Numme K2, Läsa mellan raderna. Allmän polynom-interpolation, S Ch 3.1.0

NUMPROG, 2D1212, vt Föreläsning 1, Numme-delen. Linjära ekvationssystem Interpolation, Minstakvadratmetoden

Matriser. En m n-matris A har följande form. Vi skriver också A = (a ij ) m n. m n kallas för A:s storlek. 0 1, 0 0. Exempel 1

November 6, { b1 = k a

Moment 5.5 Övningsuppgifter I 5.60a. 5.60b, 5.60.c, 61

SF1624 Algebra och geometri Tentamen Onsdagen 29 oktober, 2014

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 18:e augusti klockan

MMA132: Laboration 1 & 2 Introduktion till MATLAB

Datorövning 1 Calc i OpenOffice 1

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Räknarinstruktioner för CASIO FX-9750GII till Matematik Origo 3b

15 februari 2016 Sida 1 / 32

Grafisk Teknik. Rastrering. Övningar med lösningar/svar. Sasan Gooran (HT 2013)

Numeriska metoder och grundläggande programmering för P1 och T1

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

Frågorna 1 till 6 ska svaras med sant eller falskt och ger vardera 1

SF1624 Algebra och geometri Lösningsförslag till tentamen Lördagen den 5 juni, 2010 DEL A

% Föreläsning 3 10/2. clear hold off. % Vi börjar med att titta på kommandot A\Y som löser AX=Y

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A

Dagens föreläsning (F15)

MMA132: Laboration 1 Introduktion till MATLAB

5 Om f (r) = 0 kan andraderivatan inte avgöra vilken typ av extrempunkt det handlar om. Återstår att avgöra punktens typ med teckenstudium.

Ekvationer och olikheter

SF1624 Algebra och geometri Lösningsförslag till tentamen DEL A

Algoritmer, datastrukturer och komplexitet

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 13:e januari klockan

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Polynomekvationer. p 2 (x) = x x 3 +2x 10 = 0

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Tentamen i Programmering

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 21:a April klockan

Dagens tema är exponentialfunktioner. Egentligen inga nyheter, snarare repetition. Vi vet att alla exponentialfunktioner.

Varning!!! Varning!!!

Syftet med den här laborationen är att du skall bli mer förtrogen med det i praktiken kanske viktigaste området inom kursen nämligen

Denna föreläsning. DN1212 Numeriska metoder och grundläggande programmering FN Felfortplantning och kondition

Algoritmer, datastrukturer och komplexitet

Mäta rakhet Scanning med M7005

Diagramritning med Excel och figurritning med Word

TMV166 Linjär Algebra för M. Tentamen

Datainsamling över Internet

3 Man kan derivera i Matlab genom att approximera derivator med differenskvoter. Funktionen cosinus deriveras för x-värdena på följande sätt.

Introduktion till Word och Excel. 14 september 2008

Matriser och vektorer i Matlab

Matematik 3 Digitala övningar med TI-82 Stats, TI-84 Plus och TI-Nspire CAS

MA2004 Tillämpad Matematik II, 7.5hp,

ASYMPTOT. Horisontal (lodrät) Vertikal (vågrät) Sned och Hål

Lite om räkning med rationella uttryck, 23/10

Numeriska metoder och grundläggande programmering för P1

2 Matrisfaktorisering och lösning till ekvationssystem

Lösningar tentamen i kurs 2D1210,

Subtraktion. Räkneregler

TANA09 Föreläsning 5. Matrisnormer. Störningsteori för Linjära ekvationssystem. Linjära ekvationssystem

LAB 3. INTERPOLATION. 1 Inledning. 2 Interpolation med polynom. 3 Splineinterpolation. 1.1 Innehåll. 3.1 Problembeskrivning

Transkript:

Polynomanpassningsprogram Den här uppgiften skall göra en polynomanpassning av en tvåkolumners tabell enligt minstakvadrat kriteriet och presentera resultatet grafiskt. Uppgiftens tygndpunkt ligger på hanteringen av den grafiska presentationen. I ditt program skall man kunna välja datafil. Det gör man genom att lägga in klassen OpenDialog som ligger i klassbiblioteket Dialogs. Låt filtypen vara *.txt men möjliggör även att browsa efter filtypen *.* I uppgifterna kryptering och koppla till annat program... finns i detalj beskrivet hur man använder OpenDialogen. När man har valt datafil skall knappen Editera aktiveras. Genom att klicka på den knappen skall Window s inbyggda editor Notepad startas och den valda datafilen öppnas. Man skall då kunna skriva in sin tvåkolumners tabell och spara den. Vidare skall det finnas möjlighet att välja gradtalet hos polynomet. Det skall man välja med en ComboBox och valen skall vara heltalen från noll till sex. När fil och gradtal är valt skall knappen Poly Fit aktiveras. Klickar man på den skall programmet öppna datafilen och läsa in tvåkolumners tabellen och visa hur många datapunkter den innehöll. Därefter skall programmet göra en minstakvadratanpassning av talen till ett polynom av det valda gradtalet. De framräknade koefficienterna i polynomet samt RMS (Root Mean Square) skall visas i ett RichEdit-fönster, som finns i klassbiblioteket Win32 respektive i ett Edit-fönster som finns i Standardbiblioteket. För att visa grafiskt hur anpassningen gick skall ditt program innehålla två diagram. Använd dig av klassen Chart som ligger i klassbiblioteket Additional. Denna klass har väldigt många egenskaper så för Chart kan man öppna en Objektinspektor genom att dubbelklicka i diagrammet. En kurva i ett diagram kallas för Series. Det vänstra diagrammet skall innehålla två Series: primärdata som skall visas som points och en line som visar det framräknade polynomet. Varje datapunkt i datafilen skall alltså visas som en röd rektangel och polynomet visas som en sammanhängande linje. Per Nylén - 25 november 2003 1(5)

I det högra diagrammet skall felen mellan datapunkterna och det värde som polynomet ger, visas i form av ett stapeldiagram, Bar. Sätt också ut titlar på diagrammen. Felen mellan datapunkterna och polynomet brukar kallas för residuals, dvs. restfel. Själva polynomanpassningen kräver en del räknande. Enklast uttrycker man det på matrisformalism. Vi ställer upp ekvationssystemet Y = X * A (1) där Y är vektorn y 1,y 2,y 3 osv., A är den obekanta vektorn som bildas av koefficienterna A 0, A 1,A 2 osv i polynomet, och X är den matris som bildas av x-värdenas potenser upp till j polynomets gradtal, dvs: x ij =x i där i=1..n och j=0..p, där n är antalet datapunkter och p är polynomets gradtal. För att lösa equ.1 förlänger man ekvation 1. med matrisen X s transponat ( X T ) och får då X T *Y = X T *X*A (2) Detta kallas för normalekvationerna och är p+1 ekvationer i p+1 obekanta. Den kan alltså ha en exakt lösning. Lösningen får man genom att förlänga med inversen till den kvadratiska matrisen X T *X, dvs: (X T *X) -1 *X T *Y = A (3) Har man tillgång till matrisoperationer behövs således bara lite matrismultiplikationer och en invertering. Man kan också lösa problemet med vanligt räknande, enligt följande recept: Börja med att öppna datafilen och läsa in mätvärdena till två arrayer X och Y. N:=1; While not EOF(Fil) do Readln(Fil, X[N], Y[N] ); if IOResult=0 then N:=N+1; Antal:=N-1; där X och Y är två arrayer [1..50] av typen Extended. Jag har begränsat antalet datapar till 50. För att minimera avrundningsfelen i beräkningarna utnyttjar jag processorn maximalt genom att använda datatypen Extended som representerar ett tal på potensform i 80 bitar. När du är klar med inläsningen skall du stänga filen. Vi kommer att behöva veta intervallet hos X-värdena, därför bestämmer du X max och X min med satserna: Xmin:=X[1]; Xmax:=X[1]; for j:=1 to Antal do Per Nylén - 25 november 2003 2(5)

if Xmin>X[j] then Xmin:=X[j]; if Xmax<X[j] then Xmax:=X[j]; Nu är det dags att formulera normalekvationerna. Det gör du med satserna: Gradtal := boxorder.itemindex; //Hämta gradtalet For j:=0 to Gradtal do // Sätt upp normalekvationerna for i:=1 to Antal do begin Z[i]:=Y[i]*Power(X[i],j); for k:=0 to Gradtal do B[i,k]:=Power(X[i], j+k); end; R[j]:=0; for i:= 1 to Antal do R[j]:=R[j]+Z[i]; for i:=0 to Gradtal do M[j,i]:=0; for i:=0 to Gradtal do for k:=1 to Antal do M[j,i]:=M[j,i]+B[k,i]; där Z är en array [1..50] av Extended, B är en array [1..50, 0..6] av Extended, R är en array [0..6] av Extended och slutligen M är en array [0..6, 0..6] av typen Extended som slutligen innehåller koefficienterna i normalekvationerna. Slutligen skall vi lösa normalekvationerna och beräkna koefficienterna. Det gör vi med s.k. Gauss-elimination och återsubstitution. For i:=0 to Gradtal-1 do // Gausselimination for j:=i+1 to Gradtal do begin F:=M[j,i]/M[i,i]; R[j]:=R[j]-R[i]*F; for k:=i to Gradtal do M[j,k]:=M[j,k]-M[i,k]*F; end; For i:=0 to 6 do A[i]:=0; For i:= Gradtal downto 0 do // Beräkna koefficienterna A[i]:=R[i]/M[i,i]; for j:=i-1 downto 0 do R[j]:=R[j]-M[j,i]*A[i]; Vi har nu koefficienterna liggande i A[0] till A[Gradtal] och kan skriva ut dem i Koefficientfönstret. Jag använder mig av klassen RichEdit som ligger i klassbiblioteket Win32. För att få utskriften snygg bör du använda funktionen FloatToStrF som ger möjlighet till formatterad utskrift. Dessutom kollar jag om talet är positivt eller negativt. Per Nylén - 25 november 2003 3(5)

reresult.text:=''; for i := 0 to Gradtal do if A[i]<0 then TalText:=': ' +FloatToStrF(A[i], ffexponent, 4,2) else TalText:=': '+FloatToStrF(A[i], ffexponent, 4,2); reresult.text:=reresult.text+' '+IntToStr(i)+TalText + #10; Nu skall du också presentera resultatet i de två diagrammen. I det vänstra diagrammet visas primärdata som punkter och det återberäknade polynomet som en kurva. Det vänstra diagrammet innehåller alltså två Series, där det första är av typen point och det andra av typen line. För att rita en kurva i ett diagram, börjar du med att radera den med satsen Series1.Clear; Därefter ritar du kurvan genom att anropa seriens metod AddXY for i:=1 to Antal do Series1.AddXY( X[i], Y[i],'', clred); På liknande sätt ritar du det återberäknade polynomet som en linje. För att få en snygg kurva har jag valt att rita kurvan med 10 gånger fler punkter än mina primärdata, och jag ritar den från X min till X max, som jag har beräknat tidigare. Series2.Clear; for i:=0 to Antal*10 do XX:=Xmin +(Xmax-Xmin)*i/(Antal*10); Series2.AddXY( XX, Poly(XX, A), '', clnavy); För att kunna studera detaljer i det här diagrammet vill jag att man skall kunna zooma in ett område och kunna gå tillbaka till den ursprungliga grafen. Zoomningen ställer du in i diagrammets General-flik, och för att gå tillbaka till den ursprungliga grafen när man klickar i grafen anropar man metoden: Chart1.UndoZoom; I det högra diagrammet skall du visa felet i varje mätpunkt, dvs skillnaden mellan primärdatas Y-värde och det värde som polynomet ger om man sätter in motsvarande X-värde. Samtidigt som du räknar ut felen (residualerna) passar du på att beräkna felkvadratsumman och därur RMS (Root Mean Square). RMS:=0; For i:=1 to Antal do Err[i]:=Y[i]-Poly(X[i], A); RMS:=RMS+SQR(Err[i]); // Err := Obs - Calc Per Nylén - 25 november 2003 4(5)

if Antal>Gradtal then RMS:=SQRT(RMS/(Antal-Gradtal)) else RMS:=0; Om ekvationssystemet inte är överbestämt utan antalet ekvationer är lika med antalet obekanta får jag en exakt lösning och RMS=0. Jag skulle då dividera med noll när jag beräknar RMS. Därför gör jag en särskild koll av det. De beräknade residualerna skall jag nu visa som ett stapeldiagram (bar graph) i det högra diagrammet. Series3.Clear; for i:=1 to Antal do Series3.AddXY( X[i], Err[i], '', clred); Slutligen kan jag skriva ut värdet på RMS och antalet datapunkter i respektive fönster: wrms.text:=' '+FloatToStrF(RMS, ffexponent, 4,2); wpoints.text:=' '+IntToStr(Antal); Avsluta med att provköra programmet på en känd datamängd, t.ex. heltalen och deras kvadrater. Per Nylén - 25 november 2003 5(5)