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



Like dokumenter
Obligatorisk oppgave MAT-INF1100. Lars Kristian Henriksen UiO

UNIVERSITETET I OSLO

Løsningsforslag til prøveunderveiseksamen i MAT-INF 1100, H-03

MAT-INF 1100: Obligatorisk oppgave 1

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

Underveiseksamen i MAT-INF 1100, 17. oktober 2003 Tid: Oppgave- og svarark

Prøveunderveiseksamen i MAT-INF 1100, H-03

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Reelle tall på datamaskin

Diskret matematikk tirsdag 13. oktober 2015

Modulo-regning. hvis a og b ikke er kongruente modulo m.

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Forside. MAT INF 1100 Modellering og beregninger. Mandag 9. oktober 2017 kl Vedlegg (deles ut): formelark. Tillatte hjelpemidler: ingen

Oppgaver uke 1: Løsningsforslag

Alle hele tall g > 1 kan være grunntall i et tallsystem.

UNIVERSITETET I OSLO

MAT1030 Forelesning 2

Innleveringsoppgave 1

MAT1030 Diskret Matematikk

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Matematikk Øvingsoppgaver i numerikk leksjon 7 Løsningsforslag

Oppsummering av Uke 3. MAT1030 Diskret matematikk. Binære tall. Oppsummering av Uke 3

Rekker (eng: series, summations)

Matematikk Øvingsoppgaver i numerikk leksjon 6 Løsningsforslag

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

Simulering av differenslikninger

Representasjon av tall på datamaskin Kort innføring for MAT-INF1100L

Tallsystemer. Tallene x, y, z og u er gitt ved x = 2, y = 2, z = 4 og u = 2. Dermed blir =

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

Rekker (eng: series, summations)

UNIVERSITETET I OSLO

KONTROLLSTRUKTURER. MAT1030 Diskret matematikk. Kontrollstrukturer. Kontrollstrukturer. Eksempel (Ubegrenset while-løkke)

Mer om representasjon av tall

Alle hele tall g > 1 kan være grunntall i et tallsystem.

Forelesning 2. Flere pseudokoder. Representasjoner av tall. Dag Normann januar 2008 KONTROLLSTRUKTURER. Kontrollstrukturer. Kontrollstrukturer

UNIVERSITETET I OSLO

Mer om mengder: Tillegg til Kapittel 1. 1 Regneregler for Booleske operasjoner

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Programmering i Java med eksempler

Oppfriskningskurs dag 1

Hvor gammel er du? Hvor gammel er du? Del 1: Skrive ut til skjerm. Gjøre selv. Skrevet av: Sindre O. Rasmussen, Kodeklubben Trondheim

Løsningsforslag Øving 7 TMA4140 Diskret matematikk Høsten 2008

Løsningsførslag i Matematikk 4D, 4N, 4M

Denne oppgaven innfører funksjoner, og viser hvordan vi kan skrive og teste funksjoner i Ellie.

Øvingsforelesning 3 Python (TDT4110)

Funksjoner Forelesning i Matematikk 1 TMA4100. Hans Jakob Rivertz Institutt for matematiske fag 18. august 2011

UNIVERSITETET I OSLO

Bygge en pyramide. Introduksjon. Steg 1: Lage en ny mod. Sjekkliste. Skrevet av: Pål G. Solheim

Øvingsforelesning 1 Python (TDT4110)

Heldagsprøve i matematikk. Svar og løsningsforslag

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

TDT4110 Informasjonsteknologi, grunnkurs Uke 35 Introduksjon til programmering i Python

INF Logikk og analysemetoder Forslag til løsning på oppgave fra læreboken

Kap 2: Løkker og lister

MAT-INF 1100: Obligatorisk oppgave 1

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

Programmering i Java med eksempler

Repetisjon Novice Videregående Python PDF

Bli Kjent med Datamaskinen Introduksjon ComputerCraft PDF

Oppgaveark Uke 37 (07/09-11/09) MAT111 - H09

MAT-INF 1100: Obligatorisk oppgave 1

UNIVERSITETET I OSLO

Mattespill Nybegynner Python PDF

K Andre Ordens Differensialligninger

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

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.

Matriser. Kapittel 4. Definisjoner og notasjon

TDT4110 IT Grunnkurs Høst 2016

