Om plotting. Knut Mørken. 31. oktober 2003

Like dokumenter
Kanter, kanter, mange mangekanter. Introduksjon: Steg 1: Enkle firkanter. Sjekkliste. Skrevet av: Sigmund Hansen

MAT-INF 1100: Obligatorisk oppgave 1

i=0 Repetisjon: arrayer Forelesning inf Java 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker 0*0 0*2 0*3 0*1 0*4

Forelesning inf Java 4

1. Finn egenverdiene og egenvektorene til matrisen A = 2 1 A =

INF1000 : Forelesning 4

i=0 i=1 Repetisjon: nesting av løkker INF1000 : Forelesning 4 Repetisjon: nesting av løkker Repetisjon: nesting av løkker j=0 j=1 j=2 j=3 j=4

Løsningsforslag MAT102 Vår 2018

Matlab-tips til Oppgave 2

MAT-INF 1100: Obligatorisk oppgave 1

Kanter, kanter, mange mangekanter

UNIVERSITETET I OSLO

MAT 1110: Obligatorisk oppgave 1, V-07: Løsningsforslag

Texas Instruments TI-84

Obligatorisk oppgave 1

Kodetime for Nordstrand barneskole

INF1000 (Uke 5) Mer om løkker, arrayer og metoder

2 Om statiske variable/konstanter og statiske metoder.

Rungekuttametodene løser initialverdiproblemer på formen y' = F x, y, y x 0

MAT-INF 2360: Obligatorisk oppgave 3. Løsningsforslag

INF Uke 10. Ukesoppgaver oktober 2012

Inf109 Programmering for realister Uke 5. I denne leksjonen skal vi se på hvordan vi kan lage våre egne vinduer og hvordan vi bruker disse.

Newtons metode er en iterativ metode. Det vil si, vi lager en funksjon. F x = x K f x f' x. , x 2

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000

SALG > KOSTNAD når mer enn 100 produkt selges. Virksomheten går da med overskudd.

Øvingsforelesning i Matlab TDT4105

Seminaroppgaver IN1010, uke 2

Øvingsforelesning i Matlab TDT4105

TMA4122/TMA4130 Matematikk 4M/4N Høsten 2010

Løpende strekmann Erfaren Videregående Python PDF

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 h2006

Forkurs INF1010. Dag 2. Andreas Færøvig Olsen Tuva Kristine Thoresen

Hva er verdien til variabelen j etter at følgende kode er utført? int i, j; i = 5; j = 10; while ( i < j ) { i = i + 2; j = j - 1; }

Tips til arbeidet med obligatorisk oppgave 2 i MAT-INF 1100 høsten 2004

TDT4105 IT Grunnkurs Høst 2014

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2008

Oblig2 - obligatorisk oppgave nr. 2 (av 4) i INF1000 v2009

Biseksjonsmetoden. biseksjonsmetode. Den første og enkleste iterativ metode for ikke lineære likninger er den så kalt

Del 2: Alle hjelpemidler er tillatt, med unntak av Internett og andre verktøy som tillater kommunikasjon.

UNIVERSITETET I OSLO

a) f(x) = 3 cos(2x 1) + 12 LF: Vi benytter (lineær) kjerneregel og får f (x) = (sin(7x + 1)) (sin( x) + x) sin(7x + 1)(sin( x) + x) ( sin(x) + x) 2 =

Repetisjon: operatorene ++ og -- Java 5. Nøtt. Oppgave 1 (fra forrige gang) 0 udefinert udefinert. Alternativ 1 Prefiks-operator

Oversikt. INF1000 Uke 1 time 2. Repetisjon - Introduksjon. Repetisjon - Program

Øgrim Bakken Pettersen Skrindo Dypbukt Mustaparta Thorstensen Thorstensen. Digitalt verktøy for Sigma 2P. Casio fx-9860

UNIVERSITETET I OSLO

LITT OM OPPLEGGET. INF1000 EKSTRATILBUD Stoff fra uke September 2012 Siri Moe Jensen EKSEMPLER

INF1000: noen avsluttende ord

Det du skal gjøre i denne oppgava er først å sette opp bakgrunnen til spillet og så rett og slett å få firkanter til å falle over skjermen.

Øgrim Bakken Pettersen Skrindo Dypbukt Mustaparta Thorstensen Thorstensen. Digitalt verktøy for Sigma R1. Casio fx-9860

GeoGebraøvelser i geometri

Del 2: Alle hjelpemidler er tillatt, med unntak av Internett og andre verktøy som tillater kommunikasjon.

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF1000 Behandling av tekster

Tetris. Introduksjon. Skrevet av: Kine Gjerstad Eide. Lag starten på ditt eget tetris spill!

