Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

Include Page
ITGK - Matlab - Meny
ITGK - Matlab - Meny

Kodeforståelsesoppgaver (total videotid: 33:13)

OppgaveVideotidBeskrivelseVanskelighetsgrad
Oppgave 4.1.1: Fprintf datatyper14:10Grunnleggende fprintf-bruk: prosent-tegn for å skrive ut forskjellige datatyper, og backslash for å skrive ut spesielle bokstaver.Lett
Oppgave 4.1.2: Fprintf utskriftsformattering13:22Hvordan ekstra tegn mellom prosent-tegnet og datatypebokstaven i fprintf-formatstrenger bestemmer hvordan utskriften til skjerm blir formattertMiddels
Oppgave 4.1.3: Fprintf med vektorer5:39Hvordan fprintf behandler vektorer som verdiargument.Middels

Kodeoppgaver (total videotid: 54:54)

OppgaveVideotidBeskrivelseVanskelighetstgrad
Oppgave 4.2.1: Penere Fahrenheit-utskrift7:23Bruk av fprintf for å få pent formattert utskrift.Lett
Oppgave 4.2.2: Kvadratrotestimat9:02Bruk av for-løkke til å beregne kvadratrot numerisk, vha Newtons metode.Middels

Kodeforståelsesoppgaver

Oppgave 4.1.1: Fprintf datatyper

Hva skrives ut hvis vi kjører dette scriptet?

Code Block
languagenone
titleoppgave_1.m
fprintf('Heltallet er %d\n', 1);
fprintf('Desimaltallet er %f\n', 2.5);
fprintf('Bokstaven er %c\n', 'a');
fprintf('Strengen er %s\n', 'hei');
fprintf('%d\n', 'a');
fprintf('%c\n', 97);
fprintf('\nHan sa:\n\t''Vi må gi 100 %%!''\n');

Videoforklaring (mm:ss)

 

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
Heltallet er 1
Desimaltallet er 2.500000
Bokstaven er a
Strengen er hei
97
a
Han sa:
	'Vi må gi 100 %!'

Oppgave 4.1.2: Fprintf utskriftsformattering

Hva skrives ut hvis vi kjører dette scriptet?

Code Block
titleoppgave_2
fprintf('%3d,', 1);
fprintf('%03d,', 1);
fprintf('%-3d,', 1);
fprintf('%-03d!\n', 1);
fprintf('%.2f,', 2.524);
fprintf('%6.2f,', 2.524);
fprintf('%06.2f,', 2.524);
fprintf('%-6.2f,', 2.524);
fprintf('%-06.2f!\n', 2.524);
fprintf('%5s,', 'hei');
fprintf('%05s,', 'hei');
fprintf('%-5s,', 'hei');
fprintf('%-05s!\n', 'hei');

Videoforklaring (mm:ss)

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
  1,001,1  ,1  !
2.52,  2.52,002.52,2.52  ,2.52  !
  hei,00hei,hei  ,hei00!

Oppgave 4.1.3: Tittel

Oppgavetekst

Code Block
 

Videoforklaring (mm:ss)

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
 

Oppgave 4.1.4: Tittel

Oppgavetekst

Code Block
 

Videoforklaring (mm:ss)

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
 

Oppgave 4.1.5: Tittel

Oppgavetekst

Code Block
 

Videoforklaring (mm:ss)

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
 

Oppgave 4.1.6: Tittel

Oppgavetekst

Code Block
 

Videoforklaring (mm:ss)

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
 

Oppgave x.y.z: Tittel

Oppgavetekst

Code Block
 

Videoforklaring (mm:ss)

Svar

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...

 

Kodeoppgaver

Oppgave 4.2.1: Penere Fahrenheit-utskrift

Fahrenheit-oversikten forteller oss ikke hvilken Celsius verdi de utskrevne Fahrenheit-verdiene tilsvarer. Utvid scriptet til å skrive ut en mer informativ linje som forklarer hvilken Celsius-verdi Fahrenheit-verdien tilsvarer.

Utdelt kode

fahrenheit.m

Videoforklaring (mm:ss)

Løsningsforslag

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
titlefahrenheit.m
svar = input('Ønsker du å skrive inn egne Celsius-verdier? (ja/nei) ', 's');
if strcmp(svar, 'ja')
    antall = input('Hvor mange verdier? ');
    for i = 1:antall
        celsius = input('Skriv inn Celsius-verdi: ');
        skriv_ut_fahr(celsius);
    end
else
    skriv_ut_fahr(-20);
    skriv_ut_fahr(0);
    skriv_ut_fahr(18);
    skriv_ut_fahr(37);
    skriv_ut_fahr(100);