MAT-INF 1100 Modellering og beregninger. Fredag 12. oktober 2018 kl Vedlegg (deles ut): formelark. Tillatte hjelpemidler: ingen

TDT4102 Prosedyre og Objektorientert programmering Vår 2014

Steg 1: Rest etter divisjon

Verden. Introduksjon. Skrevet av: Kine Gjerstad Eide og Ruben Gjerstad Eide

NIO 1. runde eksempeloppgaver

6 Numeriske likningsløsere TMA4125 våren 2019

Komplekse tall. Kapittel 2. Den imaginære enheten. Operasjoner på komplekse tall

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å.

Algebra. Likningsløsning. tasten) for å komme ned til S, og bla videre nedover til du finner solve(.

Løsningsforslag for eksamen i brukerkurs i matematikk A (MA0001)

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

Verden. Steg 1: Vinduet. Introduksjon

Stjerner og galakser Nybegynner Python PDF

x 2 = x 1 f(x 1) (x 0 ) 3 = 2 n x 1 n x 2 n 0 0, , , , , , , , , , , 7124

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

Kortryllekunst og matematikk.

Steg 1: Vår første datamaskin

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

b) 17 går ikke opp i 84 siden vi får en rest på 16 når 84 deles med 17 c) 17 går opp i 357 siden

INF1000 Eksamen 2014 (modifisert)

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

TDT4110 IT Grunnkurs Høst 2016

Object [] element. array. int [] tall

Transkript:

MAT-INF1100 Oblig 1 Teodor Spæren, brukernavn teodors September 1, 015 1

Oppgave 1 I de oppgavene som krever at man gjør om et rasjonalt tall i intervallet (0, 1) om til en binærsifferutvikling, fant jeg denne sifferutviklingen ved å sette første siffer lik (b β)//c og så sette b = (b β)%c. Her er b/c lik det rasjonale tallet jeg omgjør og β er basen, med andre ord. Dette forsatte jeg med inntil b ble 0 eller fikk en tidligere verdi. Jeg har derfor valgt å ikke skrive opp alle omgjøringer av denne typen, da det ville ha brukt unødvendig mye plass. a) For å gjøre om da7 1 til en sifferutvikling i -tallsystemet, kan man bare omgjøre hvert siffer til den binære versjonen og så putte de sammen. Da får man: da7 1 = 110110100111 b) c) 9 4 = 0.011101 1 5 = 0.00001010001111010111 d) Her brukte jeg samme regel som i 1.a. Gjør her bare om 4 til det tilsvarende binære tallet. 0.4 1 = 0.01 e) Her gjør jeg om til 10-tallssystemet for så å bruke vanlig metode for å få den binære tallutviklingen. Oppgave Skal vise at følgen {x n } gitt ved: bc 1 = 80 1000 1 409 715 104 = 0.1011001011 x n = (cos (x n 1 )) sin (x n ) for n der x 0 = π/ og x 1 = 3, ligger i de lukkede intervallet [0, 1] for alle n. Jeg ønsker å bevise dette ved induksjon. Induksjonshypotesen er P n : 0 x n 1 for n og siden n, så setter vi n 0 =. Det første vi må gjøre er å teste om P n0 sann 0 x 1 0 (cos (x 1 )) sin (x ) 1 0 (cos (3)) sin ( ) π 1 er

og vi ser i fra dette at P n0 sann. Da er det nok å vise at dersom P m er sann for alle m slik at m < k, så er P k også sann. Dette viser vi slik: 0 x k 1 0 (cos (x k 1 )) sin (x k ) 1 Siden vi antar at P m er sann, ser vi at 0 x k 1 1 og 0 x k 1. Da er det lett å se at den største verdien P k kan ha er 1 og den minste verdien P k kan ha er 0. Oppgave 3 a) Programmet jeg skrev for å regne ut røttene til et andregrads polynom: 1 import math 3 a = float(raw_input("a: ")) 4 b = float(raw_input("b: ")) 5 c = float(raw_input("c: ")) 7 p1, p = -b/(*a), math.sqrt(b*b - 4*a*c)/(*a) 8 x1, x = p1 - p, p1 + p 9 10 print("x1 = {:g}, x = {:g}".format(x1, x)) For å sjekke om programmet fungerer, tester vi ut 3 eksempler. Venstre siden er program kjøringen og den høyre siden er manuell utregning. 3

