opgaver:Uge1mandag
Pia Jensen (Talk | contribs) |
m (moved opgaver:Uge 1 mandag to opgaver:Uge1mandag over redirect) |
||
(19 intermediate revisions by 2 users not shown) | |||
Line 4: | Line 4: | ||
− | == Simpel syntaks og kommando- | + | == Simpel syntaks og kommando-linje == |
− | === Opgave 1 === | + | === Opgave 1.1 === |
Lav en vektor bestående af de lige heltal mellem 31 og 75. | Lav en vektor bestående af de lige heltal mellem 31 og 75. | ||
{{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
− | Gå ind i MATLAB hjælp og søg på <code>colon</code>, og læs så ''<nowiki>Colon (:)</nowiki>'' artiklen. Du kan evt. også se på side 3-7 i | + | Gå ind i MATLAB hjælp og søg på <code>colon</code>, og læs så ''<nowiki>Colon (:)</nowiki>'' artiklen. Du kan evt. også se på side 3-7 i "MATLAB® Primer" (tidligere kaldet "Getting Started with MATLAB") bogen, der ligger på Absalon. |
Her vil du se at man kan lave en liste ved hjælp af koden <code>j:i:k</code>. Denne liste vil starte i <code>j</code> og lægge <code>i</code> til for hvert element, indtil den kommer til <code>k</code>. Hvis den ikke rammer <code>k</code> præcist, så vil den stoppe før den kommer over. | Her vil du se at man kan lave en liste ved hjælp af koden <code>j:i:k</code>. Denne liste vil starte i <code>j</code> og lægge <code>i</code> til for hvert element, indtil den kommer til <code>k</code>. Hvis den ikke rammer <code>k</code> præcist, så vil den stoppe før den kommer over. | ||
Line 21: | Line 21: | ||
{{hidden end}} | {{hidden end}} | ||
− | === Opgave 2 === | + | === Opgave 1.2 === |
Lad <code>x = [2 5 1 6]</code>. | Lad <code>x = [2 5 1 6]</code>. | ||
− | # | + | # Lav en ny vektor af <code>x</code> ved at addere 16 til hvert element. |
− | # | + | # Lav en ny vektor der indeholder alle ulige-indeks elementerne af <code>x</code>, adderet med 3. |
− | # Udregn kvadratroden af hvert element. | + | # Udregn kvadratroden af hvert element i <code>x</code>. |
− | # Udregn kvadratet af hvert element. | + | # Udregn kvadratet af hvert element i <code>x</code>. |
{{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
− | For at løse disse opgaver kan det være en god idé at se på | + | For at løse disse opgaver kan det være en god idé at se på "MATLAB® Primer" (tidligere kaldet "Getting Started with MATLAB") bogen, der ligger på Absalon. Læs om arrays fra side 3-21. Vær sikker på at du forstår hvornår man skal bruge punktum foran matematiske operatorer. |
{{hidden end}} | {{hidden end}} | ||
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
− | 1. For at lægge et tal til alle elementerne i et array skal man simpelthen | + | 1. For at lægge et tal til alle elementerne i et array skal man simpelthen bruge et plus. MATLAB forstår godt at et enkelt tal lagt til et array ikke giver mening, og laver derfor operationen på alle elementerne i arrayet: |
− | :<code>x + 16</code> | + | :<code>y = x + 16</code> |
2. For at lægge et tal til kun nogle bestemte elementer i et array skal man lægge det til array'et med indekserne man gerne vil have - skrevet her som en liste: | 2. For at lægge et tal til kun nogle bestemte elementer i et array skal man lægge det til array'et med indekserne man gerne vil have - skrevet her som en liste: | ||
− | :<code>x(1:2:end) + 3</code> | + | :<code>z1 = x(1:2:end) + 3</code> |
+ | |||
+ | alternativt kan man få hele <code>x</code>, hvor der kun er lagt 3 til de ønskede steder: | ||
+ | |||
+ | :<code>z2 = x + 3*[0 1 0 1]</code> | ||
+ | |||
+ | dette kan selvfølgelig også gøres endnu mere generelt ved at bruge loops (det behøver I ikke kunne endnu, men det er en god ting at læse op på!): | ||
+ | |||
+ | :<code>for i = 1:length(x)</code> | ||
+ | ::<code> if mod(i,2) == 0</code> | ||
+ | :::<code> bool = 0; %lige tal</code> | ||
+ | ::<code> else</code> | ||
+ | :::<code> bool = 1; %ulige tal</code> | ||
+ | ::<code> end</code> | ||
+ | ::<code> z3(i) = x(i) + 3*bool;</code> | ||
+ | :<code>end</code> | ||
+ | :<code>z3</code> | ||
3. Kvadratroden er en funktion i MATLAB, og funktioner der fungerer på skalarer fungerer automatisk element-vist. Derfor fås kvadratroden af hvert element i <code>x</code> ved | 3. Kvadratroden er en funktion i MATLAB, og funktioner der fungerer på skalarer fungerer automatisk element-vist. Derfor fås kvadratroden af hvert element i <code>x</code> ved | ||
Line 48: | Line 64: | ||
:<code>x.^2</code> | :<code>x.^2</code> | ||
− | Man kunne også | + | Man kunne også vælge at bruge |
:<code>x.*x</code> | :<code>x.*x</code> | ||
{{hidden end}} | {{hidden end}} | ||
− | === Opgave 3 === | + | === Opgave 1.3 === |
Lad <code>x = [3 2 6 8]'</code> og <code>y = [4 1 3 5]'</code>. (NB. <code>x</code> og <code>y</code> bør være søjlevektorer). | Lad <code>x = [3 2 6 8]'</code> og <code>y = [4 1 3 5]'</code>. (NB. <code>x</code> og <code>y</code> bør være søjlevektorer). | ||
Line 63: | Line 79: | ||
# Udregn <code>x'*y - w</code> og fortolk resultatet. | # Udregn <code>x'*y - w</code> og fortolk resultatet. | ||
{{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
− | Det kan være en god idé at se på MATLAB funktionen <code>sum</code>. Find selv information om den ved at åbne MATLAB hjælp og søge på den. | + | Det kan være en god idé at se på MATLAB funktionen <code>sum</code>. Find selv information om den ved at åbne MATLAB hjælp og søge på den. Her skal du også være sikker på at du forstår hvornår man skal bruge punktum foran matematiske operatorer. |
{{hidden end}} | {{hidden end}} | ||
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
Line 89: | Line 105: | ||
{{hidden end}} | {{hidden end}} | ||
− | === Opgave 4 === | + | === Opgave 1.4 === |
Udregn de følgende MATLAB udtryk i hånden, og brug så MATLAB til at tjekke resultaterne: | Udregn de følgende MATLAB udtryk i hånden, og brug så MATLAB til at tjekke resultaterne: | ||
# <code>2 / 2 * 3</code> | # <code>2 / 2 * 3</code> | ||
# <code>6 - 2 / 5 + 7 ^ 2 - 1</code> | # <code>6 - 2 / 5 + 7 ^ 2 - 1</code> | ||
− | # <code>10 / 2 \ | + | # <code>10 / 2 \ 3 - 3 + 2 * 4</code> |
# <code>3 ^ 2 / 4</code> | # <code>3 ^ 2 / 4</code> | ||
# <code>3 ^ 2 ^ 2</code> | # <code>3 ^ 2 ^ 2</code> | ||
Line 100: | Line 116: | ||
# <code>2 + floor(6 / 9 + 3 * 2) / 2 - 3</code> | # <code>2 + floor(6 / 9 + 3 * 2) / 2 - 3</code> | ||
# <code>2 + ceil(6 / 9 + 3 * 2) / 2 - 3</code> | # <code>2 + ceil(6 / 9 + 3 * 2) / 2 - 3</code> | ||
+ | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | Det kan hjælpe at skrive udtrykkene ind i MATLAB og tilføje parenteser så de bliver nemmere at læse. Hvis resultatet stadig er det samme efter parenteserne er blevet sat, så har du højst sandsynligt ikke misforstået noget. | ||
+ | {{hidden end}} | ||
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | For at vise hvad udtrykkene betyder, er de her omskrevet med ekstra parenteser: | ||
+ | |||
+ | #<code>2 / 2 * 3 = (2/2) * 3</code> | ||
+ | #<code>6 - 2 / 5 + 7 ^ 2 - 1 = 6 - (2/5) + (7^2) - 1</code> | ||
+ | #<code>10 / 2 \ 3 - 3 + 2 * 4 = 3/(10/2) - 3 + (2*4)</code> | ||
+ | #<code>3 ^ 2 / 4 = (3^2) / 4</code> | ||
+ | #<code>3 ^ 2 ^ 2 = (3^2) ^ 2</code> | ||
+ | #<code>2 + round(6 / 9 + 3 * 2) / 2 - 3 = 2 + (round((6/9) + (3*2))/2) - 3</code> | ||
+ | #<code>2 + floor(6 / 9 + 3 * 2) / 2 - 3 = 2 + (floor((6/9) + (3*2))/2) - 3</code> | ||
+ | #<code>2 + ceil(6 / 9 + 3 * 2) / 2 - 3 = 2 + (ceil((6/9) + (3*2))/2) - 3</code> | ||
+ | Bemærk at <code>round()</code> funktionen runder op/ned automatisk, mens <code>floor()</code> altid runder ned og <code>ceil()</code> altid runder op. | ||
{{hidden end}} | {{hidden end}} | ||
− | === Opgave 5 === | + | === Opgave 1.5 === |
Lav en vektor <code>x</code> med elementerne... | Lav en vektor <code>x</code> med elementerne... | ||
− | # <code>2, 4, 6, 8, | + | # <code>2, 4, 6, 8, 10</code> |
# <code>10, 8, 6, 4, 2, 0, -2, -4</code> | # <code>10, 8, 6, 4, 2, 0, -2, -4</code> | ||
− | # <code>1, 1/2, 1/3, 1/4, 1/5, | + | # <code>1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10</code> |
− | # <code>0, 1/2, 2/3, 3/4, 4/5, | + | # <code>0, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, 9/10, 10/11</code> |
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | Igen skal man gøre brug af kolon operatoren, mens man i de sidste to løser opgaven nemmest ved at lave flere lister og kombinere dem: | ||
+ | # <code>2:2:10</code> | ||
+ | # <code>10:-2:-4</code> | ||
+ | # <code>x = 1:10; 1./x</code> | ||
+ | # <code>x = 0:10; y = 1:11; x./y</code> | ||
+ | |||
+ | Det er vigtigt i den sidste af opgaverne at man laver de to arrays lige lange - ellers er det ikke muligt at dividere dem med hinanden element-vist. | ||
{{hidden end}} | {{hidden end}} | ||
− | === Opgave 6 === | + | === Opgave 1.6 === |
Lav en vektor <code>x</code> med elementerne | Lav en vektor <code>x</code> med elementerne | ||
Line 121: | Line 158: | ||
Summér elementerne i versionen af denne vektor med 100 elementer. | Summér elementerne i versionen af denne vektor med 100 elementer. | ||
− | {{hidden begin|toggle=right|title= | + | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} |
+ | Start med at lave en liste <code>n</code>, som du så kan udregne <code>x</code> ved hjælp af. Hvis du vil have 100 elementer laver du f.eks. | ||
+ | :<code> n = 1:100</code> | ||
+ | |||
+ | Og husk alle de nødvendige punktummer i udtrykket når du udregner <code>x</code>. | ||
+ | {{hidden end}} | ||
+ | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | Opgaven kan løses ved de følgende tre linjer: | ||
+ | :<code>n = 1:100</code> | ||
+ | :<code>x = ( (-1).^(n+1) ) ./ (2*n - 1)</code> | ||
+ | :<code>sum(x)</code> | ||
{{hidden end}} | {{hidden end}} | ||
− | === Opgave | + | === Opgave 1.7 === |
Givet en vektor, <code>t</code>, med længde <code>n</code>, lav MATLAB udtryk der vil udregne de følgende udtryk. Test at de virker for <code>t = 1:0.2:2</code>. | Givet en vektor, <code>t</code>, med længde <code>n</code>, lav MATLAB udtryk der vil udregne de følgende udtryk. Test at de virker for <code>t = 1:0.2:2</code>. | ||
Line 131: | Line 178: | ||
# e<sup>t</sup>(1 + cos(3t)) | # e<sup>t</sup>(1 + cos(3t)) | ||
# cos<sup>2</sup>(t) + sin<sup>2</sup>(t) | # cos<sup>2</sup>(t) + sin<sup>2</sup>(t) | ||
− | # tan<sup>-1</sup>( | + | # tan<sup>-1</sup>(t) (dette er den ''inverse'' tangentfunktion) |
# cot(t) | # cot(t) | ||
# sec<sup>2</sup>(t) + cot(t) - 1 | # sec<sup>2</sup>(t) + cot(t) - 1 | ||
+ | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | Alle de typiske matematiske funktioner som cos, sin og exp er allerede standardfunktioner i MATLAB, og de opererer element-vist. Husk dine punktummer når de er nødvendige. | ||
+ | |||
+ | Bemærk at inverse trigonometriske funktioner starter med <code>a</code>, som f.eks. <code>acos</code> eller <code>atan</code>. | ||
+ | {{hidden end}} | ||
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | Udtrykkene er stort set som man forventer de vil være, når bare man husker sine punktummer hvor de er nødvendige. | ||
+ | #<code>log(2+t+t.^2)</code> | ||
+ | #<code>exp(t).*(1 + cos(3*t))</code> | ||
+ | #<code>cos(t).^2 + sin(t).^2</code> | ||
+ | #<code>atan(t)</code> | ||
+ | #<code>cot(t)</code> | ||
+ | #<code>sec(t).^2 + cot(t) - 1</code> | ||
{{hidden end}} | {{hidden end}} | ||
Line 141: | Line 200: | ||
== Simple arrays == | == Simple arrays == | ||
− | === Opgave 1 === | + | === Opgave 2.1 === |
Givet <code>x = [3 1 5 7 9 2 6]</code>, forklar hvad de følgende kommandoer "betyder": | Givet <code>x = [3 1 5 7 9 2 6]</code>, forklar hvad de følgende kommandoer "betyder": | ||
Line 151: | Line 210: | ||
# <code>x([1 6 2 1 1])</code> | # <code>x([1 6 2 1 1])</code> | ||
# <code>sum(x)</code> | # <code>sum(x)</code> | ||
+ | # <code>x([true true false false true true false])</code> | ||
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
− | + | #<code>x(3)</code> er element nummer 3 i <code>x</code>. | |
+ | #<code>x(1:7)</code> er elementerne mellem (og inkl.) element 1 og 7, som en vektor. | ||
+ | #<code>x(1:end)</code> er alle elementer fra og med element 1 til og med det sidste element. | ||
+ | #<code>x(1:end-1)</code> er alle elementer fra og med element 1 til og med det næstsidste element. | ||
+ | #<code>x(6:-2:1)</code> er element 6,4,2 - altså alle elementer fra og med 6, med to mindre for hvert tal, indtil man når 1. | ||
+ | #<code>x([1 6 2 1 1])</code> giver <code>x</code>-elementerne i rækkefølgen element 1, 6, 2, 1 og 1 igen. | ||
+ | #<code>sum(x)</code> er summen af alle elementer i <code>x</code>. | ||
+ | #<code>x([true true false false true true false])</code> bruger et logisk array til at bestemme hvilke elementer der skal vises. | ||
{{hidden end}} | {{hidden end}} | ||
− | === Opgave 2 === | + | === Opgave 2.2 === |
Givet array'et <code>A = [ 2 4 1 ; 6 7 2 ; 3 5 9]</code>, find kommandoerne der behøves for at... | Givet array'et <code>A = [ 2 4 1 ; 6 7 2 ; 3 5 9]</code>, find kommandoerne der behøves for at... | ||
Line 163: | Line 230: | ||
# udregne summen over rækkerne i <code>A</code>. | # udregne summen over rækkerne i <code>A</code>. | ||
# udregne standardafvigelsen af gennemsnittet for hver kolonne i <code>A</code> (NB. standardafvigelsen af gennemsnittet er defineret som standardafvigelsen divideret med kvadratroden af antallet af elementer der bruges til at udregne gennemsnittet). | # udregne standardafvigelsen af gennemsnittet for hver kolonne i <code>A</code> (NB. standardafvigelsen af gennemsnittet er defineret som standardafvigelsen divideret med kvadratroden af antallet af elementer der bruges til at udregne gennemsnittet). | ||
− | {{hidden begin|toggle=right|title= | + | {{hidden begin|toggle=right|title=Hint|titlestyle=background:#ccccff|bg2=#eeeeee}} |
+ | Her skal du bruge kolon operatoren igen, og bemærke at den foruden at lave lister også kan bruges som et catch-all indeks i et array. Hvis du har et 1D array <code>x</code>, og skriver <code>x(:)</code>, får du bare hele array'et. | ||
+ | Det kan være en hjælp at læse lidt om funktionen <code>std()</code> i MATLAB hjælpen. | ||
+ | {{hidden end}} | ||
+ | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
+ | #<code>x1 = A(1,:)</code> | ||
+ | #<code>y = A(end-1:end,:)</code> | ||
+ | #<code>sum(A)</code> | ||
+ | #<code>sum(A,2)</code> | ||
+ | #<code>N = size(A,1); e = std(A)/sqrt(N)</code> | ||
{{hidden end}} | {{hidden end}} | ||
− | === Opgave 3 === | + | === Opgave 2.3 === |
Givet arrays'ene <code>x = [1 4 8]</code>, <code>y = [2 1 5]</code> og <code>A = [3 1 6 ; 5 2 7]</code>, find ud af hvilke udtryk der kan udføres korrekt, og giv resultaterne. Hvis udtrykket ikke kan udføres, så find ud af hvorfor. Kommandoen <code>whos</code> kan være smart at bruge her. | Givet arrays'ene <code>x = [1 4 8]</code>, <code>y = [2 1 5]</code> og <code>A = [3 1 6 ; 5 2 7]</code>, find ud af hvilke udtryk der kan udføres korrekt, og giv resultaterne. Hvis udtrykket ikke kan udføres, så find ud af hvorfor. Kommandoen <code>whos</code> kan være smart at bruge her. | ||
Line 178: | Line 254: | ||
# <code>A - 3</code> | # <code>A - 3</code> | ||
{{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | {{hidden begin|toggle=right|title=Løsning|titlestyle=background:#ccccff|bg2=#eeeeee}} | ||
− | + | # <code>x + y</code> virker, og den er en ny vektor der indeholder summen af de samme elementer i <code>x</code> og <code>y</code>. | |
+ | # <code>x + A</code> virker ikke, da <code>x</code> og <code>A</code> ikke har samme dimensioner. | ||
+ | # <code>x' + y</code> virker ikke, da <code>x'</code> er en søjlevektor og <code>y</code> er en rækkevektor. | ||
+ | # <code>A - [x' y']</code> virker ikke, da <code>A</code> er "flad" og <code>[x' y']</code> er "høj". | ||
+ | # <code>[x ; y']</code> virker ikke, da man ikke kan samle en matrix af to vektorer der har forskellige dimensioner på denne måde (en række og en søjle). | ||
+ | # <code>[x ; y]</code> virker, og laver en ny matrice med <code>x</code> i den første række og y i den anden. | ||
+ | # <code>A - 3</code> virker, og trækker 3 fra alle elementer i <code>A</code>. | ||
{{hidden end}} | {{hidden end}} | ||
+ | |||
+ | |||
+ | |||
+ | == Samlede løsninger == | ||
+ | * Et samlet dokument med MATLAB kode til at løse alle opgaverne ovenfor kan hentes her: [[Media:opgaver_uge1_1_bucknell.m|opgaver_uge1_1_bucknell.m]] |
Latest revision as of 10:28, 20 April 2014
Disse simple øvelser skal laves som en warm-up til MATLAB. Dem der allerede er trygge ved at bruge MATLAB kan nøjes med at skimme dem igennem - men det anbefales at I går igennem dem alle for at være sikre på at I ved hvad I laver!
Opgaverne er taget fra [1] (Basic syntax and command-line exercises 1-6 og 8, samt Basic array exercises 1-3).
Contents |
Simpel syntaks og kommando-linje
Opgave 1.1
Lav en vektor bestående af de lige heltal mellem 31 og 75.
Gå ind i MATLAB hjælp og søg på colon
, og læs så
Her vil du se at man kan lave en liste ved hjælp af koden j:i:k
. Denne liste vil starte i j
og lægge i
til for hvert element, indtil den kommer til k
. Hvis den ikke rammer k
præcist, så vil den stoppe før den kommer over.
Dette gøres med kolon-operatoren, der kan lave lister:
x = 32:2:75
Med denne kode starter listen ved 32 (det første af de lige tal vi gerne vil have), og stiger 2 hver gang, indtil den når til 75. Den når faktisk til 74, og ser så at 76 er over 75, og stopper derfor ved 74.
Opgave 1.2
Lad x = [2 5 1 6]
.
- Lav en ny vektor af
x
ved at addere 16 til hvert element. - Lav en ny vektor der indeholder alle ulige-indeks elementerne af
x
, adderet med 3. - Udregn kvadratroden af hvert element i
x
. - Udregn kvadratet af hvert element i
x
.
For at løse disse opgaver kan det være en god idé at se på "MATLAB® Primer" (tidligere kaldet "Getting Started with MATLAB") bogen, der ligger på Absalon. Læs om arrays fra side 3-21. Vær sikker på at du forstår hvornår man skal bruge punktum foran matematiske operatorer.
1. For at lægge et tal til alle elementerne i et array skal man simpelthen bruge et plus. MATLAB forstår godt at et enkelt tal lagt til et array ikke giver mening, og laver derfor operationen på alle elementerne i arrayet:
y = x + 16
2. For at lægge et tal til kun nogle bestemte elementer i et array skal man lægge det til array'et med indekserne man gerne vil have - skrevet her som en liste:
z1 = x(1:2:end) + 3
alternativt kan man få hele x
, hvor der kun er lagt 3 til de ønskede steder:
z2 = x + 3*[0 1 0 1]
dette kan selvfølgelig også gøres endnu mere generelt ved at bruge loops (det behøver I ikke kunne endnu, men det er en god ting at læse op på!):
for i = 1:length(x)
if mod(i,2) == 0
bool = 0; %lige tal
else
bool = 1; %ulige tal
end
z3(i) = x(i) + 3*bool;
end
z3
3. Kvadratroden er en funktion i MATLAB, og funktioner der fungerer på skalarer fungerer automatisk element-vist. Derfor fås kvadratroden af hvert element i x
ved
sqrt(x)
4. Kvadratet af en vektor er ikke det samme som kvadratet af alle elementerne hver for sig, og derfor skal man huske et punktum her:
x.^2
Man kunne også vælge at bruge
x.*x
Opgave 1.3
Lad x = [3 2 6 8]'
og y = [4 1 3 5]'
. (NB. x
og y
bør være søjlevektorer).
- Addér summen af elementerne i
x
tily
. - Hæv hvert element af
x
i potensen specificeret af det tilsvarende element iy
. - Dividér hvert element i
y
med det tilsvarende element ix
. - Gang hvert element i
x
med det tilsvarende element iy
, og gem resultatet i den ny variabelz
. - Addér elementerne i
z
og gem resultatet i den ny variabelw
. - Udregn
x'*y - w
og fortolk resultatet.
Det kan være en god idé at se på MATLAB funktionen sum
. Find selv information om den ved at åbne MATLAB hjælp og søge på den. Her skal du også være sikker på at du forstår hvornår man skal bruge punktum foran matematiske operatorer.
1. Her skal man bruge funktionen sum
, der summer over alle elementerne i den vektor den bliver fodret med,
y + sum(x)
2. Da vektorerne x
og y
har samme længde, er det bare at skrive (husk at bruge et punktum, så MATLAB forstår at du vil gøre det element-vist)
x.^y
3. Tilsvarende divideres der simpelthen ved
y./x
4. Den nye variabel defineres ved
z = x.*y
5. Igen bruges sum
funktionen, og
w = sum(z)
6. Hvis alt er blevet gjort korrekt, skulle man gerne se at x'*y - w
er lig med nul. Udtrykket x'*y
er et normalt prikprodukt mellem en rækkevektor (x
der er blevet transponeret med '
-operatoren) og en søjlevektor. Derimod er w
det manuelt udregnede prikprodukt.
Opgave 1.4
Udregn de følgende MATLAB udtryk i hånden, og brug så MATLAB til at tjekke resultaterne:
-
2 / 2 * 3
-
6 - 2 / 5 + 7 ^ 2 - 1
-
10 / 2 \ 3 - 3 + 2 * 4
-
3 ^ 2 / 4
-
3 ^ 2 ^ 2
-
2 + round(6 / 9 + 3 * 2) / 2 - 3
-
2 + floor(6 / 9 + 3 * 2) / 2 - 3
-
2 + ceil(6 / 9 + 3 * 2) / 2 - 3
Det kan hjælpe at skrive udtrykkene ind i MATLAB og tilføje parenteser så de bliver nemmere at læse. Hvis resultatet stadig er det samme efter parenteserne er blevet sat, så har du højst sandsynligt ikke misforstået noget.
For at vise hvad udtrykkene betyder, er de her omskrevet med ekstra parenteser:
2 / 2 * 3 = (2/2) * 3
6 - 2 / 5 + 7 ^ 2 - 1 = 6 - (2/5) + (7^2) - 1
10 / 2 \ 3 - 3 + 2 * 4 = 3/(10/2) - 3 + (2*4)
3 ^ 2 / 4 = (3^2) / 4
3 ^ 2 ^ 2 = (3^2) ^ 2
2 + round(6 / 9 + 3 * 2) / 2 - 3 = 2 + (round((6/9) + (3*2))/2) - 3
2 + floor(6 / 9 + 3 * 2) / 2 - 3 = 2 + (floor((6/9) + (3*2))/2) - 3
2 + ceil(6 / 9 + 3 * 2) / 2 - 3 = 2 + (ceil((6/9) + (3*2))/2) - 3
Bemærk at round()
funktionen runder op/ned automatisk, mens floor()
altid runder ned og ceil()
altid runder op.
Opgave 1.5
Lav en vektor x
med elementerne...
-
2, 4, 6, 8, 10
-
10, 8, 6, 4, 2, 0, -2, -4
-
1, 1/2, 1/3, 1/4, 1/5, 1/6, 1/7, 1/8, 1/9, 1/10
-
0, 1/2, 2/3, 3/4, 4/5, 5/6, 6/7, 7/8, 8/9, 9/10, 10/11
Igen skal man gøre brug af kolon operatoren, mens man i de sidste to løser opgaven nemmest ved at lave flere lister og kombinere dem:
-
2:2:10
-
10:-2:-4
-
x = 1:10; 1./x
-
x = 0:10; y = 1:11; x./y
Det er vigtigt i den sidste af opgaverne at man laver de to arrays lige lange - ellers er det ikke muligt at dividere dem med hinanden element-vist.
Opgave 1.6
Lav en vektor x
med elementerne
- xn = (-1)n+1/(2n-1)
Summér elementerne i versionen af denne vektor med 100 elementer.
Start med at lave en liste n
, som du så kan udregne x
ved hjælp af. Hvis du vil have 100 elementer laver du f.eks.
n = 1:100
Og husk alle de nødvendige punktummer i udtrykket når du udregner x
.
Opgaven kan løses ved de følgende tre linjer:
n = 1:100
x = ( (-1).^(n+1) ) ./ (2*n - 1)
sum(x)
Opgave 1.7
Givet en vektor, t
, med længde n
, lav MATLAB udtryk der vil udregne de følgende udtryk. Test at de virker for t = 1:0.2:2
.
- ln(2 + t + t2)
- et(1 + cos(3t))
- cos2(t) + sin2(t)
- tan-1(t) (dette er den inverse tangentfunktion)
- cot(t)
- sec2(t) + cot(t) - 1
Alle de typiske matematiske funktioner som cos, sin og exp er allerede standardfunktioner i MATLAB, og de opererer element-vist. Husk dine punktummer når de er nødvendige.
Bemærk at inverse trigonometriske funktioner starter med a
, som f.eks. acos
eller atan
.
Udtrykkene er stort set som man forventer de vil være, når bare man husker sine punktummer hvor de er nødvendige.
log(2+t+t.^2)
exp(t).*(1 + cos(3*t))
cos(t).^2 + sin(t).^2
atan(t)
cot(t)
sec(t).^2 + cot(t) - 1
Simple arrays
Opgave 2.1
Givet x = [3 1 5 7 9 2 6]
, forklar hvad de følgende kommandoer "betyder":
-
x(3)
-
x(1:7)
-
x(1:end)
-
x(1:end-1)
-
x(6:-2:1)
-
x([1 6 2 1 1])
-
sum(x)
-
x([true true false false true true false])
x(3)
er element nummer 3 ix
.x(1:7)
er elementerne mellem (og inkl.) element 1 og 7, som en vektor.x(1:end)
er alle elementer fra og med element 1 til og med det sidste element.x(1:end-1)
er alle elementer fra og med element 1 til og med det næstsidste element.x(6:-2:1)
er element 6,4,2 - altså alle elementer fra og med 6, med to mindre for hvert tal, indtil man når 1.x([1 6 2 1 1])
giverx
-elementerne i rækkefølgen element 1, 6, 2, 1 og 1 igen.sum(x)
er summen af alle elementer ix
.x([true true false false true true false])
bruger et logisk array til at bestemme hvilke elementer der skal vises.
Opgave 2.2
Givet array'et A = [ 2 4 1 ; 6 7 2 ; 3 5 9]
, find kommandoerne der behøves for at...
- definere en vektor
x1
der indholder den første række afA
. - definere et array
y
der indeholder de sidste 2 rækker afA
. - udregne summen over kolonnerne i
A
. - udregne summen over rækkerne i
A
. - udregne standardafvigelsen af gennemsnittet for hver kolonne i
A
(NB. standardafvigelsen af gennemsnittet er defineret som standardafvigelsen divideret med kvadratroden af antallet af elementer der bruges til at udregne gennemsnittet).
Her skal du bruge kolon operatoren igen, og bemærke at den foruden at lave lister også kan bruges som et catch-all indeks i et array. Hvis du har et 1D array x
, og skriver x(:)
, får du bare hele array'et.
Det kan være en hjælp at læse lidt om funktionen std()
i MATLAB hjælpen.
x1 = A(1,:)
y = A(end-1:end,:)
sum(A)
sum(A,2)
N = size(A,1); e = std(A)/sqrt(N)
Opgave 2.3
Givet arrays'ene x = [1 4 8]
, y = [2 1 5]
og A = [3 1 6 ; 5 2 7]
, find ud af hvilke udtryk der kan udføres korrekt, og giv resultaterne. Hvis udtrykket ikke kan udføres, så find ud af hvorfor. Kommandoen whos
kan være smart at bruge her.
-
x + y
-
x + A
-
x' + y
-
A - [x' y']
-
[x ; y']
-
[x ; y]
-
A - 3
-
x + y
virker, og den er en ny vektor der indeholder summen af de samme elementer ix
ogy
. -
x + A
virker ikke, dax
ogA
ikke har samme dimensioner. -
x' + y
virker ikke, dax'
er en søjlevektor ogy
er en rækkevektor. -
A - [x' y']
virker ikke, daA
er "flad" og[x' y']
er "høj". -
[x ; y']
virker ikke, da man ikke kan samle en matrix af to vektorer der har forskellige dimensioner på denne måde (en række og en søjle). -
[x ; y]
virker, og laver en ny matrice medx
i den første række og y i den anden. -
A - 3
virker, og trækker 3 fra alle elementer iA
.
Samlede løsninger
- Et samlet dokument med MATLAB kode til at løse alle opgaverne ovenfor kan hentes her: opgaver_uge1_1_bucknell.m