Litt om Javas håndtering av tall MAT-INF 1100 høsten 2004

Oblig 4 (av 4) INF1000, høsten 2012 Værdata, leveres innen 9. nov. kl

I et Java-program må programmøren lage og starte hver tråd som programmet bruker. Er dette korrekt? Velg ett alternativ

Fasit til eksamen i emnet MAT102 - Brukerkurs i matematikk II Mandag 21.september 2015

Praktisk informasjon. Repetisjon: While-løkker. I dag. INF1000 (Uke 5) Mer om løkker, arrayer og metoder. Oblig 2 er lagt ut

EKSAMEN 6108/6108N PROGRAMMERING I JAVA Alt trykt og skriftlig materiale.

Bruk en startverdi på 1:

INF1000. Marit Nybakken 10. februar 2004

Matematikk Øvingsoppgaver i numerikk leksjon 7 Løsningsforslag

Her skal du lære å programmere micro:biten slik at du kan spille stein, saks, papir med den eller mot den.

Algoritmer og datastrukturer Kapittel 2 - Delkapittel 2.1

løsningsforslag-uke5.txt

MAT-INF 2360: Obligatorisk oppgave 3

INF1000: Forelesning 7

TMA4100 Matematikk 1, høst 2013

Litt mer om uttrykk: ++ og -- INF1000 : Forelesning 4. Oppgave. Blokker. 0 udefinert udefinert. Alternativ 2 Postfiks-operator

Lineær optimering. Innhold. Lineær optimering S1

Matematikk Øvingsoppgaver i numerikk leksjon 4 m-ler

Obligatorisk oppgave 1 INF1020 h2005

Dagens tema: 12 gode råd for en kompilatorskriver

Sprettende ball. Introduksjon: Steg 1: Vindu. Sjekkliste. Skrevet av: Sigmund Hansen

: subs x = 2, f n x end do

INF1000: Forelesning 4. Mer om arrayer Metoder

Funksjoner 1T, Prøve 1 løsning

MER OM ARRAYER. INF1000: Forelesning 4. Anta at vi ønsker å lagre en liste med navnene på alle INF1000-studentene:

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Programmering i Java med eksempler

Projeksjoner av vektorer Analyse av værdata

Del 2: Alle hjelpemidler er tillatt, med unntak av Internett og andre verktøy som tillater kommunikasjon.

SINUS R1, kapittel 5-8

Fra Python til Java, del 2

Praktisk informasjon. I dag. Repetisjon: While-løkker. INF1000 (Uke 5) Mer om løkker, arrayer og metoder

På tide med et nytt spill! I dag skal vi lage tre på rad, hvor spillerne etter tur merker ruter med X eller O inntil en av spillerne får tre på rad.

EKSAMEN Løsningsforslag

Texas Instruments TI-84

TMA4100 Matematikk 1, høst 2013

MAT-INF 1100: Obligatorisk oppgave 1

TDT4110 IT Grunnkurs Høst 2012

Følgende «tommelfinger-regler» bør (må) følges:

HØGSKOLEN I SØR-TRØNDELAG Avdeling for informatikk og e-læring AITeL

Kort repetisjon av doble (nestede) løkker Mer om 1D-arrayer Introduksjon til 2D-arrayer Metoder

INF1000: Forelesning 7. Konstruktører Static

Introduksjon og installasjon Tegninger i motsetning til geometriske konstruksjoner

Transkript:

Om plotting Knut Mørken 31. oktober 2003 1 Innledning Dette lille notatet tar for seg primitiv plotting av funksjoner og visualisering av Newtons metode ved hjelp av Java-klassen PlotDisplayer. Merk at denne klassen ikke på noen måte tar mål av seg å være hverken robust eller avansert, men den lar deg iallefall lage enkle plott. 2 Generering av plottepunkter Vi skal først ta for oss plotting av en funksjon. Vi tenker oss at vi har gitt en funksjon f definert på et intervall [a, b], og vi ønsker å lage en grafisk framstilling av funksjonen i for eksempel Java. For å få fram et plott i et vindu på skjermen trenger vi først å tenke over dette fra et matematisk synspunkt før vi så oversetter matematikken til Java-kode. Når vi skal plotte en funksjon er alt vi gjør å trekke rette linjestykker mellom punkter som ligger på grafen til f. Matematisk sett er derfor den grunnleggende utfordringen å beregne et passende sett med punkter på grafen til f slik at vi får et godt bilde av funksjonen. For å gjøre dette kan vi velge mellom to ulike strategier. Den ene er å forsøke å være intelligent og plassere plottepunktene slik at vi ikke trenger så mange punkter, den andre er å plassere et større antall punkter jevnt utover intervallet [a, b]. Mathematica bruker den første strategien og forsøker å generere plottepunkter slik at vinkelen mellom et linjesegment og det neste alltid er mindre enn en toleranse som brukeren kan kontrollere, se figur 1. Ulempen med denne framgangsmåten er at algoritmen for å finne gode plottepunkter ikke er helt enkel. Vi vil derfor bruke den andre framgangsmåten og fordele et fast antall punkter jevnt utover plotteområdet. La oss kalle antallet plottpunkter vi skal bruke k (dette tallet må enten leses inn eller velges på forhånd). Oppgaven vår går da ut på å fordele disse punktene jevnt i intervallet [a, b]. Det er da rimelig å velge første punkt som a og siste som b og så fordele de k 2 resterende jevnt i det indre av intervallet. Dette betyr at vi skal dele opp [a, b] i k 1 delintervallter som dermed vil ha bredde h = (b a)/(k 1). De k punktene vil da være x 0 = a, x 1 = a+h, x 2 = a+2h, og 1