a: 1 b: c: 1 x1 = -1, x = -1 x = ± 4 1 1 1 x = x 1 = 1, x = 1 a: 1 b: c: 9 x1 = -3, x = -3 x = ± 4 1 1 x = x 1 = 3, x = 3 a: 1 b: -1 c: - x1 = -, x = 3 x = 1 ± ( 1) 4 1 1 x = 1 ± 5 x 1 =, x = 3 b) Bruker programmet i a) til å løse ligningen Kjørelogg: a: 1e-8 b: 10 c: 1e-8 x1 = -1e+09, x = 0 10 8 x + 10x + 10 8 = 0 Den roten som får en feil er x. Denne skulle vært 1 10 9, noe som gir oss en stor relativ feil 10 9 0 10 9 = 1 4

Dette skjer når b 4ac og det oppstår en underflow slik at b = b 4ac. En måte å få mer nøyaktige resultater på er å regne ut den roten hvor avrundingsfeilen oppstår ved hjelp av den andre roten og det faktum at produktet mellom de to røttene alltid er r 1 r = b + b 4ac a r 1 r = ( b) ( b 4ac ) 4a r 1 r = b b + 4ac 4a r 1 r = c a b b 4ac a Dette betyr at hvis vi kan kalkulere en av røttene med høy presisjon, så kan vi få den andre roten også, ved hjelp av dette forholdet. Programmet under implementerer denne alternative løsningsmetoden: 5

1 import math 3 a = float(raw_input("a: ")) 4 b = float(raw_input("b: ")) 5 c = float(raw_input("c: ")) 7 # Compute the parts. 8 p1, p = -b/(*a), math.sqrt(b** - 4*a*c)/(*a) 9 10 # Compute both roots as normal. 11 x1, x = p1 - p, p1 + p 1 13 # If we have an underflow, compute one of the two roots by 14 # using the fact that the product of the two roots are c/a 15 if b** == (b**-4*a*c): 1 if abs(x1) > abs(x): 17 x = c/(x1*a) 18 else: 19 x1 = c/(x*a) 0 1 print("x1 = {:g}, x = {:g}".format(x1, x)) Nå hånterer programmet ligning gitt i starten av b) og andre lik den, helt fint: a: 1e-8 b: 10 c: 1e-8 x1 = -1e+09, x = -1e-09 a: 1e-8 b: -10 c: 1e-8 x1 = 1e-09, x = 1e+09 Oppgave 4 a) Programmet sjekker om matematiske identiter også holder for maskiner. Den kjører en sjekk 10000 ganger, og ser om (x + y) 3 = x 3 + 3x y + 3xy + y 3 også holder når man bruker 3 tilfeldigvalgte flyttall for x, y. For hvergang dette ikke holder blir verdien av x, y og z skrevet ned og de to forskjellige resultatene notert. Til slutt printes antall feil i prosent, fulgt av verdiene x, y og z hadde når den siste feilen oppstod. Hvor stor forskjellen var skrives også ut. Derfor forteller utskriften oss at hele 50.4% av testene fant forskjellige resultater for (x + y) 3 og x 3 + 3x y + 3xy + y 3. Videre kan vi lese at den siste

feilen var svært liten, 4.440890985 10 1, men forsatt nok til at resultatene ikke var like. Det å bruke == for å teste om to flyttall er like, er en vanlig feil i programmering. Tester som den over og mange andre forteller oss at slike naive måter å sammenligne flyttall på kan ha katastrofale følger! b) Det modifiserte programmet: 1 from random import random 3 antfeil = 0; N = 10000 4 x0 = y0 = z0 = 0.0 5 feil1 = feil = 0.0 7 for i in range(n): 8 x = random(); y = random(); z = random(); 9 res1 = (x + y) + z 10 res = x + (y + z) 11 1 if res1!= res: 13 antfeil += 1 14 x0 = x; y0 = y; z0 = z 15 feil1 = res1 1 feil = res 17 18 print (100. * antfeil/n) 19 print x0, y0, z0, feil1 - feil og her har vi kjøreloggen: 17.33 0.497037317989 0.384109 0.707959493 -.0440495e-1 Vi ser helt klart at feil prosenten er langt lavere denne gangen. Jeg tror grunnen til dette er vi i dette programmet gjør færre operasjoner, noe som leder til mindre avrundingsfeil. 7