end
Code Block
titleskriv_ut_fahr
function skriv_ut_fahr(celsius)
    fahr = cels2fahr(celsius);
    fprintf('Celsiusverdi %.2f tilsvarer Fahrenheitverdi %.2f\n', celsius, fahr);
end

 

 

Oppgave 4.2.2: Kvadratrotestimat

Du stoler ikke på at Matlabs innebygde funksjon sqrt er effektiv nok, og har funnet ut at du vil lage din egen. Du har innsett at siden , blir det å finne kvadratroten til et tall det samme som å finne nullpunktet til funksjonen  . Du har lært en metode for å finne nullpunkt, kalt Newtons metode, som fungerer slik:

  1.  Velg et første estimat for nullpunkt, , for funksjonen .

  2. Regn ut videre estimat for nullpunkt med formelen

(I vårt tilfelle er ).

Lag en funksjon som estimerer roten til et tall. Bruk 20 iterasjoner av Newtons metode, og . Sammenlign estimatene for kvadratroten av 4, 97 og 1e18 med estimatene fra sqrt.

Videoforklaring (mm:ss)

Løsningsforslag

...

titleHvis du har prøvd selv, trykk her for å se svaret...

...

titlekvadratrot.m

...

...

Du har nettopp laget en funksjon som estimerer kvadratroten til et tall, ved hjelp av 20 iterasjoner av Newtons metode. Du ønsker nå å vite hvordan utviklingen av estimatene er i hver iterasjon. Utvid funksjonen til å produsere utskrift som det følgende i hver iterasjon:

Utdelt kode

Expand
titlekvadratrot.m
Code Block
titlekvadratrot.m
function retur = kvadratrot(tall)
    x = 1;
    for i = 1:20
       x = x + (tall - x^2)/(2*x);
    end
    retur = x;
end

Videoforklaring (mm:ss)

Løsningsforslag

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
titlekvadratrot.m
function retur = kvadratrot(tall)
    x = 1;
    for i = 1:20
       ny_x = x + (tall - x^2)/(2*x);
       fprintf('Iterasjon #%d: x_%d = %.10f, x_%d = %.10f\n', i, i-1, x, i, ny_x);
       x = ny_x;
    end
    retur = x;
end

...

7:25Bruk av fprintf for å få formatert utskrift. Bygger på funksjonen skrevet i video 4.2.2.Lettt

...

Du har innsett at å bruke Matlabs input-funksjon uten å bruke 's'-parameteren er en sikkerhetsrisiko, siden den lar brukeren kjøre vilkårlig Matlab-kode. Du synes også at feilmeldingene som dukker opp hvis brukeren skriver inn et ugyldig tall er dårlige.

Lag en ny funksjon som leser inn og returnerer et tall fra brukeren. For at funksjonen skal kunne brukes så generelt som mulig, skal teksten som spør brukeren om å skrive inn et tall være en parameter. Funksjonen må bruke to-parameter-versjonen av input. Hvis brukeren skriver inn et ugyldig tall, skal funksjonen skrive ut en passende feilmelding og prøve å lese inn et tall på nytt.

Videoforklaring (mm:ss)

Løsningsforslag

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
titleles_inn_tall.m
function retur = les_inn_tall(melding)
    tallstr = input(melding, 's');
    tall = str2double(tallstr);
    er_ugyldig = isnan(tall);
    while er_ugyldig
        fprintf('Teksten %s kan ikke tolkes som et tall\n', tallstr);
        tallstr = input(melding, 's');
        tall = str2double(tallstr);
        er_ugyldig = isnan(tall);
    end
    retur = tall;
end
12:14Bruk av while-løkker for kjøring av kode så lenge en betingelse er sann, samt bruk av fprintf for å skrive informative feilmeldinger. Ulemper med å bruke funksjonen input med bare én parameter, og funksjonen str2num, diskuteres også.Middels
Oppgave 4.2.5:

...

Tidligere lagde du et script som lot brukeren skrive inn en rekke Celsius-verdier, og konverterte én og én til Fahrenheit. I scriptet måtte brukeren bestemme seg på forhånd for hvor mange Celsius-verdier som skulle skrives inn.

Endre scriptet slik at brukeren kan skrive inn et vilkårlig antall Celsius-verdier. Hvis brukeren trykker enter uten å skrive noe, skal scriptet avslutte. 

Utdelt kode

Expand
titlefahrenheit.m
Code Block
titlefahrenheit.m
svar = input('Ønsker du å skrive inn egne Celsius-verdier? (ja/nei) ', 's');
if strcmp(svar, 'ja')
    antall = input('Hvor mange verdier? ');
    for i = 1:antall
        celsius = input('Skriv inn Celsius-verdi: ');
        skriv_ut_fahr(celsius);
    end
