DN1212 för P1 Föreläsning 1 Introduktion till kursen De flesta av er kommer att i ert arbete göra en massa tekniska beräkningar För dessa beräkningar behöver ni ett smidigt verktyg så att ni slipper att räkna för hand. Vi kommer att jobba med Matlab. Ni behöver också lära er olika numeriska metoder för att t.ex. lösa ekvationer, differentialekvationer (det mesta beror på något sätt av tiden och då får man en diffekvation), beräkna integraler etc. I matematiken är man ute efter exakta lösningar. Men i praktiken vill man ha ett värde på t.ex. hur tjock en balk behöver vara för att hålla. Och ni måste inse vilka felkällor som finns, vilka risker som finns att resultaten blir felaktiga eller väldigt känsliga för variationer i indata. Kursinnehåll Programmeringsdelen med 3 laborationer. Här ingår: villkorssatser, slingor, egna funktioner, diagram och grafiskt användargränssnitt. Numerikdelen handlar om metoder för att lösa ingenjörens beräkningsproblem. Kursen avslutas med en större labbuppgift där du jobbar med båda delarna i kombination och redovisar både vid datorn och med en rapport. Labbarna görs i grupper om 2 studenter. Examinationen utgörs av labbarna och en skriftlig salstenta. Titta ofta på kursens webbplats. 1 2 Hederskodex CSC tillämpar en hederskodex på alla kurser. Den finns på http://www.kth.se/csc/utbildning/hederskodex Regel 1: Alla ansvarar vid arbete i grupp Regel 2: Redovisa ärligt hjälp som erhållits och källor som använts Regel 3: Kopiera inte från andras lösningar Regel 4: Var beredd att redogöra för lösningen Regel 5: Hantera närvarolistor korrekt För ditt datorkonto vid CSC gäller samma ansvarsförbindelse som för KTH-kontot http://www.sgr.nada.kth.se/regler/ Ta med legitimation till första labbtillfället då du får kontot Programmering Nationalencyklopedin: formaliserad planläggning, t.ex. av en programstyrd verktygsmaskin eller tvättmaskin; i databehandlingssammanhang skrivande av instruktioner för en dators arbete. Gränsen mellan programmering och utnyttjande av tillämpningsprogram är flytande. Programmering har förändrats från ett hantverkmässigt till ett industrialiserat arbete. Den ensamme programmeraren har ersatts av den väladministrerade dataarbetaren som fullgör sina uppgifter under yttre kontroll av kvalitet och produktivitet. Är programmering kreativt intellektuellt arbete besläkat med konstnärligt skapande och teoribyggande (Peter Naur) eller regelstyrd verksamhet som bör bedrivas med starkt formaliserad metodik (Edsger Dijkstra)? 3 4
Varför behöver du programmera Civilingenjören och teknologen behöver: göra snabba beräkningar, visa beräkningar som övertygar uppdragsgivare/kund, producera hjälpmedel som uppdragsgivare/kund kan använda, producera program som ingår i produkter, göra program som personliga hjälpmedel m.m. Egenskaper hos Matlab: kan användas interaktivt, som kalkylator, innehåller många inbyggda funktioner och kan byggas ut med egna kommandofiler och funktioner och extra verktygslådor (toolbox), kan relativt lätt skapa diagram och annan grafik, är normalt interpreterat Programmering tränar logiskt tänkande, modellbyggnad, strukturering och problemlösning. Interpreterat/kompilerat Man skriver Matlabkommandon i kommandofönstret och i m-filer (kommandofiler eller funktionsfiler). Kommandona översätts till p- kod (pseudokod). P-kod är maskinoberoende. En interpretator läser p-koden och utför en p-kodsinstruktion i taget. P-koden sparas under den aktuella sessionen eller tills minnet blir fullt. Interpretering ger inte maximal effektivitet men maskinoberoende. I Matlab finns möjlighet att kompilera, dvs. att översätta till maskinberoende maskininstruktioner. När det är gjort kan programmet utföras maximalt effektivt. Många klassiska programspråk är kompilerade t.ex. Fortran och C. Java fungerar som Matlab, dvs. använder en sorts p-kod som kan kompileras när den exekveras första gången, för att de snabbare maskininstruktionerna ska användas om programdelen exekveras igen. Perl, Applescript, Javascript m.fl. programspråk interpreteras normalt. 5 6 Att kunna programmera Att tillsammans med användaren eller beställaren förstå och definiera vilket problem som ska lösas Att kunna överblicka ett problem och strukturera det i väl avgränsade moduler som var och en löser ett väldefinierat problem och som kommunicerar med varandra på ett väl definierat sätt. Känna till människans förmåga och ta hänsyn till den i designprocessen och i själva programmet. Skriva programkod för de olika modulerna och sedan länka dem samman Skriva programkod som är lätt att underhålla Skriva programkod som reagerar på ett vettigt sätt på ovettiga indata Dokumentera sina program så att även andra kan sätta sig in i dem Söka fel, testa och ta hänsyn till effektivitet. Behärska programspråket och programmeringsmiljön. Veta hur man hanterar vanliga delproblem. Repetition av Matlab Matlab finns för många plattformar, bl.a. Unix, Windows och Mac OS X. Det finns många viktiga fönster. Kommandofönstret är centralt. Där skriver man kommandon som utförs direkt. Matlab skriver normalt resultat i detta fönster. Mycket av det som man kan göra i andra fönster, kan man också göra med kommandon i kommandofönstret. Man kan starta kopiering (loggning) av kommandofönstret till en fil med diary filnamn. Med diary off slutar man spara. De inbyggda funktionerna och programdelar som man gör själv är normalt m-filer som innehåller Matlabkommandon och har filnamn som slutar på.m. M-filer kan redigeras med Matlabs redigeringsprogram eller med något annat redigeringsprogram, MSWord, emacs e.d. I Matlabs redigeringsfönster har man också tillgång till avlusningsfunktioner (debugging) för att sätta stoppunkter, stega och inspektera variabler. I arbetsplatsfönstret kan man inspektera och i tabellfönstret kan man också ändra variabler. 7 8
Litteratur om Matlab Matlab-häftet i kursbunten (skrivet vid CSC) Matlab-häfte från University of Dundee http://www.maths.dundee.ac.uk/software/matlab.shtml Kursboken Chapman: Matlab programming för engineers Boken Eva Pärt-Enander och Anders Sjöberg: Användarhandledning för Matlab en rejäl bok skriven på svenska vid Uppsala universitet Matlabs hjälp Det finns mycket hjälpinformation i Matlab. Via hjälpmenyn eller frågetecknet når man hjälpfönstret med massor med länkad information. Speciellt finns ett antal inledande videor, som förklarar grunderna och som du bör titta på Kommandot lookfor text söker efter m-filer med text i första dokumentationskommentarrad. Kommandot help filnamn skriver alla dokumentationskommentarer dvs. de inledande kommentarraderna som finns i m-filen filnamn.m. Det är lämpligt att förbereda egna m-filer så att de fungerar bra för lookfor och help. 9 10 Kommandon, satser, m-filer Kommandon skriver man i kommandofönstret och de utförs direkt Satser kan skrivas i kommandofönstret. Men satser är det som bygger upp program. Enklaste satsen är en tilldelningssats, där man tilldelar en variabel ett visst värde. T.ex. a=5 Andra typer av satser är villkorssatser och repetitionssatser samt in- och utmatning. Ett script är en följd av satser som man lagrar i en m-fil. Det är ett program. Normalt vill man dela upp ett program i olika moduler, funktioner. Då skriver man en funktion i en m-fil. Ett script eller en funktion utförs när man startar eller anropar den. 11 12
Sökväg m.m. I många integrerade programmeringsmiljöer skapar man ett projekt där man lägger alla filer som hör till ett visst projekt. Programmeringsmiljön letar då i projektet efter sådant som inte tillhör miljön som färdiga funktioner t.ex. sin. I Matlab måste du själv skapa mappar för dina filer så att de filer som hör till ett projekt (t.ex. lab1) hamnar i samma mapp. Du ser sökvägen ovanför kommandofönstret. Matlab letar efter identifierare i ordningen: variabel, inbyggd funktion, m-fil längs sökvägen Om Matlab hänger sig, prova med C-c. Variabler, arrayer, matriser Matlab står för matrix laboratrory (matrislabb). De flesta programmeringsspråk har vanliga skalärer som grundläggande variabel. Men Matlab har matrisen som grundläggande variabel och ser skalären som ett specialfall av matris. Matlab talar om: matrix is a rectangular array of numbers där array i min ordbok översätts med bl.a. ordnad skara. Med matris menar man ju normalt en tabell med rader och kolumner. En normal matris har rader och kolumner och sålunda dimension 2. En tabell har en storlek (size) som är en vektor med antalet komponenter i de olika riktningarna/dimensionerna. Antalet komponenter i storleken är tabellens dimension. En matris är en tabell med dimension 2. Vektorer hanteras som matriser med endast en rad (radvektor) eller kolumn (kolumnvektor). Skalärer (tal) hanteras som matriser med storleken [1 1]. Tabeller med dimension 3 eller större finns men används sällan. Alla element i normala tabeller har samma typ. Det finns andra sorters tabeller. 13 14 Variabler Värden som man vill spara till senare under räkningarna lagrar man i en eller flera variabler. En variabel har ett namn (identifierare) och man kan se variabeln som en namngiven plats i datorns minne där man kan spara/lagra en ett eller flera värden. Identifierare kan innehålla A Z, a z, siffror och _ (understreck) och måste börja med bokstav. Versaler och gemena (stora och små bokstäver) anses olika och identifierare har en maximalt tillåten längd (vanligen 19 tecken). Normalt använder man gemena. För s.k. globala variabler använder man versaler. Det är viktigt att välja bra identifierare, som återspeglar vad variabeln används till. De variabler som man använder i kommandofiler ingår i arbetsplatsen. Man kan se vilka det är med who, få mer information, bl.a. storlek, minnesutrymme och elementtyp, med whos och radera med clear. Det finns några fördefinierade variabler såsom ans, eps, realmax, realmin, pi, Inf, NaN, i, j. Variabeln eps påverkas inte av clear. Deklaration av variabler Variabler deklareras inte i Matlab, vilket innebär att man inte explicit ger dem någon typ eller storlek. Varje gång man definierar en variabel i kommandofönstret finns den kvar resten av sessionen eller tills man tar bort den med clear Variabler som får numeriskt värde får typen double, dvs med decimalpunkt och många decimaler Vanliga variabler går att komma åt i den funktion där de används men inte från andra funktioner eller från kommandofönstret. Globala variabler kan man komma åt överallt. Globala variabler ska dock deklareras som global, ex. global x,y 15 16
Aritmetiska uttryck, tilldelning Operatorer När man skriver en formel/ett uttryck i kommandofönstret beräknas uttryckets värde, värdet tilldelas variabeln ans och skrivs ut. Man kan lagra uttryckets värde i en annan variabel med en tilldelning. Ex. a=5. Man kan undertrycka utskriften genom att skriva ; (semikolon) efter kommandot. Man kan skriva mer än ett kommando på en rad genom att ha kommatecken eller semikolon mellan dem. Ett kommando kan fortsätta på nästa rad om man avslutar den första med (tre punkter) Uttryck byggs upp, ungefär som matematikens formler, av tal (använd decimalpunkt), parenteser, operatorer, [] (hakparenteser),, (kommatecken), ; (semikolon) (för att sätta ihop tabeller) och funktionsanrop. Måste stå på en rad (vara linjära). Matlab har många operatorer: +, addition, subtraktion * multiplikation / division (högerdivision) 10/5 är 2!\ vänsterdivision 10\5 är 5/10 är 0,5 ^ exponentiering (upphöjt till) 2^3 är 8 För matriser finns det elementvisa operationer. För att A op B ska vara tillåtet måste A och B ha samma storlek eller så måste åtminstone den ena vara skalär: +, elementvis addition, subtraktion.* elementvis multiplikation./ elementvis division.\ elementvis vänsterdivision.^ elementvis exponentiering 17 18 Icke elementvisa operatorer När den ena operanden är skalär fungerar dessa operatorer elementvis. C = A*B matrismultiplikation, A och B har högst dimension 2 och antal kolumner i A är lika med antalet rader i B C = A/B matrisdivision, lösning av linjärt ekvationssystem F = E\D C = A*inv(B) F = inv(e)*d C = A' där A har komplexa element innebär transponering och konjugering, komplexkonjugering, cij=conj(aji) C = A.' transponat, cij = aji C = A^p A är kvadratisk, p är skalär C = A* *A (p ggr) 19 20
Logiska operatorer Värdet 0 betraktas som falskt (false), alla andra värden betraktas som sant (true). Resultatet sant lagras som 1. < elementvis mindre än <= elementvis mindre än eller lika med > elementvis större än >= elementvis större än eller lika med == elementvis lika med (= används för tilldelning) ~= elementvis skilt från & elementvis och elementvis eller ~ elementvis icke xor exlusivt eller (ger falskt om båda är sanna) && genvägsoch genvägseller Prioritet Aritmetiska operationer i ordningen ^,.^, ',.' +, -, ~ (med en operand, unära) *,.*, /,./, \,.\ +, (binära) Relationsoperationer ==, ~=, <, <=, >, >= Logiska operationer i ordningen ~ dvs icke-operatorn & och && dvs och-operatorerna och och xor dvs eller-operatorerna Ordningen kan förbigås med parenteser. Operatorer med samma prioritet utförs från vänster till höger, utom de unära som utförs från höger till vänster. 21 22 Färdiga funktioner abs(x) ger absolutbeloppet av x sqrt(x) ger kvadratroten av x exp(x) ger exponentialfunktionen av x sin(x) ger sinus av x, x i radianer round(x) ger närmaste heltalet till x fix(x) ger avrundning av x till heltal mot noll rand ger likformigt fördelat slumptal mellan 0 och 1 max(x) ger största elementet i x Och många, många fler Uttryck a/b + c respektive a/(b+c) 5*cos(pi/6) log10(x^2+6) (a/b^2*c)*(d-e^3)^2 a<b a\b a b a&b OBS att i och j är fördefinierade för komplexenheten i och att värden kan vara komplexa 23 24
Skapa matriser Explicit ange elementen med hakparenteser [ ] runt om. Element i samma rad åtskiljs av blanktecken eller kommatecken. Ny rad markeras med return eller semikolon. linspace linspace(start, slut, antal) skapar en vektor med antal element där elementen är ekvidistant fördelade mellan start och slut Använd någon av de många matrisbyggande funktionerna ones(n) ones(m, n) zeros(n) zeros(m,n) eye(n) enhetsmatris diag(a) ger kolumnvektor med elementen på diagonalen i matrisen a Sätta ihop vektorer x=[x 5] y=[z w] Lägga till rader eller kolumner a=[a; z] Det finns många fler 25 26 Komma åt delar av matris Polynom Enstaka element kommer man åt med index a(3,2) Följd av element anges med kolon vek(2:4) a(2,1:2) Det finns många varianter. Testa själv! Matlab lagrar polynom som en koefficientvektor (radvektor) med högstagradskoefficienten först. Polynomet p(x)=x^4+5x^3 2x^2+7x 11 lagras i p = [1 5-2 7-11] och kan beräknas för x=1 med polyval(p,1) eller för x-värdena 0, 1, 2 och 3 med polyval(p,[0 1 2 3]) och lagras i vektorn val med val= polyval(p,[0 1 2 3]) Nollställena till ett polynom beräknas med roots(p) som ger en vektor med längden n (kan bli komplex) 27 28
Eval Matlab-kommandon kan skrivas och lagras som textsträngar. Kommandosträngarna kan evalueras, dvs deras värde kan beräknas med eval. eval(str) utför de Matlabkommandon som finns i strängen str och returnerar resultatet. Detta ger flexibilitet då man vill ha funktioner som parametrar till funktioner 29