2 1 2 1 2 1 1 2 1 2 2 1 1 2 1 2 (a) (b) Figur 1. Plot av polynomet f(x) = x 2 2 i (a) og punktene som er brukt (b). generelt x i = a + i h for i = 0, 1,..., k 1. For hver slik x-verdi vil vi så beregne en funksjonsverdi som vi også tar vare på. Med pseudokode kan dette uttrykkes som h = (b-a)/(k-1); for (i=0; i<k; i++) x[i] = a + i*h; y[i] = f(x[i]); Etter at denne kodebiten er utført vil de to arrayene x og y av lengde k inneholde koordinatene til de k plottepunktene. For å få tegnet opp grafen trenger vi nå bare å tegne rette linjer mellom disse punktene. Før vi ser hvordan vi kan gjøre dette skal vi se på en litt annen (og dårligere) måte å organisere genereringen av plottepunktene på. 2.1 En alternativ metode for å generere plottepunkter På forelesning 28/10 viste jeg en annen, men ekvivalent måte å generere plottepunktene på. Utgangspunktet er at vi uansett trenger en løkke som genererer alle heltallene i intervallet [0, k 1] siden dette er indeksene vi bruker som addresser inn i arrayene våre. Dette gir k tall jevnt fordelt i intervallet [0, k 1], mens vi trenger k punkter jevnt fordelt i intervallet [a, b]. Hvis vi lager en lineær funksjon som avbilder intervallet [0, k 1] på intervallet [a, b] vil vi få til dette, se figur 2. Denne funksjonen er på formen p 1 (x) = c 0 + c 1 x med to frie parametre, og vi kan derfor legge på de to betingelsene p 1 (0) = a og p 1 (k 1) = b. Dette gir p 1 (x) = a + x(b a)/(k 1). Vi kan dermed generere plottepunktene ved å beregne x i = a + i(b a)/(k 1), for i = 0, 1,..., k 1. 2

b a 0 k 1 Figur 2. Den rette linja p 1 (x) = a+x(b a)/(k 1) og avbildning av jevnt fordelte punkter i intervallet [0, k 1] over på intervallet [a, b]. Siden h = (b a)/(k 1) gjenkjenner vi dette som en annen versjon av beregningene vi gjorde over. 3 Tegning av linjene i Java Når punktene som definerer linjestykkene i plottet er beregnet, gjenstår det bare å tegne ut linjestykkene. For å gjøre dette i Java må vi først definere et vindu av passende størrelse og fortelle hvilket utsnitt av koordinatsystemet vi ønsker å vise fram i vinduet. Hvis vi bruker klassen PlotDisplayer (som du finner på hjemmesida til MAT-INF 1100) får vi et primitivt verktøy for å gjøre dette. Pass på at fila der denne klassen er lagret ligger på det samme området som plotteprogrammet ditt. Vi kan da definere plottevinduet ved å si plot = new PlotDisplayer(width, height, xmin, ymin, xmax, ymax, xgrid, ygrid, windowname); Her er width og height variable av typen int som angir bredden og høyden av vinduet i piksler, mens xmin, ymin, xmax og ymax er double-variable som angir henholdsvis nedre venstre og øvre høyre hjørne av det utsnittet av planet som vi ønsker å vise fram i plottet vårt. Hvis vi tar som eksempel at vi skal plotte funksjonen f(x) = x 2 2 på intervallet [ 2, 2] så vil vi sette xmin=-2 og xmax=2. Vi ser også at på dette intervallet vil verdiene til f(x) også variere i intervallet [ 2, 2], så det er fornuftig å bruke ymin=-2 og ymax=2. Variablene xgrid og ygrid 3

