Innleveringsoppgave 3

Like dokumenter
Innleveringsoppgave 6

Innleveringsoppgave 1

Innleveringsoppgave 4

Innleveringsoppgave 5

MAT-INF 1100: Obligatorisk oppgave 1

Matematikk Øvingsoppgaver i numerikk leksjon 4 m-ler

MAT-INF 1100: Obligatorisk oppgave 1

I dag skal vi ved hjelp av ganske enkel Python-kode finne ut om det er mulig å tjene penger på å selge og kjøpe en aksje.

INF109 - Uke 1b

UNIVERSITETET I OSLO

INF109 - Uke 1a

INF Innleveringsoppgave 6

Bildebehandling med Python og EzGraphics

Obligatorisk oppgave MAT-INF1100. Lars Kristian Henriksen UiO

Innhold uke 8. Objekter: Bruk og intern organisering. Beskjeder: Oblig 1 6. Beskjeder: Oblig 7 (og 8)

EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

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.

EKSAMENSOPPGAVE / EKSAMENSOPPGÅVE

Matematikk Øvingsoppgaver i numerikk leksjon 5 Skript

Oppgaver uke 1: Løsningsforslag

TMA Kræsjkurs i Matlab. Oppgavesett 1/3

Hash-funksjoner. Introduksjon. Steg 1: Strekkoder. Eksempel. Skrevet av: Martin Strand

Objektorientert programmering i Python

TDT4102 Prosedyre og Objektorientert programmering Vår 2015

Forkurs i informatikk Python. Andreas Færøvig Olsen

Objektorientert programmering i Python. Resten av semesteret. Innhold uke 9 Mer komplekse strukturer. Referanser og objekter, inkl Mentimeter spørsmål

MEK1100, vår Obligatorisk oppgave 1 av 2. Torsdag 28. februar 2019, klokken 14:30 i Devilry (devilry.ifi.uio.no).

UNIVERSITETET I OSLO

Øvingsforelesning i Python (TDT4110)

Oppgave 1 Hva tror du følgende program skriver ut til terminalen? Diskuter med gruppen.

Hjemmeeksamen 2 i INF3110/4110

Python: Funksjoner og moduler Kapittel

Etter uke 6 skal du. Introduksjon til objektorientert programmering. Hva skjedde ~1967? INF1001. Grunnkurs i objektorientert programmering

Løse reelle problemer

UNIVERSITETET I OSLO

Løsningsforslag. Innlevering i BYFE/EMFE 1000 Oppgavesett 1 Innleveringsfrist: 14. september klokka 14:00 Antall oppgaver: 3.

Repetisjon Novice Videregående Python PDF

INF Obligatorisk innlevering 5

Informasjon Eksamen i IN1000 og IN1001 høsten a) 1 poeng. 1b) 1 poeng. Tid. Oppgavene. Tillatte hjelpemidler. 30. november kl. 14.

Informasjon Prøveeksamen i IN1000 høsten 2018

Løse reelle problemer

Øvingsforelesning i Python (TDT4110)

Øvingsforelesning 1 Python (TDT4110)

LISP PVV-kurs 25. oktober 2012

STK1000 Obligatorisk oppgave 1 av 2

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

Finne ut om en løsning er helt riktig og korrigere ved behov

INF120: Oblig 3. Yngve Mardal Moe

Tre på rad mot datamaskinen. Steg 1: Vi fortsetter fra forrige gang

UNIVERSITETET I OSLO

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

Øvingsforelesning 3 Python (TDT4110)

Python: Funksjoner og moduler Kapittel

Hangman. Level. Introduksjon

TDT4110 Informasjonsteknologi grunnkurs: Kapittel 7 Filer og unntak ( exceptions ) Professor Alf Inge Wang Stipendiat Lars Bungum

Tre på rad mot datamaskinen. Steg 1: Vi fortsetter fra forrige gang. Sjekkliste. Introduksjon

Hvordan angripe en større oppgave? (og hva skal jeg gjøre i oblig 7!?)