else
    skriv_ut_fahr(-20);
    skriv_ut_fahr(0);
    skriv_ut_fahr(18);
    skriv_ut_fahr(37);
    skriv_ut_fahr(100);
end 
Expand
titleskriv_ut_fahr.m
Code Block
titleskriv_ut_fahr.m
function skriv_ut_fahr(celsius)
    fahr = cels2fahr(celsius);
    fprintf('Celsiusverdi %.2f tilsvarer Fahrenheitverdi %.2f\n', celsius, fahr);
end 
Expand
titleles_inn_tall.m
Code Block
titleles_inn_tall.m
function retur = les_inn_tall(melding)
    tallstr = input(melding, 's');
    tall = str2double(tallstr);
    er_ugyldig = isnan(tall);
    while er_ugyldig
        fprintf('Teksten %s kan ikke tolkes som et tall\n', tallstr);
        tallstr = input(melding, 's');
        tall = str2double(tallstr);
        er_ugyldig = isnan(tall);
    end
    retur = tall;
end 

 

Videoforklaring (mm:ss)

Løsningsforslag

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
titlefahrenheit.m
svar = input('Ønsker du å skrive inn egne Celsius-verdier? (ja/nei) ', 's');
if strcmp(svar, 'ja')
    celsius = les_inn_tall('Skriv inn Celsius-verdi: ');
    while ~isempty(celsius)
        skriv_ut_fahr(celsius);
        celsius = les_inn_tall('Skriv inn Celsius-verdi: ');
    end
else
    skriv_ut_fahr(-20);
    skriv_ut_fahr(0);
    skriv_ut_fahr(18);
    skriv_ut_fahr(37);
    skriv_ut_fahr(100);
end 
Code Block
titleles_inn_tall.m
function retur = les_inn_tall(melding)
    tallstr = input(melding, 's');
    tall = str2double(tallstr);
    er_ugyldig = isnan(tall);
    while er_ugyldig && ~isempty(tallstr)
        fprintf('Teksten %s kan ikke tolkes som et tall\n', tallstr);
        tallstr = input(melding, 's');
        tall = str2double(tallstr);
        er_ugyldig = isnan(tall);
    end
    if isempty(tallstr)
        retur = [];
    else
        retur = tall;
    end
end 
10:25Bruk av while-løkker for å gjøre innlesing av referanseverdier i Fahrenheit-scriptet mer fleksibelt. Også bruk og utvidelse av funksjon fra oppgave 4.2.4.Middels
Oppgave 4.2.6:

...

...

Tidligere lagde du en funksjon som estimerte kvadratroten av et tall ved å bruke et fast antall iterasjoner av Newtons metode. Du har imidlertid innsett at dette gir unøyaktige svar i noen tilfeller, og unødvendig mange iterasjoner i andre tilfeller. Du ønsker derfor å tilpasse antall iterasjoner til verdien vi skal estimere kvadratroten av. En måte å gjøre dette på, er å kjøre Newtons metode helt til relativ endring av verdien er mindre enn en viss grense. Formelen for relativ endring, er .

Endre funksjonen til å regne ut kvadratrot med en relativ feilgrense på 1e-9.

Utdelt kode

Expand
titlekvadratrot.m
Code Block
titlekvadratrot.m
function retur = kvadratrot(tall)
    x = 1;
    for i = 1:20
       ny_x = x + (tall - x^2)/(2*x);
       fprintf('Iterasjon #%d: x_%d = %.10f, x_%d = %.10f\n', i, i-1, x, i, ny_x);
       x = ny_x;
    end
    retur = x;
end

Videoforklaring (mm:ss)

Løsningsforslag

Expand
titleHvis du har prøvd selv, trykk her for å se svaret...
Code Block
titlekvadratrot.m
function retur = kvadratrot(tall)
    x = 1;
    er_over_feilgrense = true;
    i = 1;
    while er_over_feilgrense
       ny_x = x + (tall - x^2)/(2*x);
       fprintf('Iterasjon #%d: x_%d = %.10f, x_%d = %.10f\n', i, i-1, x, i, ny_x);
       relativ_endring = abs(ny_x - x)/x;
       er_over_feilgrense = relativ_endring >= 1e-9;
       x = ny_x;
       i = i + 1;
    end
    retur = x;
end

Oppgave x.y.z: Tittel

 

Utdelt kode

Videoforklaring (mm:ss)

Løsningsforslag

...

titleHvis du har prøvd selv, trykk her for å se svaret...
8:25Bruk av while-løkker til å gjøre en beregning helt til svaret er under en gitt feilgrense. Generell teknikk for å kjøre én iterasjon av while-løkken først.Middels

Alle oppgavene på en side

 Oppgavevideoer uke 39 - alle oppgaver

...