Computational comments. Øyvind Ryan

Like dokumenter
Examples plotting. Øyvind Ryan

MAT1120 Plenumsregningen torsdag 26/8

Examples MAT1110. Øyvind Ryan

Matriser. Kapittel 4. Definisjoner og notasjon

4 Matriser TMA4110 høsten 2018

Øving 2 Matrisealgebra

Noen MATLAB-koder. 1 Plotte en vanlig funksjon. Fredrik Meyer. 23. april 2013

MAT 1110: Obligatorisk oppgave 1, V-07: Løsningsforslag

Oppgaver til seksjon med fasit

Lineære likningssystemer og matriser

Vær OBS på at svarene på mange av oppgavene kan skrives på flere ulike måter!

MAT 1110: Bruk av redusert trappeform

Fasit til utvalgte oppgaver MAT1110, uka 13/4-16/4

Lineær Algebra og Vektorrom. Eivind Eriksen. Høgskolen i Oslo, Avdeling for Ingeniørutdanning

1 Gauss-Jordan metode

Obligatorisk innleveringsoppgave, løsning Lineær algebra, Våren 2006

7.4 Singulærverdi dekomposisjonen

UNIVERSITETET I OSLO

Gauss-Jordan eliminasjon; redusert echelonform. Forelesning, TMA4110 Fredag 18/9. Reduserte echelonmatriser. Reduserte echelonmatriser (forts.

Løsningsforslag til prøveeksamen i MAT 1110, våren 2006

TMA Kræsjkurs i Matlab. Oppgavesett 1/3

UNIVERSITETET I OSLO

Løsningsforslag øving 6

6 Determinanter TMA4110 høsten 2018

Øving 3 Determinanter

Oblig 2 - MAT1120. Fredrik Meyer 23. september 2009 A =

Matlab for MAT1110 (revidert versjon våren 2010) Klara Hveberg, Tom Lindstrøm, og Øyvind Ryan

Lineær algebra-oppsummering

MATLAB for MAT Klara Hveberg og Tom Lindstrøm

SIF5005 Matematikk 2, 13. mai 2002 Løsningsforslag

MATLAB for MAT (revidert versjon våren 2008) Klara Hveberg og Tom Lindstrøm

UNIVERSITETET I OSLO

Lineære ligningssystemer og gausseliminasjon

Til enhver m n matrise A kan vi knytte et tall, rangen til A, som gir viktig informasjon.

Forelesning 22 MA0003, Mandag 5/ Invertible matriser Lay: 2.2

Matriseoperasjoner. E.Malinnikova, NTNU, Institutt for matematiske fag. September 22, 2009

MAT1120 Repetisjon Kap. 1, 2 og 3

Klara Hveberg, 26 sylen under pivot-elementet, ma vi na bare trekke (3; 2)=(2; 2) = 8=2 = 4 ganger andre rad fra tredje rad >> k=(3,2)/(2,2); >> (3,:)

dg = ( g P0 u)ds = ( ) = 0

Repetisjon: Om avsn og kap. 3 i Lay

MAT-1004 Vårsemester 2017 Obligatorisk øving 2

Løsningsforslag: MAT 1110 Obligatorisk oppgave 2, V-12

I dette kapittelet skal vi studerer noen matematiske objekter som kalles matriser. Disse kan blant annet brukes for å løse lineære likningssystemer.

CAS GeoGebra. Innhold. Matematikk for ungdomstrinnet

Vektorligninger. Kapittel 3. Vektorregning

Gauss-eliminasjon og matrisemultiplikasjon

Diagonalisering. Kapittel 10

Lineære ligningssystemer og gausseliminasjon

Mer om kvadratiske matriser

Lineær algebra. H. Fausk i=1 a ix i. Her har vi oppgitt hva ledd nummer i skal være og hvilke indekser i vi summerer over.

Matematikk Øvingsoppgaver i numerikk leksjon 8 Matriser. Løsningsforslag

Bytte om to rader La Matlab generere en tilfeldig (4 4)-matrise med heltallige komponenter mellom 10 og 10 ved kommandoen Vi skal underske hva som skj

1. Finn egenverdiene og egenvektorene til matrisen A = 2 1 A =

Kort innføring i MATLAB

Løsningsforslag til eksamen i MAT 1100 H07

Egenverdier for 2 2 matriser

Lineære likningssett.

Mer om kvadratiske matriser

Newtons metode er en iterativ metode. Det vil si, vi lager en funksjon. F x = x K f x f' x. , x 2

Denne labøvelsen gir en videre innføring i elementær bruk av programmet Maple.

MAT1120 Oppgaver til plenumsregningen torsdag 25/9

MAT1120 Repetisjon Kap. 1

Fasit til utvalgte oppgaver MAT1110, uka 28/4-2/5

NTNU. MA1103 Flerdimensjonal analyse våren Maple/Matlab-øving 2. Viktig informasjon. Institutt for matematiske fag

7.1 forts. Schur triangularisering og spektralteoremet

Egenverdier og egenvektorer

Løsningsforslag B = 1 3 A + B, AB, BA, AB BA, B 2, B 3 C + D, CD, DC, AC, CB. det(a), det(b)

Lineær algebra. H. Fausk i=1 a ix i. Her har vi oppgitt hva ledd nummer i skal være og hvilke indekser i vi summerer over.

Matematikk Øvingsoppgaver i numerikk leksjon 9. Løsningsforslag

MAT-1004 Vårsemester 2017 Prøveeksamen

Tall, vektorer og matriser

Repetisjon: om avsn og kap. 3 i Lay

MAT1120 Oppgaver til plenumsregningen torsdag 18/9

Matematikk Øvingsoppgaver i numerikk leksjon 6. Løsningsforslag

MAT-INF 2360: Obligatorisk oppgave 1

6.4 Gram-Schmidt prosessen

tma4110 Matematikk 3 Notater høsten 2018 Øystein Skartsæterhagen Morten Andreas Nome Paul Trygsland

5.5 Komplekse egenverdier

Til enhver m n matrise A kan vi knytte et tall, rangen til A, som gir viktig informasjon.

Appendiks: Innføring i MATLAB

TMA4110 Matematikk 3 Eksamen høsten 2018 Løsning Side 1 av 9. Løsningsforslag. Vi setter opp totalmatrisen og gausseliminerer:

ITGK - H2010, Matlab. Repetisjon

5.8 Iterative estimater på egenverdier

A 2 = PDP 1 PDP 1 = PD 2 P 1. og ved induksjon får vi. A k = PD k P 1. Kommentarer:

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

MA0002 Brukerkurs i matematikk B Vår 2016

Løsningsforslag. Innlevering i BYFE 1000 Oppgavesett 1 Innleveringsfrist: 10. oktober klokka 14:00 Antall oppgaver: 6. Oppgave 1

Obligatorisk oppgave 1

TDT4105 Informasjonsteknologi, grunnkurs (ITGK)

Matematikk Øvingsoppgaver i numerikk leksjon 2 Løsningsforslag

MAT1030 Diskret matematikk

MAT-INF 1100: Obligatorisk oppgave 1

Kap. 7 Symmetriske matriser og kvadratiske former

TDT4105 Informasjonsteknologi, grunnkurs. Introduksjon til programmering i Matlab. Rune Sætre / Anders Christensen {satre,

Manual for wxmaxima tilpasset R2

Matematikk Øvingsoppgaver i numerikk leksjon 3. Løsningsforslag

Løsningsforslag til eksamen i MA1202/MA6202 Lineær algebra med anvendelser høsten 2009.

NTNU. MA1103 Flerdimensjonal Analyse våren Maple-øving 2. Viktig informasjon. Institutt for matematiske fag. maple02 28.

MAT1110: Obligatorisk oppgave 2, V Løsningsforslag

Transkript:

Computational comments Øyvind Ryan 19. februar 2013

MATLAB-kommentar: For å regne med vektorer i MATLAB, må du første skrive dem inn. Du kan skrive inn radvektorene a = (1, 2,3,0,5) og b = (3, 2.4, 2,0) ved hjelp av kommandoene: a=[1,-2,3,0,5] b=[3,-2.4,-2,0] Legg merke til at vi bruker hakeparenteser [,] og ikke runde parenteser (,) for å beskrive vektorer. Du kan også erstatte kommaene mellom komponentene med mellomrom: a=[1-2 3 0 5] b=[3-2 4-2 0] Når vektorene er skrevet inn, kan du regne med dem ved å bruke kommandoer av typen >>a+b, >>a-b, >>7*a. Skalarproduktet får du ved å skrive >>dot(a,b). Kommandoen fungerer både for rad- og søylevektorer. Vil du skrive inn en søylevektor 1 c = 3 2, må du bruke semikolon mellom komponentene: c=[-1;3;2] Når du skriver vektorer i MATLAB, er det viktig å ha tenkt igjennom om du ønsker radvektorer eller søylevektorer; du kan ikke regne med at MATLAB skjønner at du mener en søylevektor når du skriver en radvektor! MATLAB-kommentar: MATLAB har en egen kommando for å regne ut lengden (eller normen) til en vektor a. Vi skriver >>norm(a). Kommandoen fungerer både for rad- og søylevektorer. MATLAB-kommentar: Du kan bruke MATLAB til å regne ut kryssproduktet til to vektorer a,b R 3 ved å skrive cross(a,b). Kommandoen fungerer både for radog søylevektorer, men forutsetter naturlig nok at vektorene er tredimensjonale. MATLAB-kommentar: MATLAB egner seg utmerket for matriseregning. Ordet MATLAB er faktisk en forkortelse for matrix laboratory, og programmet startet sin karriere som et undervisningsverktøy i lineær algebra. Du kan skrive inn en matrise 2 1 3 A = 1 0 3 4 0 1 i MATLAB ved med kommandoen 2

>>A=[2-1 3 1 0-3 4 0 1] Legg merke til at vi bruker hakeparenteser for å definere matriser, akkurat som med vektorer. Du kan også markere linjeskiftene med semikolon: >>A=[2-1 3;1 0-3;4 0 1] Mellom to elementer på samme rad er det nok med et mellomrom. Synes du dette blir uoversiktlig, kan du bruke komma isteden: >> A=[2,-1,3;1,0,-3;4,0,1] MATLAB utfører regneoperasjoner for matriser med enkle kommandoer. Har du lagt inn matrisene A og B, vil kommandoene >> A+B >> A-B få MATLAB til å regne ut henholdsvis summen A +B, og differensen A B. Dette forutsetter at matrisene har riktige dimensjoner slik at regneoperasjonene er definert (hvis ikke svarer MATLAB med en feilmelding av typen: Matrix dimensions must agree). For å finne ut på forhånd om to matriser kan legges sammen kan vi finne dimensjonene til matrisen ved å skrive >> [m,n] = size(a) Kommandoen >> 3*A ganger alle elementene i matrisen A med tallet 3. Matrisen 3A 2B kan regnes ut ved å skrive >>3*A-2*B. Den transponerte til A får du ved å skrive >>A, og produktet mellom en matrise A og en vektor b er gitt ved kommandoen >>A*b. Alle disse kommandoene forutsetter som over at matrisene og vektorene har riktige dimensjoner slik at regneoperasjonene gir mening. MATLAB oppfatter vektorer som spesialtilfeller av matriser. En radvektor b = (b 1,b 2,...,b n ) er altså en 1 n-matrise. En søylevektor c = 3 c 1 c 2. c m

oppfattes som en m 1-matrise. Transponerer vi en radvektor i MATLAB får vi en søylevektor, og omvt. Ved hjelp av Symbolic math Toolbox kan vi også regne alle operasjonene fra denne seksjonen symbolsk. Dette kan være nyttig, siden MATLAB ellers gjør numeriske avrundinger i alle operasjoner den gjør. Hvis vi i koden over i stedet skriver >>A=sym([2-1 3;1 0-3;4 0 1]) så vil alle elementene i matrisen representeres eksakt av MATLAB, alle operasjoner med den vil gjøres uten avrundinger, og alle svar blir skrevet opp eksakt. MATLAB gir deg også mange muligheter til å sette sammen og ta fra hverandre matriser. Dersom A er 3 3-matrisen og B er 3 2-matrisen A = B = 2 3 1 0 1 3 4 2 1 7 4 2 5 1 3 kan vi skjøte sammen A og B til 3 5-matrisen ved å gi kommandoen» C=[A B] C = 2 3 1 7 4 0 1 3 2 5 4 2 1 1 3 Du kan skrive ut komponentene til en matrise med enkle kommandoer:» A(1,2) skriver ut elementet i første rad, andre søyle i A (legg merke til at vi nå bruker runde parenteser, og ikke de firkantede vi bruker til å bygge matriser). Vil du skrive ut hele den første raden, gir du kommandoen» A(1,:) 4

mens» A(:,2) skriver ut den andre søylen. Du kan også bruke kolon-notasjon til å plukke ut andre deler av en matrise. Starter vi med 3 5-matrisen C ovenfor, vil» C(2:3,1:4) gi deg undermatrisen ( 0 1 3 2 4 2 1 1 som består av komponentene som ligger fra annen til tredje rad (det er dette [2:3] står for) og fra første til fjerde søyle (det er dette [1:4] står for). Kommandoen» C([1 3],[2 5]) gir deg matrisen ( 3 4 2 3 beståe av elementene som ligger i første og tredje rad og annen og femte søyle. Du kan også bruke denne notasjonen til å bytte om på radene eller søylene til en matrise. Skriver du» C([3 1 2],:) får du ut matrisen 4 2 1 1 3 2 3 1 7 4 0 1 3 2 5 der radene i den opprinnelige matrisen C nå kommer i rekkefølgen 3,1,2. Kommandoen» C(:,[3 1 2 5 4]) vil på tilsvare måte bytte om på søylene i C. I tillegg finnes i MATLAB enkelte kommandoer som genererer enkelte matriser vi ofte får bruk for. Spesielt gjelder dette matriser som bare inneholder nuller, og matriser som bare inneholder enere: A=zeros(3,4) A=ones(3,4) % 3x4-matrisen med bare nuller % 3x4-matrisen med bare enere 5 ) )

MATLAB-kommentar: Har du skrevet inn to matriser A og B med passe dimensjoner, får du MATLAB til å regne ut produktet ved å skrive >> A*B Kommandoen >> A^7 regner ut sjue potensen til A (dvs. A ganget med seg selv 7 ganger). Matrisemultiplikasjon kan også implementeres direkte i MATLAB slik: function C=mult(A,B) [m,n]=size(a); [n1,k]=size(b); C=zeros(m,k); if n1~=n disp( Matrisenes dimensjoner matcher ikke! ); else for r=1:m for s=1:k for t=1:n C(r,s) = C(r,s) + A(r,t)*B(t,s); Legg merke til at det i koden testes på om dimensjonene til de to matrisene er slik at multiplikasjonen kan gjennomføres. Hvis ikke skrives det ut en feilmelding ved hjelp av funksjonen disp. Sammenligner du kjøring av denne koden med å skrive A*B vil du merke stor forskjell - ihvertfall når matrisene er store. Fo å gjøre en slik sammenligning kan vi skrive A=rand(100); B=rand(100); tic A*B; toc tic mult(a,b); toc 6

Her lages to (tilfeldig genererte) 100 100-matriser, som multipliseres ved hjelp av de to metodene. Dette lar seg selvfølgelig ikke gjøres for hånd, så her er vi avhengig av å bruke et program som MATLAB. tic og toc starter og henholdsvis stopper den innebygde tidtakingen i MATLAB, og skriver ut på skjermen hvor lang tid som ble brukt. Sammenligner du tidene som ble brukt vil du se store forskjeller. Man skulle kanskje tro at operasjoner på matriser utføres av MATLAB gjennom rene implementasjoner med for-løkker som over. For matrisemultiplikasjon ser det altså ut som dette kanskje ikke er tilfellet. Vi skal ikke komme inn på hvordan MATLAB faktisk utfører matrisemultiplikasjon, men bare nevne at det kan være flere årsaker til at MATLABs implementasjon er raskere. For det første kan det he at MATLAB kaller mer effektive bibliotek for å multiplisere matriser, som til og med kan være implementert i raskere programmeringsspråk. For det andre kan det tenkes at det finnes algoritmer for matrisemultiplikasjon som utfører mindre regnearbeid, det vil si utfører færre multiplikasjoner og addisjoner. For matrisemultiplikasjon så er det kanskje vanskelig å forestille seg at dette kan være mulig: det ser jo ut til at antall addisjoner og multiplikasjoner som gjøres når man ganger sammen to n n-matriser er n 3, uansett! Men man kan faktisk omskrive hele multiplikasjonsprosessen slik at antall regneoperasjoner blir færre enn dette. Vi skal imidlertid ikke komme nærmere inn på hvordan, siden dette er ganske vanskelig stoff som går lenger enn teorien i denne boka. Senere skal vi imidlertid se på andre operasjoner enn matrisemultiplikasjon, der det er klart at man kan finne smarte implementasjoner som vesentlig reduserer antall addisjoner og multiplikasjoner. MATLAB-kommentar: Det er en egen kommando for identitetsmatrisen I n i MATLAB du skriver >>eye(n) (der n er tallet du ønsker). Skriver du»eye(3,4) får vi matrisen 1 0 0 0 0 1 0 0, 0 0 1 0 altså 3 4-matrisen med 1 på diagonalen der radindeks er lik søyleindeks. Vi skal komme tilbake til slike matriser som har kun nuller utenfor diagonalen. Mer generelle slike kan også lages med MATLAB: Skriver vi diag(a) der a er en vektor, vil vi få returnerert en matrise med bare nuller utenfor diagonalen, og med elementene i vektoren a på diagonalen. Den inverse matrisen til A får du ved å skrive >>inv(a). MATLAB-kommentar: MATLAB regner ut determinanten til A når du skriver >>det(a). MATLAB-kommentar: For å plotte med MATLAB trenger vi først lage et sett plottepunkter. Det vanlige er å lage et sett punkter der det er lik avstand mellom plottepunktene. Det er mange måter vi kan få ut en slik samling punkter på. Vi 7

kan blant annet bruke komamndoen linspace: Skriver vi linspace(0,2*pi,100) vil vi få returnert en radvektor med 100 elementer, der punktene er en uniform partisjon av tall mellom 0 og 2π. Skriver vi 0:0.01:(2*pi) vil vi også få ut en samling punkter mellom 0 og 2π, men denne gang med avstand 0.01 mellom punktene. Mer generelt vil 1:2:10 returnere radvektoren med 5 elementer med annethvert tall fra 1 til 10 (2 angir steglengden), og 1:10 returnerer radvektoren med 10 elementer med alle heltall fra 1 til 10 (steglengde antas være 1 av MAT- LAB når den ikke er angitt). Du kan få MATLAB til å tegne parametriserte kurver i planet ved å bruke kommandoen plot på vanlig måte. Vil du tegne sirkelen r(t) = (cos t,sin t) t [0,2π] kan du for eksempel skrive t=linspace(0,2*pi,100); % dette gir deg 100 jevnt % fordelte punkter fra 0 til 2*pi x=cos(t); y=sin(t); plot(x,y) axis( equal ) Kommandoen axis( equal ) sørger for at MATLAB bruker samme lengdeenhet langs begge aksene utelater du den, blir sirkelen see ut som en ellipse. Kommandoen virker tilbake på det siste plottet du har utført, og bør derfor brukes etter kommandoen plot(x,y). For å lage kurver i rommet, kan du bruke kommandoen plot3 på tilsvare måte. Vil du plotte kurven r(t) = (cos t,sin t, t 2 ) t [0,2π], kan du f.eks. skrive t=linspace(0,2*pi,100); x=cos(t); y=sin(t); z=t.^2 plot3(x,y,z) axis( equal ) 8

MATLAB-kommentarer MATLAB er et utmerket hjelpemiddel for å fremstille grafer til funksjoner z = f (x, y). For å tegne en slik graf med MATLAB må du først definere et rutenett (et grid ) i x y-planet. Deretter må du få MATLAB til å regne ut funksjonsverdiene i alle hjørnene i rutenettet, og til slutt må du få MATLAB til å tegne resultatet (MATLAB vil da plotte alle punkter av typen (x, y, f (x, y)) der (x, y) er et hjørne i rutenettet, og så forbinde alle nabopunkter med rette streker). Example 0.1. Vi skal tegne grafen til f (x, y) = x 3 4y 2 over rektangelet x [ 3,3], y [ 5,5]. Vi lager først en oppdeling av de to intervallene vi er interessert i, ved å skrive r=-3:0.1:3; s=-5:0.1:5; (husk semikolon etter kommandoene, ellers vil du få lange tallremser som output!) Her har vi valgt å dele opp begge intervallene i skritt med lengde 0.1, men du kan godt velge en finere eller grovere oppdeling. Det kan være lurt å prøve en skikkelig grov oppdeling (f.eks. skrittlengde 0.5) en gang slik at du virkelig ser hvordan MATLAB tegner grafer. Neste skritt er å lage et rutenett av oppdelingene våre. Dette gjør vi med kommandoen >> [x,y]=meshgrid(r,s);} Vi kan nå definere funksjonen: >> z=x.^3-4*y.^2; (husk å bruke.-versjonene av de algebraiske operasjonene!) Dermed er vi klare til selve plottingen som utføres av kommandoen >> mesh(x,y,z) Grafen kommer opp i et eget figurvindu akkurat som for todimensjonale figurer, og ser ut som et fiskegarn med knuter i plottepunktene. Ved å gå inn på menyen i grafvinduet, kan du dreie flaten i rommet (aktiver musa ved å klikke på et ikon som symboliserer dreiing). Dette er ofte nødvig for å få et godt inntrykk av hvordan grafen ser ut! Bruker du kommandoen surf(x,y,z) istedenfor mesh(x,y,z), vil MATLAB tegne grafen med fargelegging av hvert ruteelement. Det er ofte klargjøre når grafen varierer mye. Vil du se nivåkurvene istedenfor grafen, bytter du ut med kommandoen 9

>> contour(x,y,z) Når du bruker contour på denne måten, velger MATLAB selv hvilke nivåkurver den skal tegne. MATLAB er ikke alltid flink til å finne de mest interessante nivåkurvene, og det kan også tenkes at vi er interessert i helt konkrete nivåer, som programmet umulig kan gjette på. Derfor her det at du må hjelpe til ved å angi konkrete nivåer: Dersom vektoren v = (v 1, v 2,..., v n ) er lagt inn, vil kommandoen >> contour(x,y,z,v) tvinge MATLAB til å tegne nivåkurvene med verdier v 1, v 2,..., v n. Vil du bare regulere antall nivåkurver, men ikke spesifisere verdiene, kan du bruke denne kommandoen >> contour(x,y,z,n) som får MATLAB til å tegne opp n nivåkurver. Med kommandoen clabel får du MATLAB til å skrive nivået til nivåkurvene på grafen. Prøv >> clabel(contour(x,y,z,12)) MATLAB vil normalt tegne nivåkurvene i forskjellige farger. Dette er nyttig på skjermen, men kan være mindre praktisk dersom du ønsker å lime figuren inn i et svart-hvitt dokument. Skriver du >> contour(x,y,z,8, k ) får du 8 nivåkurver tegnet i svart ( k er symbolet for svart farge). Ønsker du at MATLAB skal tegne nivåkurvene og grafen i samme plot, bruker du kommandoen >> meshc(x,y,z) Det finnes mange andre kommandoer du også kan bruke (og mange flere måter å modifisere kommandoene ovenfor på!). Skriv >> help graph3d for å få en oversikt. 10

Bringe en matrise på trappeform med MATLAB Det er enkelt å lage et program som bringer en matrise på trappeform. Før vi ser på hvordan dette kan gjøres, la oss se på hvordan vi kan utføre radoperasjonene vi har jobbet med med MATLAB. La oss definere en matrise C i MATLAB ved å skrive C=[2-4 2 8 4; 0 1-3 2 5; -4 2 1-1 3]; Kommandoen C([2 3],:)=C([3,2],:) viser et eksempel på radoperasjon (i), der vi bytter om rad 2 og rad 3. MATLAB svarer med C= 2-4 2 8 4-4 2 1-1 3 0 1-3 2 5 Kommandoen >> C(1,:)=0.5*C(1,:) viser et eksempel på radoperasjon (ii), det vil si å gange en rad med et tall forskjellig fra 0. MATLAB svarer nå med C= 1-2 1 4 2-4 2 1-1 3 0 1-3 2 5 Kommandoen >> C(2,:)=C(2,:)+4*C(1,:) viser et eksempel på radoperasjon (iii), det vil si å legge et multiplum av en rad til en annen. MATLAB svarer nå med C= 1-2 1 4 2 0-6 5 15 11 0 1-3 2 5 11

Vi ser her at vi er godt på vei til å bringe matrisen til trappeform, vi trenger faktisk bare gjøre en operasjon av type (iii) i tillegg for å komme i mål. La oss se på hvordan vi kan lage en funksjon som automatiserer det vi gjorde over, slik at matrisen til slutt kommer på trappeform. Enklest er det hvis vi først antar at vi ikke trenger gjøre ombytting av rader under radreduksjon. Da vil en funksjon som bringer en matrise på trappeform ta følge enkle form: function U = gauss(a) % Bringer A på trappeform. Antar A kan bringes på trappeform % uten at vi støter på nuller i pivot-posisjoner underveis. U=A; [m,n]=size(u); for j=1:n-1 % gjennomgår en og en søyle for i=j+1:m % gjennomgår en og en rad nedenfor pivoten U(i,:) = U(i,:) -(U(i,j)/U(j,j))*U(j,:); % nuller ut under pivoten Hvis vi må gjøre ombytting av rader underveis er det hele litt mer komplisert. Koden under viser hvordan radreduksjonen nå kan gjøres: function U = gauss_delpiv(a); [m,n]=size(a) % leser antall rader søyler i A i=1; % i er en radindeks. Vi starter i første rad for j=1:n % Gjennomgå en og en søyle, med j som søyleindeks [maksverdi,p] = max(abs(a(i:m,j))); q = p+i-1; A([i q],:) = A([q i],:); % Bytt om rad i og q if A(i,j)~=0 for r=i+1:m A(r,:) = A(r,:) -(A(r,j)/A(i,j))*A(i,:); i=i+1; if i>m break U=A; Legg merke til at koden nå også bruker en radindeks, som holder på raden vi jobber med. I hver søyle leter vi etter et element som ikke er 0. Hvis en slik finnes 12

sørges vi for at den blir flyttet opp, slik at vi kan nulle ut elementene under denne i samme søyle. Deretter går vi videre til neste søyle, og radindeksen plusses på med en, siden vi har funnet et nytt pivotelement. Hvis det bare var nuller i en søyle, går vi videre til neste søyle uten å øke radindeksen. MATLAB har ingen innebygd funksjon for å bringe en matrise på trappeform. Dette skyldes at det man oftest gjør er å bringe en matrise direkte til det som kalles redusert trappeform, som vi skal se på i neste seksjon. For dette har man funksjonen rref, som vi også skal se på i neste seksjon. Man kan derfor lure på hva som er vitsen med å kunne foreta radoperasjoner for hånd på denne måten, siden MATLAB har kommandoen» rref innebygget. Når man bruker MATLAB som et verktøy, støter man imidlertid ofte på matriser med spesiell struktur, f.eks. svært mange nuller. Da er det ofte mer effektivt selv å programmere hvilke radoperasjoner MATLAB skal gjøre enn å kjøre en standardkommando som» rref, som ikke tar hensyn til strukturen til matrisene. Redusert trappeform i MATLAB Det er ganske kjedelig å føre store matriser over på trappeform for hånd, men heldigvis finnes det hjelpemidler. Dersom du har tastet inn en matrise A i MAT- LAB, vil kommandoen» rref(a) få MATLAB til å regne ut den reduserte trappeformen til A. Her er et eksempel på en kjøring: >> A=[2-1 4 5 6 6-1 3 2 1-2 3 1 0 5]; >> B=rref(A) B = 1.0000 0 0-0.4286-0.7500 0 1.0000 0-0.7143 0.5000 0 0 1.0000 1.2857 2.000 Kommandonavnet rref kan virke litt mystisk, men det skyldes rett og slett at redusert trappeform heter reduced row echelon form på engelsk. Vanlig trappeform heter row echelon form. Legg merke til at rref, som de fleste andre MATLABkommandoer, gjør avrundinger på veien frem til svaret. Vi kan også bruke Symbolic math Toolbox til å finne et eksakt uttrykk for den reduserte trappeformen. Et slikt eksakt uttrykk vil vi alltid kunne finne hvis 13

vi starter med en matrise med hele tall (slik som i de fleste oppgavene i denne boka), for da vil den reduserte trappeformen ha kun rasjonale tall i seg, slik at den greit lar seg uttrykke eksakt. Derfor kan vi bruke Symbolic math Toolbox blant annet til å verifisere oppgavene i denne boka. Som et eksempel, det symbolske uttrykket for den reduserte trappeformen over kan finnes ved å skrive >> B=rref(sym(A)) B = [ 1, 0, 0, -3/7, -3/4] [ 0, 1, 0, -5/7, 1/2] [ 0, 0, 1, 9/7, 2] La oss se hvordan vi kan bruke kommandoen rref til å løse et ligningssystem. Example 0.2. Vi skal løse ligningssystemet Den utvidede matrisen er B = 2x y + 3z + u + v = 2 3x + y z + 2u v = 3 x 2y + 4z + u + 2v = 4 2 1 3 1 1 2 3 1 1 2 1 3 1 2 4 1 2 4 og putter vi denne inn i MATLAB og bruker rref, får vi >> B=[2-1 3 1 1 2 3 1-1 2-1 3-1 -2 4 1 2 4]; >> C=rref(B) C = 1.0000 0 0.4000 0 0-0.5000 0 1.0000-2.2000 0-1.0000-0.5000 0 0 0 1.0000 0 2.5000 14

Den reduserte trappeformen er altså C = 1 0 0.4 0 0 0.5 0 1 2.2 0 1 0.5 0 0 0 1 0 2.5 Vi ser at pivotsøylene er søyle 1, 2 og 4, og at de frie variablene er z (som korresponderer til søyle 3) og v (som korresponderer til søyle 5). Vi kan derfor velge z og v fritt og løse for de andre variablene. Det er lettest å gjøre dette hvis vi først skriver opp ligningssystemet til C : Vi ser at løsningene er gitt ved der z og v kan velges fritt. x + 0.4z = 0.5 y 2.2z v = 0.5 u = 2.5 x = 0.5 0.4z y = 0.5 + 2.2z + v z = z u = 2.5 v = v Det er heller ikke vanskelig å modifisere koden fra forrige seksjon som brakte matrisen på trappeform, slik at den i stedet bringer matrisen på redusert trappeform: Alt vi trenger å gjøre er å sørge for at, der vi nullet ut elementene under pivotelementet, nuller vi også ut elementene over pivotelementet. Det svarer til å bytte ut linjen for r=i+1:m... med A(i,:) = A(i,:)/A(i,j); % skaffer lede 1-er i pivot-raden for r=1:m % går gjennom alle radene if r~=i % bortsett fra rad nr i (pivot-raden)... % kode som over 15

Tidligere i seksjonen nullet vi ut alle elementene over pivotene først etter at vi hadde nullet ut alt under pivotene, så koden over svarer riktignok til å gjøre radoperasjonene i en litt annen rekkefølge enn hva vi har gjort til nå. For å få en funksjon med enklest mulig kode er det kanskje greiest å gjøre det slik her. Det er dermed ikke sagt at MATLAB utfører radreduksjon på akkurat denne måten: som vi så for matrisemultiplikasjon, så er det ikke alltid at den metoden som virker mest naturlig viser seg å være den beste. Mest sannsynlig bruker MATLAB en mer gjennomtenkt metode til å bringe en matrise på redusert trappeform, men vi skal ikke gå nærmere inn på dette her. Inverse matriser i MATLAB Dersom du har lastet inn en inverterbar matrise A i MATLAB, vil kommandoen >> B=inv(A) få MATLAB til å regne ut den inverse matrisen og legge den inn i variabelen B. Dersom du ønsker å løse matriseligningen kan du nå gjøre det ved å skrive >> x=bb Ax = b (dette forutsetter selvfølgelig at du allerede har lastet inn b). Det er imidlertid mer effektivt å bruke kommandoen >> x=a\b som produserer løsningen til likningssystemet Ax = b. Velger vi for eksempel 1 1 4 3 1 2 1 4 5 A = 6 3 1 2 og b = 3 0 3 3 2 4 2 gir kommandoen» x=a\b svaret x = 1.3537 2.4784 0.7023 0.0076 Legg merke til at brøkstreken \ går gal vei det skyldes at man her deler fra venstre (det vil si at man gjør noe som tilsvarer å gange med A 1 fra venstre). Kommandoen 16

>> x=b/a med normal brøkstrek, produserer løsningen til ligningen xa = b (i dette tilfellet må x og b være radvektorer for at dimensjonene skal passe) fordi vi her kan løse ligningssystemet ved å gange med A 1 fra høyre dvs. vi deler fra høyre. Vær oppmerksom på at kommandoene ovenfor bare fungerer etter beskrivelsen når A er en inverterbar, kvadratisk matrise; vil du løse andre typer ligningssystemer, må du bruke teknikkene vi har sett på tidligere i dette kapitlet. (Advarsel: Det kan he at du får svar på kommandoen >> x=a\b selv om matrisen A ikke er kvadratisk, men løsningen kan da ha en annen tolkning prøv >> help mldivide for mer informasjon). MATLAB-kommandoene nevnt over vil gjøre avrundinger, men vi vet jo at elementene i inversmatrisen eller løsningene til et system vil inneholde rasjonale tall, hvis matrisene vi starter med har det. Kommandoene over kan også brukes i Symbolic math Toolbox, og da vil de returnere de eksakte uttrykket for svaret. Dette kan være nyttig for å verifisere svarene i oppgavene i boka, siden matrisene der stort sett har heltall i seg. Inversen til kan vi finne ved å skrive Ax = inv(sym([1 2 0;0 1 1;0-2 1])) 1 2 0 0 1 1 0 2 1 Her definerte vi først matrisen symbolsk, deretter fant vi et symbolsk uttrykk for inversen på neste linje. Setter vi b = kan vi tilsvare finne den symbolske løsningen på Ax = b ved å skrive A\sym([5;3;3]) MATLAB-kommentar: I MATLAB kan du skrive det(a) for å regne ut determinanten til en matrise A. Det er lett å verifisere Teorem?? ved hjelp av MATLAB og funksjonen det. Vi kan først generere en 4 4-matrise med tilfeldige tall ved å skrive» A=rand(4) (mer generelt kan vi lage en m n-matrise med tilfeldige tall ved å skrive» A=rand(m,n)). Verdiene rand genererer vil være uniformt fordelte på [0,1]. Skriver vi nå 17 5 3 3

-det(a) B=A; B([1 2],:)=B([2 1],:); det(b) 5*det(A) B=A; B(1,:)=5*B(1,:); det(b) det(a) B=A; B(1,:)=B(1,:)+2*B(2,:); det(b) De to første linjene verifiserer Teorem??(ii) ved å sammenligne med determinanten vi får ved å bytte om de første radene i A. De to neste linjene verifiserer på samme måte Teorem??(iii), mens de to siste linjene verifiserer Teorem??(iv). For å verifiser Teorem??(i) kan vi først generere øvre triangulære og nedre triangulære matriser med tilfeldige tall ved å skrive L=tril(rand(4)); U=triu(rand(4)); Produktet av elementene på diagonalen i en matrise kan vi får ved å skrive prod(diag(a)), slik at vi kan verifisere Teorem??(i) på samme måte som over ved å skrive det(l) prod(diag(l)) det(u) prod(diag(u)) En rett-fram implementasjon av determinanten til en generell kvadratisk matrise ved hjelp av utvikling langs første rad kan se slik ut: function determ=detdef(a) [m,n]=size(a); if m~=n fprintf( Matrisen er ikke kvadratisk! ); elseif (n==1) determ = A(1,1); else determ = 0; for k=1:n % Lag (n-1)x(n-1) undermatrise der rad 1, søyle k er fjernet newmatr = [ A(2:n,1:(k-1)) A(2:n,(k+1):n) ]; determ = determ + (-1)^(k+1) * A(1,k) * detdef(newmatr); 18

Funksjonen har fått et annet navn enn den innebygde funksjonen det, for å ikke skape en navnekonflikt. Funksjonen detdef er det vi kaller rekursiv: den kaller seg selv helt til vi har en matrise som er så liten at vi kan regne ut determinanten direkte. Sørg her spesielt for at du forstår den delen av koden hvor (n 1) (n 1)-undermatrisen konstrueres. I koden ser du også at vi legger inn en sjekk på at matrisen er kvadratisk. Hvis den ikke er det skrives en feilmelding ved hjelp av funksjonen disp. Denne koden er desverre ikke spesielt rask: determinanten kan regnes ut mye raskere ved hjelp av den innebygde metoden det. De to kan sammenlignes ved å kjøre koden A=rand(9,9); tic det(a) toc tic detdef(a) toc Her lages en (tilfeldig generert) 9 9-matrise, og determinanten regnes ut ved hjelp av de to metodene. Kjør koden og se hvor mye raskere den innebygde determinantfunksjonen er! Du kan godt prøve med en tilfeldig generert 10 10- matrise også, men da bør du være tålmodig mens du venter på at koden skal kjøre ferdig, spesielt hvis du sitter på en litt treg maskin. I oppgave 4.9.12 skal vi se på en mulig implementasjon av determinanten som er raskere, og som derfor kanskje er nærmere MATLABs egen implementasjon. En delvis forklaring på hvorfor en implementasjon er raskere enn en annen kan man få ved å telle antall addisjoner og multiplikasjoner koden gjør (i mange algoritmer i lineær algebra står multiplikasjon og addisjon for det meste av tiden som brukes). Hvis P(n) er antall multiplikasjoner som brukes av funksjonen detdef for en n n-matrse, så er det klart at P(n) = np(n 1)+n, der np(n 1) svarer til antall multiplikasjoner som forekommer når man regner ut de n underdeterminantene, og n er de ekstra multiplikasjonene man gjør når man ganger underdeterminantene med elementer fra raden eller søylen man utvikler langs. Fra P(n) = np(n 1) + n er det klart at P(n) n!. Vi vil få bruk for dette nedre estimatet på antall multiplikasjoner i Oppgave 4.9.12. Nøkkelen til hvorfor detdef er såpass treg finner man i at n! vokser veldig fort mot uelig, mens andre implementasjoner kan ha et mye lavere tall for antall multiplikasjoner og addisjoner. 19

Egenverdier med MATLAB Det er lett å finne egenverdier og egenvektorer med MATLAB. Det er flere kommandoer du kan bruke, men den nyttigste er som regel» [u,v]=eig(a) Denne kommandoen definerer to matriser u og v. Søylene i matrisen u er egenvektorene til A, mens v er en diagonalmatrise der elementene på diagonalen er egenverdiene til A. Vi ser altså at MATLAB-funksjoner kan returnere flere verdier samtidig ved hjelp av denne syntaksen. eig forutsetter, akkurat som inv og det, at A er en kvadratisk matrise. Egenvektorene og egenverdiene kommer i samme rekkefølge slik at den første egenverdien tilhører den første egenvektoren osv. Her er et eksempel på en kjøring: >> B=[2 1 3 4 0 3 1 1-2]; >> [u,v]=eig(b) u = -0.2864-0.0000 0.3833-0.9143 0.9487-0.8404-0.2864 0.3162 0.3833 v = 2.1926 0 0 0 1.0000 0 0 0-3.1926 Dette forteller oss at B har egenvektorer 0.2864 0.9143 0.2864, 0.0000 0.9487 0.3162 og 0.3833 0.8404 0.3833 20

med egenverdier henholdsvis 2.1926, 1.0000 og 3.1926. Vær oppmerksom på at MATLAB alltid velger egenvektorer med lengde 1. Dette er praktisk for noen formål, men fører ofte til at egenvektorene blir mer uoversiktlige enn nødvig. De 0 fleste av oss ville f.eks. ha oppgitt den andre egenvektoren ovenfor som 3, 1 men MATLAB velger altså en normalisert variant. Mer ubegripelig er MATLABs forkjærlighet for å velge negative komponenter i egenvektorene; for de fleste formål ville det være mer naturlig å velge den første egenvektoren til å være 0.2864 0.9143 0.2864 istedenfor 0.2864 0.9143 0.2864 Når man regner videre med egenvektorer man har fått av MATLAB, kan det derfor være lurt å se om man kan forenkle dem ved å velge en annen skalering eller et annet fortegn. Det er en ting til man bør være klar over. MATLAB vil av og til operere med en liten imaginærdel i en egenverdi/egenvektor som egentlig er reell. Det skyldes at MATLAB er et numerisk beregningsverktøy som regner med avrundede tall. Får du egenverdier/egenvektorer med en ørliten imaginærdel (eller en ørliten realdel), kan det være lurt å sjekke om dette er en avrundingsfeil før du går videre. Oppgavene i denne boken er stort sett laget slik at egenverdiene og egenvektorene kan uttrykkes eksakt i formel. Kommandoen eig vil imidlertid alltid regne ut disse størrelsene numerisk. Vi kan imidlertid regne ut egenverdier og egenvektorer eksakt i MATLAB (for de fleste matriser der disse lar seg uttrykke i formel) ved å bruke Symbolic math toolbox. Skriver vi A=sym([1 2 0;0 1 1;0-2 1]); [U,V]=eig(A) Ser du at de eksakte uttrykkene for egenverdiene og egenvektorene blir returnert. Mer om dobbeltintegraler i MATLAB MATLAB kan også brukes til å regne ut dobbeltintegraler over mer generelle områder. Teknikken vi bruker, ligger tett opptil definisjonen. Hovedtrikset er at MATLAB-kommandoer av typen >>(f(x,y)<=g(x,y)) (legg merke til de ytters- 21

te parentesene) definerer funksjonen F (x, y) = 1 hvis f (x, y) g (x, y) 0 ellers Skriver vi f.eks. >>(x.^2+y.^2<=1) (legg igjen merke til de ytterste parentesene!) har vi definert en funksjon 1 hvis x 2 + y 2 1 F (x, y) = 0 hvis x 2 + y 2 > 1 Skriver vi nå >>(x.^3-y.^2).*(x.^2+y.^2<=1) har vi dermed definert funksjonen x 3 y 2 hvis x 2 + y 2 1 G(x, y) = 0 hvis x 2 + y 2 > 1 Det er akkurat slike funksjoner vi trenger for å regne ut integraler over generelle områder. La oss bruke MATLAB til å regne ut integralet i eksempel 1 ovenfor, dvs. A (x + y 2 ) dxd y der A = {(x, y) : 0 x 1 og x y e x } Vi må først finne et rektangel R som omfatter mengden A. Siden den minste verdien y kan ha i området vårt er 0 og den største er e 1 = e < 3, kan vi f.eks. bruke R = [0,1] [0,3]. For å fange opp betingelsen x y, innfører vi funksjonen (x<=y), og for å fange opp betingelsen y e x, innfører vi funksjonen (y<=exp(x)). Uttrykket (x+y.^2).*(x<=y).*(y<=exp(x)) vil dermed fange opp den funksjonen vi er interessert i. For å utføre integrasjonene, skriver vi >> dblquad(@(x,y)(x+y.^2).*(x<=y).*(y<=exp(x)),0,1,0,3) ans = 2.7040 22

La oss også prøve oss på integrasjon i eksempel 3. Her skal vi integrere f (x, y) = 1 x 2 4y 2 over området x 2 + 4y 2 1. Vi vet at ellipsen har sentrum i origo og halvakser a = 1, b = 1 2, så hele området ligger inni rektanglet R = [ 1,1] [ 1 2, 1 2 ]. For å regne ut integralet, gir vi kommandoen >> dblquad(@(x,y)(1-x.^2-4*y.^2).*(x.^2+4*y.^2<=1),-1,1,-0.5,0.5) ans = 0.7854 Trippelintegraler i MATLAB: Trippelintegraler i MATLAB utføres på samme måte som dobbeltintegraler, bortsett fra at vi må bruke kommandoen triplequad istedenfor doublequad. Vil vi for eksempel ha MATLAB til å regne ut integralet i eksemplet ovenfor, skriver vi >> triplequad(@(x,y,z)(x+y.*exp(2*z)),0,1,1,3,0,2) Vær oppmerksom på at MATLAB kan bruke lang tid på å regne ut trippelintegraler. Dersom én av integrasjonene er enkel, kan det derfor være greit å utføre den for hånd før du kobler inn MATLAB. Mer om trippelintegraler i MATLAB: Skal vi bruke MATLAB til å integrere over områder som ikke er rektangulære bokser, må vi bruke det samme trikset som vi brukte for dobbeltintegraler; vi må nulle ut funksjonen over de delene vi ikke er interessert i. Ønsker vi for eksempel å integrere funksjonen f (x, y, z) = x 2 y+z 2 over kulen med sentrum i origo og radius 1, skriver vi >> triplequad(@(x,y,z)((x.^2.*y+z.^2).*(x.^2+y.^2+z.^2<=1)),-1,1,-1,1,-1,1) Vi minner om at trippelintegraler tar tid (selv for MATLAB), og at det kan he du må vente på svaret noen minutter. 23