MEK1100, vår Obligatorisk oppgave 1 av 2.

Hangman. Steg 1: Velg et ord. Steg 2: Gjett en bokstav. Sjekkliste. Sjekkliste. Introduksjon

OPPGAVE 1 OBLIGATORISKE OPPGAVER (OBLIG 1) (1) Uten å selv implementere og kjøre koden under, hva skriver koden ut til konsollen?

AlgDat - Øvingsforelesning 1 Introduksjon til Python, lenkede lister og øving 1

Øvingsforelesning 5 Python (TDT4110)

IN1000 Obligatorisk innlevering 7

Innhold uke 7. Objektorientert programmering i Python: Introduksjon. Lite tilbakeblikk: Programflyt og skop. Lite tilbakeblikk: Funksjoner er uttrykk

IN1140, H2018 gruppetime oppgaver Introduksjon til Tekst i Python

MAT-INF1100 Oblig 1. Teodor Spæren, brukernavn teodors. September 16, 2015

Steg 1: Rest etter divisjon

TDT4110 IT Grunnkurs Høst 2015

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

MAT1030 Plenumsregning 1

Steg 1: Regneoperasjoner på en klokke

Husk at du skal ha to vinduer åpne. Det ene er 'Python Shell' og det andre er for å skrive kode i.

Skilpaddetekst. Steg 1: Tekst på flere linjer. Sjekkliste. Introduksjon

Øvingsforelesning 5 Python (TDT4110)

Øvingsforelesning i Python (TDT4110)

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

Først må vi få datamaskinen til å velge et tilfeldig ord, så la oss begynne. Lagre programmet ditt og kjør det. Hvilket ord skrives ut?

Oppgave 1.6 Hva skrives ut? Riktig svar: The total rainfall from June to August was 54.00

MAT-INF 1100: Obligatorisk oppgave 1

Stjerner og galakser Nybegynner Python PDF

Øvingsforelesning i Matlab TDT4105

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

MAT1030 Diskret Matematikk

Steg 1: Tekst på flere linjer

Mattespill Nybegynner Python PDF

STK1000 Obligatorisk oppgave 2 av 2

Python: Løkker. TDT4110 IT Grunnkurs Professor Guttorm Sindre

Brukermanual for TrackGrabber

IN uke 1. Komme i gang med programmering

<?php. count tar en array som argument, og returnerer et tall som uttrykker antallet innførsler i arrayen.

INF100 INNLEVERING 3 HØSTEN 2004

PGZ - Hangman Ekspert Python Lærerveiledning

MAT-INF 1100: Obligatorisk oppgave 1

Informasjon Eksamen i IN1000 høsten 2017

Mål. Pensum. TDT4110 Informasjonsteknologi grunnkurs: Tema: Unntak (exceptions) (Kap 6) Dictionaries (Kap. 9) Terje Rydland - IDI/NTNU

Matematikk Øvingsoppgaver i numerikk leksjon 2 Funksjoner og plotting

TDT4110 Informasjonsteknologi grunnkurs: Tema: Funksjoner med retur og moduler Utgave 3: Kap

Forside. 1 Hva skrives ut?

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

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.

Transkript:

Innleveringsoppgave 3 INF109 Dataprogrammering for naturvitskap Dette er den tredje av syv obligatoriske oppgaver. Du kan få totalt 15 poeng på denne oppgaven. Innleveringsfristen er fredag, 4. mars, 23:59. Oppgaven skal leveres inn som én enkelt.py-fil. Oppgaven skal leveres inn på kursets hjemmeside på Mi Side. Oppgavene skal løses individuelt selv om samarbeid er tillatt. Lykke til! Obs: I denne oppgaven skal vi jobbe med matematiske funksjoner, og for å ikke forveksle matematiske funksjoner på formen f(x) = 3x 2 + x/2 log c (x) med Python-funksjoner, kommer vi i denne oppgaven til å kalle sistnevnte for metoder. Du skal med andre ord lage Python-metoder for å beregne verdien av matematiske funksjoner. 1 Introduksjon I denne oppgaven skal du lage et matematisk funksjonsplottingsprogram. Brukeren skal kunne definere noen funksjoner, eksempelvis f(x) = sin(x 2 ) og så kunne plotte funksjonen i et vindu. Kort oppsummert skal du lage fem Python-metoder, nemlig metodene 1 compute min and max(expression), compute min and max for file(filename), plot(window, expression, color = "black"), undraw all(graphical objects) og draw functions(). Inndata til programmet ditt er også denne uken en fil, men denne gangen inneholder hver linje en matematisk funksjon med x som variabel, det vil si, hver linje er en definisjon av en funksjon f(x), for eksempel: 10 * sin (2** x) 2 ** x / 100 round ( cos (x), 1) - 5 10 * sin ( abs (x -5) ) round (x) sin (x **2) fun.txt 1 Spør gruppeleder hva det siste argumentet i metoden plot(win, expr, color = "black") egentlig betyr. 1

Hint Dersom du har importert math kan du ved help(math) få tilgang til alle metoder og konstanter som er definert der. import math help ( math ) Videre kan du også bruke help for å få informasjon om alle metoder du kan bruke, e.g. help(ceil) gir deg informasjon om den Python-metoden (som gjenspeiler den matematiske funksjonen med samme navn) ceil() dersom du har importert den fra math-miljøet from math import * help ( ceil ) Dette fungerer også på egendefinerte metoder; Hvis du på første linjen under metodedeklarasjonen skriver en kommentar- eller dokumentasjonsstreng på formen """Min dokumentasjon""", vil Python kunne bruke dette som dokumentasjon, som i Oppgave 1A; Etter du har implementert metoden i Oppgave 1A, kan du kjøre help(compute min and max). 2 Oppgaver 2.1 Oppgave 1A def compute_min_and_max ( expression ): """ Beregner min - og max - verdi i uttrykket for x i [0,10] """ min_value = 1 e200 startverdi for minimumsberegning : et stort positivt tall max_value = -1 e200 startverdi for maksimumsberegning : et stort negativt tall her kommer koden din hvor du skal evaluere expression over 1001 forskjellige verdier og finne min - og max - verdi. return ( min_value, max_value ) Du skal lage en metode compute min and max(expression) som tar inn en streng, e.g. "sin(x**2)" og som finner minimumsverdien og maksimumsverdien til denne i intervallet x [0, 10]. Mer bestemt, vi skal forsøke med 1001 forskjellige verdier 2 fra 0 til 10 og evaluere funksjonen ved bruk av eval, med verdiene { } i x i [0, 1000]. 100 Dette kan enkelt gjøres ved å ha en for-løkke over i in range(0,1001) og for hver gang kjøre x = i / 100.0. Obs Vær oppmerksom på at programmet vil kræsje dersom eval blir bedt om å evaluere noe som ikke er definert, e.g. log(0), 1/0 og så videre. 2 Merk at vi bruker 1001 samplinger over intervallet [0, 10] for å få høyere oppløsning. Dette er sterkt relatert til samplingsrate som er brukt, e.g. når vi digitaliserer lyd. Tenk på hva som skjer dersom du plotter funksjonen sin(1000 πx). 2