angir hvor ofte vi skal sette merker på aksene mens navnet som kommer øverst i rammen på vinduet er gitt i String-variabelen windowname. Med kallet over får vi definert et PlotDisplayer-vindu som vi kan plotte i og som er lagret i variabelen plot. I dette vinduet kan vi så tegne ut linjene våre. Men før vi gjør det kan vi be om å få tall på aksene våre ved å si plot.setdrawnumbers(true,java.awt.color.black); Når dette er gjort kan vi tegne ut linjene med kallet plot.addplot(x, y, java.awt.color.red, "eksempel"); Dette vil føre til at alle punktene som ligger i variablene x og y vil bli tegnet ut forbundet med rette linjer mellom nabopunkter. Legg spesielt merke til at det er viktig at arrayene er helt fyllt opp. Hvis ikke risikerer vi at det ligger noen merkelige verdier mot slutten som gjør at linjestykkene går berserk. Tredje parameter angir at vi skal tegne i rødt (her kan du selvsagt bruke andre farver). I tillegg til at plottet blir tegnet i et vindu, blir også informasjonen lagret på fila med navn gitt som siste parameter til addplot. Hvis vi ønsker kan vi tegne ut flere linjer ved å bruke addplot flere ganger. 4 Noen flere tips Utgangspunktet for å plotte er en funksjon f og dens definisjonsområde [a, b]. Vi ser dermed at variabelen xmin er gitt ved a mens variabelen xmax er gitt ved b. Variablene ymin og ymax trenger vi ikke oppgi, det er mye bedre å regne dem ut samtidig som vi beregner plottepunktene. Det oppnår vi ved å endre beregningsløkka til h = (b-a)/(k-1); ymin = ymax = f(a); for (i=0; i<k; i++) x[i] = a + i*h; y[i] = f(x[i]); ymin = Math.min(yMin, y[i]); ymax = Math.min(yMax,y[i]); Denne koden kan vi bruke direkte om f er gitt ved en metode, for eksempel public static double f(double t) return(t*t-2); 4

hvis f(x) = x 2 2. Koden som er vist her kan med fordel legges inn i en egen metode plotfunction som genererer plottepunktene basert på den gitte funksjonen f, intervallet [a, b] og antall punkter k. 5 Visualisering av Newtons metode For å visualisere Newtons metode må vi først se hvilke linjestykker som vi skal tegne. Vi husker at Newtons metode består i å beregne følgen x n = x n 1 f(x n 1 )/f (x n 1 ), n = 1,..., der x 0 er en gitt startverdi. Hvis vi ser på visualiseringen av Newtons metode i kompendiet så ser vi at denne består i å trekke rette linjer som forbinder punktene (x 0, 0) ( x 0, f(x 0 ) ) (x 1, 0) ( x 1, f(x 1 ) ) (x 2, 0) Siden vi bare skal visualisere Newtons metode gjør vi et passende antall iterasjoner uten å teste på konvergens. Hvis metoden konvergerer gjør den det vanligvis raskt slik at linjene våre fort krymper til punktet vi konvergerer mot. Legg merke til at vi produserer to plottepunkter for hver iterasjon i Newtons metode. Vi lagrer punktene i de to arrayene xn og yn. Vi bruker funksjonen f(x) = x 2 2 på intervallet [0, 2] som eksempel, utfører 5 iterasjoner med x 0 = 0.6, og genererer punktene med koden z = 0.6; xn[0] = z; yn[0] = 0; ip = 0; for (i=0; i<5; i++) ip++; xn[ip] = z; yn[ip] = f(z); ip++; z = z - f(z)/df(z); xn[ip] = z; yn[ip] = 0; Her har vi antatt at den deriverte til f er definert i en metode på samme måte som f. Siden vi bare genererer et endelig antall ledd i følgen trenger vi ikke ta vare på forrige ledd når vi beregner et nytt, så vi greier oss med en variabel z for å generere følgen så lenge vi lagrer unna punktene vi skal plotte i xn og yn. Hvor lange må xn og yn være? Hvis vi bruker 5 iterasjoner som her (vi burde nok bruke en egen variabel til å angi antallet) ser vi at vi genererer totalt 11 punkter. Til slutt tegner vi ut på skjermen med kallet 5

plot.addplot(xn, yn, java.awt.color.blue, "eksempel"); En fullstendig versjon av eksempelet som er brukt her finner du på hjemmesida til MAT-INF 1100. 6 Utskrift på papir Som nevnt tidligere vil plotteinformasjonen også bli lagt ut på fila med navn eksempel.gnuplott. Hvis du etterpå gir kommandoen gnuplott eksempel.gnuplott > eksempel.eps vil plotteinformsasjonen bli konvertert til Postscript og lagt ut på fila eksempel.eps som kan skrives ut med print-kommandoen (på maskiner med Ifi-oppsett). 6