Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
Mas135 forelesning6
1. MAS135: MATLAB for Mechanical
Engineers
Forelesning 6 : FOR- og WHILE-løkker.
Elementvise operasjoner VS
kontrollstrukturer
Victoria Popsueva
Bergen, C208
17 september 2018
2. Programmering i MatLab
Denne uka:
• Løkker: for- og while-løkker
• Løkker inni løkker
• Kontrollstrukturer vs. operatorer
3. Løkker
• Sammen med betingede tester (if- og switch-setninger) kan vi
kontrollere flyten i et dataprogram vha. løkker.
• Vi skal gå gjennom to typer løkker:
1. For-løkker. De gangene vi VET HVOR MANGE GANGER vi skal gjøre
en operasjon. Kjører fra f.eks. i=1:10 – 10 ganger. Må ha en
«tellevariabel» for eksempel i
2. While-løkker. De gangene vi IKKE VET HVOR MANGE GANGER MEN
kjører så lenge et GITT VILKÅR ER OPPFYLT
4. FOR VS WHILE:
FOR-LØKKE
Kjører frem til n oppnår
sitt gitte maks-verdi.
Her: 15
WHILE-LØKKER
Kan ikke kjøre til uendelig.
Må stoppe en eller annen
Gang, f.eks. når vi er fornøyd
med presisjon. Eller når
leddene ikke endrer seg mer
enn et gitt tall.
5. For-løkke
• Når vi trenger å gjøre en operasjon flere gangar (og vi vet hvor mange
ganger), bruker vi en for-løkke.
• Syntaks:
for i = start : slutt
… en eller fleire kommandoer!
…
…
end
6. Eksempel: for-løkke
for i = 1 : 4
kvadrat=i^2;
fprintf(’%i kvadrert = %i n’,i,kvadrat);
end
• NB! Her er ikke i ein vektor, men en teller-variabel. Første
gang løkka kjører er i = 1, neste gang er i = 2 osv til i = 4
7. Oppgave
• Lag et skript som regner ut summen av en rekke ved hjelp av en løkke:
• 1 + 1/2 + 1/4 + 1/8 + 1/16 + 1/32 …. 1/(2^n)
• n blir spesifisert av brukeren.
• Regn ut for n=5,10,20.
• Hva skjer med rekka når n går mot ∞?
8. While-løkker
• Vi bruker while-løkker når vi skal gjenta en operasjon mange ganger,
men ikke vet hvor mange på forhånd.
• Løkka blir avsluttet når et vilkår er oppfylt. For eksempel hvis en skal
finne summen av en uendelig rekke og leddene blir mindre enn et gitt
tall.
9. While-løkker
• Vilkåret i løkka må inneholde minst en variabel.
• Når vilkåret ikkje lenger er oppfylt (sant), slutter løkka å gå.
• Variabelen i «vilkåret» må kunne endres for at vilkåret skal kunne bli
«usant»
• Hvis ikke denne variabelen blir endret mellom while og end vil vi få ei
uendelig løkke – vilkåret blir alltid oppfylt.
• Hvis vilkåret er ALDRI oppfylt vil ikke løkken starte.
• Vår forsiktig når vilkåret uformes!
10. Eksempel
Kode:
x=2; % Initialiserer variabelen x.
while x<= 17 % Løkka gjentar seg så lenge x<=17.
x=3*x % Regner ut x=3*x og skriver ut.
end % Avslutter løkka.
Resultat:
x =
6
x =
18
11. Lag et skript som regner ut ex for en gitt x ved å bruke
Taylorrekka til ex. Først, les inn x og spesifiser det
første leddet i rekka til å være 1. Bruk så en while-løkke
til å regne ut de påfølgende leddene og legg disse til
summen. La løkka stoppe når leddene blir mindre enn
0.0001 og når antall ledd er større enn 30.
Eksempel - ex
12. Løkker inni løkker
• Hvis det er hensiktsmessig kan en programmere løkker inni løkker.
• Struktur:
for k=1:n
for i=1:m
kommando
kommando
end
End
Og elles så mange man vil - men husk måtehold
14. Kontrollstrukturer vs. operatorer
• Kontrollstrukturene i MatLab (if, switch, for, while) er felles for mange
programmeringsspråk.
• I tillegg er det en del funksjoner og operatorer som er laget nettopp
for å slippe å bruke kontrollstrukturene.
• Eksempel er elementvise operasjonar (./ og .* og .^) og logiske
operatorar.
15. Kontrollstrukturer vs. operatorer
• Eksempel er et funksjonsplott. Løsning vha. løkke:
x = [0:0.2:5];
for i=1:length(x)
y(i)=0.5*sin(x(i))^2 – cos(x(i))^2;
end
plot(x,y)
16. Kontrollstrukturer vs. operatorer
• Eksempel er et funksjonsplott. Løsning vha. elementvise
operasjoner:
x = [0:0.2:5];
y = 0.5*sin(x).^2 – cos(x).^3;
plot(x,y)
• Når vi skal gjøre det samme med alle elementene i vektoren x er
det bra å bruke elementvise operasjonar. (Men det «ligger
kontrollstrukturer under som vi ikkje ser» – bare nærmere
«maskinspråket»)
17. Kontrollstrukturer vs. operatorer
• Et annet eksempel:
Lag en 3x5-matrise der verdien til hvert element i rekke nummer i og
kolonne nummer j er differansen mellom indeksene delt på summen
av indeksene: (i-j)/(j+i)
• Kan denne oppgaven løses vha. elementvise operasjoner? Eller må vi
bruke løkker??
• VI KAN IKKE LØSE DETTE VED ELEMENTVIS OPERASJON, fordi:
• 1) Vi kan ikke definere en operasjon som er LIK for alle elementene
• 2) Vi må ha direkte tilgang til rekke-og kolonneindekser i og j
18. Kontrollstrukturar vs. operatorar
rekker = 3;
kolonner = 5;
a = zeros(rekker, kolonner);
% Genererer elementene i matrisen a vha. to løkker.
for i=1:rekker
for j=1:kolonner
a(i,j)=(i-j)/(i+j);
end
end
19. Eksempel: bruk av relasjonsoperatorer
>> w = [0 2 1 -1 0 -2];
>> v = [4 -2 -1 5 0 1];
>> v<=w
ans =
0 1 1 0 1 0
>> t=v(v<=w)
t =
-2 -1 0