Hint På første linje i metoden, bruk print("evaluerer", expression) for å få debug-informasjon. Hint I math-miljøet, er det en metode min som gir den minste verdien av to verdier. For å oppdatere min value, bruk uttrykket min value = min(y,min value). For å teste at metoden fungerer som den skal, prøv å kjøre compute min and max("sin(x**2)") og se at resultatet blir omtrent (-0.9999939135141118, 0.9999999062300194), altså ca. (-1,1) (husk dette med flyttallsfeil: Det finnes bare 2 32 mange forskjellige flyttall, men (utellbart) uendelig mange reelle tall). 2.2 Oppgave 1B def compute_min_and_max_for_file ( filename ): global_min = 1 e200 global_max = -1 e200 her kommer koden din hvor du for hver linje ( uttrykk ) i filen skal kalle ( min_verdi, max_verdi ) = compute_min_and_max ( expression ), for slik kunne finne globale minimum og maksimum over alle uttrykkene return ( global_min, global_max ) Du skal lage en metode som tar som input en streng som tilsvarer et filnavn. Denne metoden, compute min and max for file(filename), skal åpne filen som kalles filename og for hver funksjon i filen bruke metoden i Oppgave 1A for å finne hver enkelt av disse min- og max-verdiene. Vi skal finne de globale minimums- og maksimumsverdiene (det minste minimum og største maksimum over alle uttrykkene i filen) og returnere disse som et par. Obs Husk å lukke filen med the file.close() etter du er ferdig med den, det vil si rett før du returnerer. 2.3 Oppgave 2A def plot ( window, expression, color = " black "): """ Evaluates given expression and plots it in window. Returns the list of all the plotted points. """ points = [] her kommer koden din hvor du skal evaluere expression over 1000 forskjellige verdier og for hvert (x, y)-par, i. e. y = eval ( expression ), plotte punktet (x, y). return points def undraw_all ( graphical_objects ): """ Goes through given list of graphical objects and undraws them, one by one. """ her er koden din som fjerner alle objektene fra vinduet de er plottet i. Metoden trenger ikke returnere noe. 3

Lag en metode plot(window, expression, color = "black") som plotter uttrykket i vinduet du har fått. Du kan kopiere koden fra Oppgave 1A og bytte ut den delen hvor du finner min og max med å plotte punktet (x,y). Du kan teste at denne fungerer ved å prøve å kjøre følgende sekvens. >>> vindu = GraphWin (" Putti plutti plott ",500,500) >>> vindu. setbackground (" white ") >>> vindu. setcoords (0, -10,10,10) >>> plot ( vindu,"x") >>> plot ( vindu,"5 * sin (x)", " red ") >>> plot ( vindu,"3 ** (1 + sin (x))", " blue ") Vinduet skal se ut omtrent som i figuren under. Figure 1: Funksjonene f(x) = x, f(x) = 5 sin(x) og f(x) = 3 1+sin(x) er plottet. 2.4 Oppgave 2B def draw_functions (): her skal koden din, som beskrevet under. I denne siste oppgaven skal du lage en metode draw functions() som skal gjøre følgende: lese inn filnavn fra brukeren, 4

