Modellering og analyse av trigonometriske funksjoner
Mange periodiske fenomener i naturen kan modelleres med sinusfunksjoner. Når vi skal analysere funksjonene, er det lurt å bruke det vi vet om hvordan slike funksjoner ser ut og oppfører seg. Nederst på siden kan du laste ned oppgavene som Word- og pdf-dokumenter.
Det er ikke gitt noen definisjonsmengde, så da må vi anta at .
Nullpunktene er .
b) Bestem de stasjonære punktene til og avgjør hva slags stasjonære punkter det er snakk om.
Løsning
Funksjonen er en variant av den generelle sinusfunksjonen. Vi bruker derfor at en sinusfunksjon er periodisk slik at toppunktene kommer med én periodes mellomrom. Det samme gjelder bunnpunktene.
En generell sinusfunksjon har sin største verdi når argumentet er der . Dette gir oss
Vi vil få nye toppunkter med et mellomrom på mellom hvert mellomrom. Det betyr at perioden . -koordinatene blir
Toppunktene til er derfor .
Bunnpunktene ligger midt mellom toppunktene, det vil si når
-koordinatene blir
Bunnpunktene til er derfor .
En generell sinusfunksjon har ingen terrassepunkter.
c) Analyser krumningsforholdene og finn vendepunktene til .
Løsning
Vendepunktene til en sinusfunksjon ligger der grafen krysser likevektslinja. Derfor vil de ligge med en halv periodes mellomrom midt mellom et topp- og et bunnpunkt. For eksempel er -koordinaten til noen av vendepunktene en kvart periode større enn -koordinaten til toppunktene. Dette gir oss at vi får vendepunkter når
-koordinaten til vendepunktet er . Koordinatene til vendepunktene blir
Siden det første ekstremalpunktet etter vendepunktet i er bunnpunktet i , vil grafen vende den hule siden opp i intervallet mellom og det "neste" vendepunktet, det vil si i intervallet . I intervallet mellom og det neste vendepunktet vil grafen vende den hule siden ned. Slik vil det fortsette.
I denne oppgaven tar vi for oss den samme funksjonen som i den forrige oppgaven:
Nå skal du gjøre funksjonsanalyse ved å bruke derivasjon, slik du ville gjort det med en hvilken som helst annen type funksjon. Kontroller at du får samme svar som i forrige oppgave.
a) Finn de stasjonære punktene til .
Løsning
Vi må først finne . Vi setter , som gir og og bruker kjerneregelen når vi deriverer.
Vi finner nullpunktene til den deriverte.
Nå må vi finne ut hvilke av disse -verdiene som gir et toppunkt og hvilke som gir et bunnpunkt. Når , får vi at . Argumentet til sinusfunksjonen blir da
Dette må være et toppunkt siden er den største verdien sinus kan ha. Det neste nullpunktet til den deriverte, som vi får når , må være et bunnpunkt til funksjonen. må gi et toppunkt igjen.
Vi får derfor at -koordinaten til toppunktene er
og bunnpunktene
Alternativt kan vi ta dobbeltderiverttesten for å sjekke hva slags type stasjonære punkter vi får.
Vi setter inn nullpunktene til den deriverte.
Svaret skifter mellom å være positivt og negativt. Svaret er negativt når er 0 eller et partall, og positivt når er et oddetall. Dette gir samme resultat som over.
Vi bruker at -koordinaten til toppunktene får vi når sinus til uttrykket i parentes er 1. Da trenger vi ikke sette inn -koordinaten til toppunktene for å regne ut -verdien. Dette gir
-koordinaten til bunnpunktene får vi tilsvarende når sinus til uttrykket i parentes er lik . Dette gir
Oppsummert får vi dette:
Toppunkt:
Bunnpunkt:
Stemmer dette med resultatet i forrige oppgave?
b) Finn vendepunktene til .
Løsning
Vi finner vendepunktene ved å sette den dobbeltderiverte lik 0.
Nederst har vi skrevet om uttrykket for å skrive det første leddet som en vinkel i første omløp, men vi må ikke gjøre det.
a) Kan vi bruke en forenklet metode for funksjonsanalysen uten å derivere i dette eksempelet slik vi kunne med funksjonen i den første oppgaven?
Løsning
Svaret er nei. Her har vi en kombinasjon av en sinusfunksjon og en polynomfunksjon som er avhengig av . Da må vi derivere.
b) Finn eventuelle stasjonære punkter på grafen til funksjonen.
Løsning
Vi deriver . Vi bruker kjerneregelen igjen, her i kortform:
Vi finner eventuelle ekstremalpunkter ved å sette .
For begge løsningene kan vi bare bruke -verdier på 0 og 1 for at løsningene skal være innenfor definisjonsmengden. Vi får følgende mulige ekstremalpunkter:
Så tar vi en stikkprøve for å avgjøre monotoniegenskapene i stedet for dobbeltderiverttesten:
Siden den deriverte er en ren cosinusfunksjon, vet vi at den skifter fortegn i nullpunktene. Vi trenger derfor ikke å ta flere stikkprøver.
Vi kan nå sette opp fortegnslinja for .
Fortegnslinja viser at grafen til stiger i intervallene , og og synker i intervallene og .
-koordinatene til toppunktene blir og , og bunnpunktene har -koordinatene og .
-verdien til toppunktene blir
-verdien til bunnpunktene blir
Toppunkter: og
Bunnpunkter: og
c) Er funksjonen periodisk?
Løsning
Ekstremalpunktene kommer med periodiske mellomrom, men siden ekstremalverdiene varierer, vil ikke funksjonen være periodisk.
d) Finn eventuelle vendepunkter på grafen til funksjonen.
Løsning
Vi finner infleksjonspunkter ved å sette . Først finner vi
Så setter vi den andrederiverte lik null.
Vi får løsning når . I stigende rekkefølge får vi følgende infleksjonspunkter:
Vendepunkt:
og
e) Hvor stiger funksjonen raskest, og hvor raskt stiger den da?
Løsning
Funksjonen må stige raskest i ett av vendepunktene. Vi må se etter et vendepunkt som kommer etter et bunnpunkt. Det første bunnpunktet er . Det nærmeste vendepunktet etter dette er . Det andre bunnpunktet har ikke noe vendepunkt etter seg. Vi regner ut
Funksjonen stiger raskest når , og da er den momentane vekstfarten 6.
f) Finn vendetangenten i det vendepunktet som har minst -verdi.
Løsning
Vendepunktet med minst -verdi er punktet . Stigningstallet til tangenten er
Vi bruker ettpunktsformelen for å finne vendetangenten:
g) Tegn grafen til inkludert vendetangenten og kontroller at resultatene over stemmer.
h) Kontroller resultatene med CAS.
Løsning
Vi bruker funksjonen som alt er skrevet inn i algebrafeltet i GeoGebra.
I linje 1 finner vi ekstremalpunktene.
I linje 2 bruker vi dobbeltderiverttesten for å finne ut om ekstremalpunktene er minimal- eller maksimalpunkt.
I linje 3 regner vi ut ekstremalverdiene.
I linje 4 finner vi nullpunktene til den dobbeltderiverte. Ut fra verdiene vi fikk regnet ut i linje 2, ser vi at den dobbeltderiverte skifter fortegn i disse nullpunktene, som da er infleksjonspunkt.
I linje 5 finner vi -koordinatene til vendepunktene.
I linje 6 regner vi ut den deriverte i vendepunktene siden det må være i ett av disse funksjonen stiger raskest.
Til hver av oppgavene skal du lage en modell for svingningene ved å bruke informasjonen i oppgaven.
a) En friksjonsfri pendel svinger fra side til side. Avstanden mellom ytterpunktene av svingningen holder seg på 80 cm. Pendelen bruker 4 sekunder mellom hvert ytterpunkt.
Løsning
Den generelle sinusfunksjonen skriver vi som
Siden det er tida som er den frie variabelen, kan vi bytte ut med hvis vi vil.
Den første opplysningen betyr at
Når pendelen bruker 4 s fra ytterpunkt til ytterpunkt, betyr det at perioden . Det betyr at
Siden vi ikke har flere opplysninger om svingningen, kan vi ikke regne oss fram til hva og er. Vi kan derfor sette . Funksjonen blir
b) Besøkene på et nettsted følger et mønster som gjentar seg uke for uke. Besøkstoppen pleier å være på torsdager med cirka 30 000 unike brukere. Så avtar det jevnt til søndag, da det er på det laveste med cirka 15 000 unike brukere, før det igjen øker fram mot neste torsdag.
Løsning
Likevektslinja må ligge midt mellom laveste og høyeste verdi. Vi får derfor at
Hvis vi lar stå for dager, betyr det at perioden til funksjonen er ei uke, eller . Da får vi at
Hvis vi lar bety en mandag, betyr det at funksjonen skal ha toppunkt når . Dette gir
der . Det enkleste er da å velge . Funksjonen som passer best til å beskrive besøksmønsteret blir
c) Det pleier å være 4 år mellom hver gang det er lemenår. En kartlegging viser at når det er lemenår, pleier antallet lemen i et fjellområde å ligge på 50 000. Midt mellom to lemenår kan antallet være nede i 4 000.
Løsning
Vi kan finne og på tilsvarende måte som i forrige oppgave.
Hvis vi lar stå for antall år, betyr det at perioden . Det betyr at
Vi kan si at det skal være lemenår når . Det betyr at det skal være et toppunkt der. Dette gir
Vi behøver ikke ta med "" siden vi er fornøyde med en enkelt verdi for . Funksjonen for antall lemen blir
d) Vi lager et tverrsnitt av Sør-Norge som går omtrent på tvers av dalene Østerdalen, Gudbrandsdalen, Valdres og Hallingdal. Disse fire dalene er tilnærmet parallelle. Bruk for eksempel karttjenesten Norgeskart og finn en sinusfunksjon som passer noenlunde med høydeprofilen på dette tverrsnittet. Prøv å vurdere hvor godt sinusfunksjonen du kommer fram til, passer.
Tips til oppgaven
Du kan bruke verktøyet "Tegne og måle", som ligger under hovedmenyen på Norgeskart, til å måle avstander. Du kan finne høyder over havet ved å klikke direkte i kartet (gå ut av "Tegne og måle" først) og se øverst til venstre.
Løsning
Vi velger å lage et tverrsnitt fra Gol i Hallingdal til Koppang i Østerdalen. Dette måler vi til cirka 148 km. Denne avstanden skal tilsvare 3 perioder i sinusfunksjonen siden Østerdalen er den tredje dalen etter Hallingdal (vi regner ikke med noen mindre dalfører som også passeres, slik som Gausdal og Imsdalen).
Dalbunnene i de 4 dalene ligger mellom cirka 200 og 300 meter over havet. Da sier vi at den laveste verdien til sinusfunksjonen skal være 250. Tilsvarende måler vi at de høyeste toppene langs linja ligger rundt 1 250 meter over havet.
Vi får derfor at
Vi lar stå for avstand fra Gol målt i km. Siden det skal være 3 perioder mellom Gol og Koppang, betyr det at
Dette gir videre at
Til slutt må vi bestemme . Vi skal ha et bunnpunkt i Gol, det vil si for . Dette gir
Funksjonen blir derfor
En sinusfunksjon passer egentlig ikke så veldig godt. For eksempel er det nesten dobbelt så langt mellom Valdres og Gudbrandsdalen som mellom Valdres og Hallingdal.
Tabellen nedenfor viser den månedlige gjennomsnittstemperaturen i Trondheim fra desember 2021 til desember 2022.
Temperatur i Trondheim
Måned
Gjennomsnittstemperatur, °C
Desember 2021
-2,9
Januar 2022
-0,7
Februar 2022
-1,3
Mars 2022
2,3
April 2022
2,6
Mai 2022
8,1
Juni 2022
12,8
Juli 2022
12,5
August 2022
13,1
September 2022
9,4
Oktober 2022
6,0
November 2022
2,7
Desember 2022
-5,3
Dataene er hentet fra Meteorologisk institutt.
a) Forklar hvorfor en sinusfunksjon kan passe godt som modell for disse tallene.
Løsning
Siden temperaturen går opp og ned mellom sommer og vinter, kan vi anta at en periodisk funksjon som en sinusfunksjon passer godt.
b) Finn en modell for temperaturen ved å finne den sinusfunksjonen som passer best mulig med tallene. Tegn modellen sammen med tallene i et koordinatsystem.
Tips til oppgaven
La bety januar 2022.
Løsning
Vi utvider tabellen med en kolonne for .
Temperatur i Trondheim
Måned
Gjennomsnittstemperatur, °C
Desember 2021
0
-2,9
Januar 2022
1
-0,7
Februar 2022
2
-1,3
Mars 2022
3
2,3
April 2022
4
2,6
Mai 2022
5
8,1
Juni 2022
6
12,8
Juli 2022
7
12,5
August 2022
8
13,1
September 2022
9
9,4
Oktober 2022
10
6,0
November 2022
11
2,7
Desember 2022
12
-5,3
Vi skriver tallene inn i regnearkdelen i GeoGebra, markerer dem og velger regresjonsanalyseverktøyet. Vi velger videre regresjonsmodellen "sin".
Resultatet blir
Grafisk framstilling av den månedlige gjennomsnittstemperaturen i Trondheim sammen med den trigonometriske modellen som passer best med tallene
Funksjonen passer sånn noenlunde. Det kan se ut som at desember 2021 var veldig kald i Trondheim.
c) Hva er perioden til funksjonen? Kommenter resultatet.
Løsning
Perioden er
Perioden er 12,1 måneder, altså omtrent et år, som vi kunne forvente. Grunnen til at vi ikke får nøyaktig 12 måneder, kan skyldes at temperaturene varierer ganske mye innenfor en måned. Dersom vi hadde hatt tall for en tiårsperiode, ville nok perioden på den funksjonen vi hadde kommet fram til, vært enda nærmere 12.
d) Hva blir høyeste og laveste gjennomsnittstemperatur i Trondheim etter modellen?
Løsning
Amplituden til sinusfunksjonen er 8,1 og sinusfunksjonen svinger rundt .
Høyeste temperatur blir
Laveste temperatur blir
e) Hva er gjennomsnittstemperaturen i Trondheim gjennom et år etter modellen? Hvordan stemmer det med målingene?
Løsning
Siden sinusfunksjonen svinger rundt likevektslinja, blir gjennomsnittstemperaturen gjennom året 5,1° etter modellen.
For å finne den årlige gjennomsnittstemperaturen direkte fra målingene lager vi ei liste av målingene fra og med januar 2022 til og med desember 2022. Så bruker vi kommandoen gsnitt for å få gjennomsnittet av tallene i lista.
Utregning av gjennomsnittstemperaturen
Målingene gir årlig gjennomsnittstemperatur i Trondheim lik 5,2°, altså svært liten forskjell i forhold til hva modellen gir.
f) Når var temperaturen høyest, og når var den lavest etter modellen? Stemmer resultatet med målingene?
Løsning
Vi bruker verktøyet eller kommandoen "Ekstremalpunkt" og får et bunnpunkt med koordinatene og et toppunkt med koordinatene , se figuren.
Grafisk framstilling av den månedlige gjennomsnittstemperaturen i Trondheim sammen med den trigonometriske modellen som passer best med tallene. Et bunnpunkt og et toppunkt er tegnet inn.
betyr januar, mens betyr juli. Temperaturen er etter modellen lavest i januar og høyest i juli.
Vi ser at målingene tyder på at det er kaldest i desember og varmest i august, så det stemmer ikke helt med modellen. Det vil variere fra år til år hvilken måned som er kaldest, og hvilken som er varmest.
1# importerer nødvendige bibliotek2from scipy.optimize import curve_fit
3import numpy as np
4import matplotlib.pyplot as plt
5# lager funksjonen som beskriver modellen6defmodell(x,A,k,fi,d):7return A*np.sin(k*x + fi)+ d
8# legger inn måledataene i lister9x_verdier =[0,1,4,7,9,10,12,13,15,17,20,22,24]10y_verdier =[19,17,15,17,19,21,25,26,27,26,24,22,18]11# bruker metoden curve_fit og legger resultatene i to lister12konstanter,kovarians = curve_fit(modell,x_verdier,y_verdier)13# henter ut konstantene fra lista konstanter14A, k, fi, d = konstanter
1516# lager utskrift av funksjonen17print(f"Funksjonen blir T(x) = {A:.2f}sin({k:.3f}x{fi:+.2f}){d:+.2f}")18# plotter data og modell som en kontroll19# plotter data20plt.plot(x_verdier,y_verdier,'.', label="Målinger")21# plotter modell22x_array = np.linspace(min(x_verdier),max(x_verdier),300)23y_array = modell(x_array,A, k, fi, d)24plt.plot(x_array,y_array,"brown", label="Modell")25plt.grid(True)26plt.xlabel("Tid (timer)")27plt.ylabel("Temperatur (°C)")28plt.legend(bbox_to_anchor=(0.9,0.2))29# endrer på skalaen på x-aksen til å passe bedre med klokka30plt.xticks(np.arange(min(x_verdier),max(x_verdier)+1,3.0))31plt.show()
Programmet gir funksjonen . Dette er ikke samme funksjon som vi fikk med regresjon i GeoGebra. Bildet nedenfor viser den grafiske framstillingen som programmet lager.
Eksempel på regresjon som gir feil modell
Modellen passer ikke med målingene. Regresjonen feiler, rett og slett. Heldigvis fins det et triks eller hjelpemiddel vi kan bruke. Det ser vi på i neste oppgave.
c) Årsaken til at modellen funnet med scipy.optimize passer svært dårlig med måledataene, kan være at startverdien 1 som regresjonsverktøyet bruker som utgangspunkt for de fire konstantene, ligger et stykke fra de riktige verdiene. Prøv i tilfelle å legge til følgende kodeord til kommandoen "curve_fit":
p0 = [A0,k0,fi0,d0]
der de fire konstantene i lista har noenlunde riktige verdier. For eksempel kan vi prøve med verdiene vi fant for modellen på teorisiden. Dette gir regresjonsmotoren et bedre utgangspunkt for jobben den skal gjøre.
Finn gode verdier for de fire konstantene, legg inn kodelinja over med disse verdiene, og kjør programmet på nytt. Blir resultatet bedre nå?
Løsning
Temperaturen varierer mellom cirka 15 og 25 grader. Det betyr at amplituden . Perioden er omtrent 24 timer. Da vet vi at . Vi prøver om det går bra å beholde startverdien . Likevektslinja må ligge i nærheten av 20, så vi får .
Vi legger inn følgende kode i parameterlista til "curve_fit":
p0 = [5,0.25,1,20]
Da blir resultatet
Plottet programmet gir oss, viser at funksjonen passer godt.
Er dette samme funksjon som vi fikk med GeoGebra? Med GeoGebra fikk vi
Vis at de to funksjonene er like ved å bruke at
d) Hva var høyeste og laveste temperatur ifølge modellen?
Løsning
Høyeste temperatur var
Laveste temperatur var
e) Hvor langt er tidsrommet mellom høyeste temperatur denne dagen og høyeste temperatur dagen etter?
Løsning
Oppgaven spør etter perioden . Tidsrommet i timer mellom høyeste temperatur denne dagen og dagen etter er
f) Vil modellen være gyldig utenom det aktuelle døgnet?
Løsning
Vi vet ikke noe om været dagen før eller dagen etter. Dersom været blir annerledes med for eksempel regn, vil modellen mest sannsynlig ikke passe særlig godt lenger.
En annen ting er at perioden ikke ble nøyaktig 24 timer. Det betyr at tidspunktene for den høyeste temperaturen kommer tidligere og tidligere for hver dag som går. Slik kan det ikke fortsette særlig lenge.
g) Hva var gjennomsnittstemperaturen dette døgnet?
Løsning
Gjennomsnittstemperaturen blir det samme som verdien for , altså 21,3°, siden tidsrommet er én periode.
h) Hva var gjennomsnittstemperaturen mellom klokka 06.00 og klokka 18.00?
Løsning
Her må vi regne ut et integral. Vi velger å bruke CAS i GeoGebra.
CAS-utregning av gjennomsnittstemperaturen mellom klokka 06.00 og klokka 18.00
Gjennomsnittstemperaturen i dette tidsrommet var 23,1°.
På teorisiden ser vi på svingninger i vannstanden på grunn av tidevann. Vi fikk dette resultatet:
Tidevann ved Mandal 3. og 4. november 2022. Måledata fra Kartverket
I denne oppgaven skal du laste ned måledataene fra Kartverket, som er vist på figuren over, og lage en modell for svingningene i vannstanden. Dataene kan lastes ned nedenfor. Husk å endre filnavnet etter nedlastingen.
Du kan også prøve å finne dataene selv på Kartverkets side for tidevann ved Mandal. Velg datoer fra 3. november 2022 til 4. november 2022, velg "Tabell" og "Hvert 10. minutt". Du må laste ned som ei tekstfil, importere tekstfila i Excel, passe på at tallene kommer i hver sin kolonne og eksportere regnearket som ei semikolonseparert csv-fil.
a) Åpne datafila med for eksempel et regneark. Finn i hvilke kolonner tidspunktene og måledataene står.
Løsning
De øverste 15 linjene er informasjon om målingene. Tidspunktene står i første kolonne inkludert dato. I andre kolonne er måledataene vi er på jakt etter. Tredje kolonne inneholder det som var forventet nivå (disse tallene skal vi ikke bruke).
b) Du kan lese fila inn i Python og se på resultatet av innlesingen med koden nedenfor.
python
1import pandas as pd
23data = pd.read_csv("tidevann.csv", header =None, skiprows =(range(0,15)), \
4 sep =";", encoding ="latin-1")5data.columns =["Tid","Vannstand","Ikke i bruk"]6print(data)
Først importeres biblioteket "pandas", som brukes til innlesingen av datafila.
I linje 3 leses datafila inn og lagres i datarammen data. Vi så i oppgave a) at det ikke var overskrifter i csv-fila. Derfor skriver vi header = None. Vi ønsker ikke å importere de 15 første radene, så vi spesifiserer det med kodeordet skiprows og funksjonen range. Med kodeordet sep angir vi at csv-fila er semikolonseparert. Kommandoen encoding = latin-1 gjør at vi kan ha for eksempel skandinaviske bokstaver i datafila.
I linje 5 lages det nye kolonneoverskrifter til datarammen data.
I linje 6 skrives datarammen ut til skjermen.
Resultatet blir omtrent som nedenfor, der de tre første målingene vises:
resultat
Tid
Vannstand
Ikke i bruk
0
2022-11-03T00:00:00+01:00
105.5
67.3
1
2022-11-03T00:10:00+01:00
105.7
67.3
2
2022-11-03T00:20:00+01:00
105.5
67.2
...
c) Ta utgangspunkt i programmet i forrige oppgave, gjør nødvendige endringer, og finn en sinusfunksjon som passer godt med måledataene. Plott både måledataene og modellen i samme koordinatsystem.
Tips 1
Det er vanskelig å bruke tidsangivelsen for måledataene direkte. Vi kan lage -verdiene vi trenger, ved å generere en array med funksjonen "arange" eller "linspace". Se utskriften av dataene for å finne ut hva -verdiene er.
Tips 2
Det kan hende modellen passer svært dårlig med måledataene, at regresjonen rett og slett feiler. Årsaken til det kan være at startverdiene regresjonsverktøyet bruker som utgangspunkt for de fire konstantene, ligger et stykke fra de riktige verdiene. Dette er tilfelle i forrige oppgave om temperaturen på Lindesnes. Løs i tilfelle problemet på samme måte ved å angi startverdier for konstantene i funksjonen ved hjelp av kodeordet p0.
Løsning
Regresjonen feiler også her uten å spesifisere startverdier for regresjonskonstantene med kodeordet p0. Det holder å sette nye startverdier for A og for k. Nedenfor finner du fullstendig kode.
python
1import pandas as pd
2import numpy as np
3from scipy.optimize import curve_fit
4import matplotlib.pyplot as plt
56# lager funksjonen som beskriver modellen7defmodell(x,A,k,fi,d):8return A*np.sin(k*x + fi)+ d
910data = pd.read_csv("tidevann.csv", header =None, skiprows =(range(0,15)), \
11 sep =";", encoding ="latin-1")12# lager overskrifter til kolonnene13data.columns =["Tid","Vannstand","Ikke i bruk"]14# lager liste med måleverdiene, som står i kolonnen med overskrift "Vannstand"15vannstand =list(data.Vannstand)16# lager array med x-verdiene (tidspunktene for målingene)17tid = np.arange(0,48+1/6,1/6)1819# bruker metoden curve_fit og legger resultatene i to lister20konstanter,kovarians = curve_fit(modell, tid, vannstand, p0 =[15,2*np.pi/12,1,1])21# henter ut konstantene fra lista konstanter22A, k, fi, d = konstanter
2324# lager utskrift av funksjonsuttrykket til modellen25print(f"Funksjonen blir f(x) = {A:.2f}sin({k:.3f}x{fi:+.2f}){d:+.2f}")26# lager y-verdier for modellen til plottingen av den27modellverdier = modell(tid,A,k,fi,d)28plt.plot(tid,vannstand,'.', label ="Målinger")# plotter måledataene29plt.plot(tid,modellverdier,"brown", label ="Modell")# plotter modellen30plt.grid(True)31plt.xlabel("Tid (timer)")32plt.ylabel("Vannstand (cm)")33plt.legend(bbox_to_anchor=(0.9,0.2))34# endrer på skalaen på x-aksen til å passe bedre med klokka35plt.xticks(np.arange(min(tid),max(tid)+1,3.0))36plt.show()
Programmet gir oss funksjonen
og plottet nedenfor.
d) Vurder resultatet i forrige deloppgave.
Løsning
Det finnes ikke en sinusfunksjon som passer godt til målingene av tidevannet siden vannstanden bare delvis følger en sinuskurve. Vi regner ut perioden til modellen.
På teorisiden har vi at tidsrommet mellom to høyvann, altså perioden, er 12,4 h. Vi får derfor litt for liten periode. Ellers kan vi si at amplituden og faseforskyvningen passer noenlunde med tallene for den 4. november, det vil si det andre døgnet. Likevektslinja er det vanskelig å si noe om, men det ser ut som den ligger på en slags gjennomsnittsverdi.
En amplitude på 11,3 cm gir en forskjell mellom høyvann og lavvann på 22,6 cm. Det er lite, siden vi har fra teorisiden at forskjellen for Mandal skal være 35 cm.
e) Siden vi vet at modellen bør ha periode på 12,4 h, kan vi endre modellen slik at programmet ikke bestemmer hva skal være, men lager en sinusfunksjon som har periode 12,4. Endre programmet slik at det bare er og som skal bestemmes. Kjør programmet og vurder om den nye modellen blir bedre enn den forrige.
Løsning
Vi regner ut først.
Koden kan se slik ut:
python
1import pandas as pd
2import numpy as np
3from scipy.optimize import curve_fit
4import matplotlib.pyplot as plt
56# lager funksjonen som beskriver modellen7defmodell(x,A,fi,d):8return A*np.sin(0.507*x + fi)+ d
910data = pd.read_csv("tidevann.csv", header =None, skiprows =(range(0,15)), \
11 sep =";", encoding ="latin-1")12# lager overskrifter til kolonnene13data.columns =["Tid","Vannstand","Ikke i bruk"]14# lager liste med måleverdiene, som står i kolonnen med overskrift "Vannstand"15vannstand =list(data.Vannstand)16# lager array med x-verdiene (tidspunktene for målingene)17tid = np.arange(0,48+1/6,1/6)1819# bruker metoden curve_fit og legger resultatene i to lister20konstanter,kovarians = curve_fit(modell, tid, vannstand, p0 =[15,1,1])21# henter ut konstantene fra lista konstanter22A, fi, d = konstanter
2324# lager utskrift av funksjonsuttrykket til modellen25print(f"Funksjonen blir f(x) = {A:.2f}sin(0.507x{fi:+.2f}){d:+.2f}")26# lager y-verdier for modellen til plottingen av den27modellverdier = modell(tid,A,fi,d)28plt.plot(tid,vannstand,'.', label ="Målinger")# plotter måledataene29plt.plot(tid,modellverdier,"brown", label ="Modell 2")# plotter modellen30plt.grid(True)31plt.xlabel("Tid (timer)")32plt.ylabel("Vannstand (cm)")33plt.legend(bbox_to_anchor=(0.9,0.2))34# endrer på skalaen på x-aksen til å passe bedre med klokka35plt.xticks(np.arange(min(tid),max(tid)+1,3.0))36plt.show()
Vi får funksjonen
Grafen til funksjonen har vi kalt "Modell 2" på figuren nedenfor.
Det ble ikke veldig stor endring. Det kan se ut som en periode på 12,4 timer er litt større enn tida mellom to høyvann, i alle fall for den andre dagen. Perioden til den første modellen passer litt bedre enn denne. Den nye modellen fikk ellers litt mindre amplitude enn den forrige, noe som passer enda dårligere med opplysningene om nivåforskjellen på tidevann for Mandal.
Et lodd henger i en spiralfjær. Vi drar loddet litt ned, slipper det og observerer at det svinger opp og ned.
Vi observerer også at svingeutslaget blir mindre og mindre etter hvert. Vi sier at svingningen er dempet. En generell sinusfunksjon passer ikke så godt til å modellere hvordan utslaget til loddet varierer med tida siden en slik funksjon svinger like mye hele tida. Men vi kan multiplisere sinusfunksjonen med faktoren der er en positiv konstant. Denne faktoren blir mindre og mindre jo større blir.
Nedenfor kan du dra i glideren og observere hvordan grafen til endrer seg når verdien for endres.
a) Konstanten sier noe om hvor stor dempingen er.
Hva skjer dersom du setter ?
b = 0
Da får vi , og funksjonen blir en ren sinusfunksjon uten demping.
b) Med en posisjonslogger kan vi logge utslaget til loddet. Vi har gjort det, og hvis du ikke kan gjøre forsøket selv, kan du laste ned loggfila nedenfor.
Vi må gjøre en regresjon med dataene for å bestemme konstanten . Funksjonen for svingebevegelsen blir
Det er derfor 5 konstanter som må finnes:
og
Vi velger å bruke Python og metoden curve_fit. For å regne ut kan vi bruke numpyfunksjonen exp(x).
Løsning
Forslag til programkode:
python
1import pandas as pd
2import numpy as np
3from scipy.optimize import curve_fit
4import matplotlib.pyplot as plt
56# lager funksjonen som beskriver modellen7defmodell(t,A,b,k,fi,d):8return A*np.exp(b*t)*np.sin(k*t + fi)+ d
910data = pd.read_csv("sving.csv", skiprows =(0,1), sep =";", encoding ="latin-1")1112# lager liste med måleverdiene, som står i kolonnen med overskrift "Utslag"13utslag =list(data.Utslag)14# lager liste med t-verdiene, som står i kolonnen med overskrift "Tid"15tid = np.array(list(data.Tid))1617# bruker metoden curve_fit og legger resultatene i to lister18konstanter,kovarians = curve_fit(modell, tid, utslag)19# henter ut konstantene fra lista konstanter20A, b, k, fi, d = konstanter
21# lager y-verdier for modellen til plottingen av den22modellverdier = modell(tid,A,b,k,fi,d)2324# lager plott av modell og målinger25plt.plot(tid,utslag,'.', label ="Målinger")# plotter måledataene26plt.plot(tid,modellverdier,"brown", label ="Modell")# plotter modellen27plt.grid(True)28plt.xlabel("Tid (s)")29plt.ylabel("Utslag (cm)")30# skriver ut funksjonen med matematisk tegnsetting31plt.suptitle(f"Modell: $f(x)={A:.2f}e^{{{b:.3f}t}}\sin({{{k:.3f}t{fi:+.2f}}}){d:+.2f}$")32plt.legend(bbox_to_anchor=(0.9,0.2))3334plt.show()
Koden gir utskriften nedenfor.
Dempede svingninger
Vi får at dempingskonstanten .
Kommentarer til koden:
I dette tilfellet var det ikke behov for å sette nye startverdier for regresjonskonstantene med kodeordet p0.
For å få penere utskrift av funksjonsuttrykket har vi lagt det inn som en undertittel i plottet. Der kan vi få matematisk formatering med LaTeX ved å sette funksjonsuttrykket mellom dollartegn ($). Siden sløyfeparenteser brukes både av LaTeX for å gruppere ting og av Python til å markere at noe i en tekststreng er en variabel, må vi bruke doble sløyfeparenteser der LaTeX vil ha sløyfeparentes. Vi bruker som før enkel sløyfeparentes rundt variabler. Noen steder blir det derfor tre sløyfeparenteser etter hverandre.
Koden \sin er LaTeX-kommandoen som gir "sin" som ikke står i kursiv.
c) Hvor lang tid tar det før utslaget til svingningen er halvert i forhold til det opprinnelige utslaget?
Løsning
Vi prøvde å løse likningen med CAS, men det gikk ikke bra.
Vi studerer funksjonen. Det er faktoren i funksjonen som gir dempingen av utslaget. Vi kan bruke at utslaget blir halvert når denne faktoren er 0,5. Dette gir oss likningen
Vi får at svingningene er halvert etter cirka 16 sekunder.
d) Hvor mange hele svingninger har loddet gjort da?
Løsning
Vi kan se på sinusdelen av funksjonen for å svare på dette. Antall hele svingninger blir hvor mange hele perioder sinusdelen har i løpet av de 16 sekundene.
Vi fikk at . Det betyr at
I løpet av 16 s blir antall perioder 2,55, så det går bare 2–3 hele svingninger før utslaget er halvert.