finne minimums- og maksimumsverdier ved å bruke metoden fra Oppgave 1B, lage et vindu med et passende koordinatsystem, og til slutt for hver funksjon i filen, bruke Oppgave 2A til å plotte denne funksjonen. Start med å lese inn et filnavn fra brukeren, og beregn de globale minimums- og maksimumsverdiene (global min,global max) ved å bruke compute min and max for file fra Oppgave 1B. Lag et vindu, og sett koordinatsystemet til å bruke intervallet [0,10] som x-akse, og intervallet [global min,global max] som y-akse. Til slutt, gå gjennom filen og for hver linje, kjør plot(window, expression, color = "black"). Etter at en funksjon har blitt plottet, skal brukeren trykke i vinduet for å få opp neste plotting (bruk window.getmouse() for å motta signalet fra brukeren), og funksjonen skal fjernes fra vinduet ved å bruke undraw alle før neste funksjon plottes. 3 Innlevering Lagre programmet ditt i en.py-fil som heter oblig3-abc123.py, hvor abc123 skal erstattes med ditt brukernavn, og lever besvarelsen på studentportalen Mi Side, i mappen 4 Vurdering Innleveringsmappe Vurderingsmappe Innlevering 3. For denne oppgaven kan du få maksimalt 15 poeng. Fordeling av poeng er som følger. For å løse oppgavene kan man få opp til 10 poeng, mens man kan få 5 poeng for kodestil. Merk dog at disse poengene bare er retningslinjer for den som retter oppgaven, og vedkommende kan gi mer enn full pott på en av punktene dersom noe er veldig bra skrevet for å kompensere for eventuelle trekk i andre punkter. Programmet fungerer som forventet 12 (ca. 6 + 6) Programmet er veldokumentert med kommentarer og oversiktlig 2 Navngiving 1 15 Programmet fungerer som forventet. Her får man trekk om programmet enten skriver ut feil data, har feil format på utskrift (avviker fra eksempelet), kræsjer på noen som helst måte eller om metodenavn ikke er som oppgitt. Programmet er veldokumentert med kommentarer og oversiktlig. Her får man trekk om programmet ikke er kommentert godt nok, men også om programmet er for mye kommentert. Man kan også få trekk om programmet er uoversiktlig. Navngiving. Her får man trekk dersom navn på variabler og metoder ikke er fornuftig valgt og at navngivingen som er brukt er inkonsistent. Husk å velge enten mixedcase eller underscore. 3 3 mixedcase er når variablene ser ut som innlestdata, mens underscore er når variablene skrives som innlest data. Velg én av disse to, og hold dere til den måten. I boken bruker de førstnevnte, mens det er kanskje vanligere ellers i Python-verdenen å bruke sistnevnte. Aldri begynn med stor forbokstav, e.g. InnlestData eller lignende, da disse er reservert til klassenavn, noe som er delvis utenfor pensum for dette kurset. 5

Oppgavene vil være ferdigrettet innen én uke har gått, og poengsum og kommentarer fra retter vil bli postet i vurderingsmappen under kommentarer. Question or complaints can be directed to any of the group leaders. Obs: Den nye karakteren vil bli stående og det er ikke garantert at den ikke vil gå ned. 6

5 Ekspert Obs Dette er ingen oppgave og man får ingen poeng for dette. Hvis du ønsker å kunne evaluere funksjoner som muligens er udefinert, slik som log(x) og 1/x, for x = 0 eller 1, er det mulig å komme rundt dette ved en såkalt try/catch-prosedyre. Har du løst oppgaven ellers, og lurer på hvordan du skal implementere dette, spør en av gruppelederne på øvingene. De vil vise deg hvordan man kan prøve å evaluere et uttrykk, og fange opp (og ignorere) eventuelle unntak: def compute_min_and_max ( expression ): """ Beregner min - og max - verdi for uttrykk for x i [0,10] """ min = 1 e200 max = -1 e200 for i in range (0,1001) : x = i / 100.0 try : snipp... eval ( expression )... snapp except ( ValueError, ZeroDivisionError ): Oops, la oss late som om ingenting har skjedd print ( expression, " er ikke definert for x =", x) return (min, max ) Interpolering Dersom du plotter funksjoner som endrer seg hurtigt, kan du oppleve at funksjonen blir tegnet som individuelle punkter istedenfor å se ut som på figuren over. Dette er det ikke så lett å gjøre noe med, men én av måtene å forbedre det på, er ved å tegne linjer (Line) mellom f(x) og f(x + 1). Med andre ord, istedenfor å tegne punktet Point(x,f(x)), trekker man linjen som går mellom punktene Point(x,f(x)) og Point(x+1,f(x+1)). Dette kan løses ved å mellomlagre forrige punkt: prev_point = None The point (x, fx) we eval d previous round in loop for i in range (0,1001) : if prev_point is None : continue x = i / 100.0 fx = eval (...) insert code point = Point (x, fx) line = Line ( prev_point, point ) Do plotting business... prev_point = point more code? Merk at vi tar vare (mellomlagrer) forrige punkt slik at vi kan bruke det i neste runde i forløkken. Verdien None er en spesiell verdi, og er av typen NoneType og finnes for akkurat dette bruksmønsteret: Når en variabel ikke har blitt gitt en verdi. (Det er også denne verdien en funksjon som ikke eksplisitt returnerer noe, returnerer.) 7