ComsolScript 3.2 i kursen experimentella metoder

Storlek: px
Starta visningen från sidan:

Download "ComsolScript 3.2 i kursen experimentella metoder"

Transkript

1 ComsolScript 3.2 i kursen experimentella metoder av Sten Hellman Övningsuppgifter av Sten Hellman, Max Karlovini, Teresia Månson & Jonas Strandberg

2 ii 1:a upplagan, Stockholm c Sten Hellman, Stockholms universitet.

3 Innehåll 1 Inledning Vad är ComsolScript? Konventioner Att komma igång De första stegen - Hello World Logga in på datorn Starta ComsolScript ComsolScripts kommandofönster Say Hello ComsolScripts hjälpfunktion Avsluta ComsolScript Börja Räkna ComsolScript som en räknedosa Operatorer Variabler Konstanter Miljön i ComsolScript Städa upp kommandofönstret: tyst input, fortsättningsrader Format och avrundning ComsolScripts Workspace Play it again Sam - att upprepa kommandon Att återkalla kommandon Att navigera på datorn Minne och hårddisk på en dator Filnamn och Sökvägar Fullständiga filnamn Aktuell katalog Var söker ComsolScript efter filer Var skall jag spara filer Att spara och läsa tillbaks innehållet i workspace M-filer editera m-filer ComsolScripts inbyggda editor Crimson editor Att spara en m-fil på disk Läsa in och köra en m-fil Kommentarer In- och utmatning av data till M-filer Utskrift när M-filen kör - Echo kommandot Paus i utskriften iii

4 iv INNEHÅLL Namngivning av M-filer Vektorer och matriser Inbyggda funktioner Litet om vektorer Skapa vektorer Räkna med vektorer Elementvisa operationer Litet om matriser Räkna med matriser Inbyggda funktioner Operationer på skalärer Operationer på vektorer Operationer på matriser Övningsuppgifter Börja programmera Villkorssatser Slingor for-slingor while-slingor Att hoppa ut ur en slinga - kommandot break Funktioner Syntaxen för funktioner help för en funktion Testa antalet argument Övningsuppgifter Ordbehandling med OpenOffice writer OpenOffice Allmänna kommentarer Textbehandling Typsnitt Storlek på texten Fet, kursiv och understruken text Att justera texten Att göra en rubrik Egna formatmallar Lägga till knappar till verktygsfältet Sidbrytning Sidnumrering Fotnoter Numrerade listor Tabeller Tabelltext Figurer Ankra bilder Figurtext Speciella symboler Ekvationer Spara dokument Spara i pdf-format

5 INNEHÅLL v 5.16 Övningsuppgifter Felsökning - Debuggning Debuggning med breakpoints Övningsuppgifter D-Grafik Kurvor i två dimensioner Att växla mellan fönster, och städa i fönster plot-kommandot Styra utseendet på grafiken Koordinataxlar Text Plotta punkter med fel Histogram Kommandot bar - stapeldiagram Kommandot hist - histogram Utskrifter av grafik Spara grafer och flytta till andra program Lägga in bilder i OpenOffice dokument Fler Kurvor i samma graf - kommandot hold Fler grafer i samma fönster - kommandot subplot Rita i grafer Logaritm-skalor Övningsuppgifter Text-strängar, beräkningar och anpassningar Text-strängar Manipulera textsträngar Delsträngar Enkel statistik Polynom Hitta rötter till polynom Finn polynomuttryck för givna rötter Värden på polynom Derivator av polynom Produkter och kvoter av polynom Matrisekvationer Minsta kvadratanpassning Minsta kvadratanpassning med matrismetod Övningsuppgifter Programmering Att programmera Design av programmet Dokumentation av programmet Formaterad in- och utmatning Läs data och strängar från kommandofönstret - kommandot input Formatera strängar för utmatning - Formatkoder och kommandot sprintf Övningsuppgifter

6 vi INNEHÅLL 10 Mer grafik och programmering Mer om 2D-grafik Avancerade kommandon för 2-D grafik Att redigera en graf interaktivt Handtags-grafik D grafik Kurvor i rymden - plot Funktionsytor - mesh och surf Att styra utseendet av en 3D-graf Konturplottar och projektioner Mer om programmering och funktioner Linjär korrelationskoefficient Viktad anpassning till rät linje Viktad anpassning och plottning av rät linje Övningsuppgifter Svar och lösningar Svar till kapitel Svar till kapitel Svar till kapitel Svar till kapitel Svar till kapitel Svar till kapitel A Syntax för formler i OpenOffice 107 A.1 Unary and binary operators A.2 Relations A.3 Set symbols A.4 Functions A.5 Operators A.6 Atributes A.7 Others A.8 Brackets A.9 Formatting

7 Kapitel 1 Inledning Det här kompendiet är avsett att användas i kursen Den experimentella metoden som ingår i första årskursen i fysiklinjen vid Stockholms Universitet. Kompendiet är inte avsett att vara en komplett kurs i ComsolScript utan strävar efter att ge en introduktion till programmet, och mer detaljerade kunskaper inom de områden som är nödvändiga för kursen Den experimentella metoden. Tonvikten ligger inom två områden: beräkningar för att behandla mätvärden från laborationer och grafisk presentation av mätdata och resultat, främst då 2D grafik. Detta upplägg innebär att en del områden nästan inte alls kommer att beröras, som till exempel komplexa tal, 3D grafik och mer avancerade matematik-tillämpningar. Vi är dock förvissade om att man efter att ha följt kursen har så goda kunskaper i att använda ComsolScript så att det skall vara relativt enkelt att på egen hand läsa in andra områden vartefter behov av det uppstår. Programmet ComsolScript har en mycket väl utvecklad hjälpfunktion, men som med alla andra program kan det vara svårt att veta vad man skall be om hjälp med innan man har nått en viss kunskapsnivå. Dessutom kan det ibland vara besvärligt att vara hänvisad till engelska termer. För att träna upp det interaktiva hjälpsökandet använder kompendiet flitigt hänvisningar till ComsolScripts egen dokumentation. Kompendiet är skrivet i avsikt att läsas i en följd, många avsnitt bygger direkt på tidigare avsnitt, en hel del av de exempel som ges förutsätter att föregående exempel har körts. Kompendiet har vid det här laget en lång historia. Tidigare har vi på fysikum använt Matlab istället för ComsolScript. ComsolScript är ett nytuvecklat program som använder samma syntax som Matlab. Har man lärt sig ComsolScript är det alltså mycket enkelt att använda också Matlab, och vice versa. Detta kompendium är därför i stort sett bara en översättning av den fjärde upplagan av motsvarande kompendium för Matlab. Det går i sin tur tillbaka till ett kompendium av Hans Mühlen - MATLAB - som kom i flera upplagor under åren Sedan den första versionen av Matlab-kompendiet producerades har många fel rensats ut och många förbättringar gjorts med hälp av de doktorander som arbetat som assistenter på kursen: Annelie Ehlerding, Attila Hidvégi, Max Karlovini, Teresia Månsson och Jonas Strandberg. Björn Selldén har bidragit med en mäng korrigeringar och förbättringar. Tack för hjälpen! Avsnittet om ordbehandling skrevs ursprurngligen av Jonas Strandberg för Microsoft Word. När vi vårterminen 2006 bytte ordbehandlingsprogram till OpenOffice så har detta kapitel skrivits om av mig, men strukturen går tillbaks på det ursprungliga kapitlet av Jonas. Eftersom detta är första omgången där vi använder ComsolScript och OpenOffice så kan det mycket väl ha smugit sig in småfel här och där. Sänd gärna förslag på korrigeringar till författaren på sten@physto.se 1

8 2 KAPITEL 1. INLEDNING 1.1 Vad är ComsolScript? ComsolScript är ett kommersiellt program, eller snarare programpaket, för matematiska beräkningar och grafisk presentation. ComsolScript-paketet har en mängd utbyggnadsmöjligheter med färdiga moduler och kan användas för ett stort antal mer eller mindre specialiserade beräknings- och simuleringsuppgifter. I den här kursen, och även i övrigt här på fysikum, använder vi oss av ComsolScript dels för att skriva program för att genomföra beräkningar, till exempel för att bearbeta lab-resultat, dels för att presentera resultat i grafisk form. Som alla andra program har ComsolScript sina styrkor och svagheter. Namnet MATLAB stod ursrpungligen för MATrix LABoratory, och även om MATLAB-familjen (dit vi räknar ComsolScript) har utvecklats enormt sedan det döptes så är matrishanteringen fortfarande en av de starka sidorna hos ComsolScript, något som kommer att komma till stor användning under den här kursen. Rent allmänt är ComsolScript väldigt förlåtande, man behöver till exempel inte - som i de flesta högnivåspråken för programmering - göra skillnad mellan heltal och decimaltal. Man behöver inte heller i förväg tala om hur stora vektorer skall vara. Det finns gott stöd för att producera grafik, men det kan i början kännas litet avigt att man inte enkelt kan plotta sin(x) mot x, utan först måste man konstruera en vektor med x-värden och en annan vektor med y-värden och sedan plotta dem mot varandra. Vi skall också komma ihåg att ComsolScript är ett matematikprogram, inte ett ordbehandlingsprogram. Vi kommer alltså att behöva komplettera vår arsenal med ett program som hanterar text och figurer för att kunna producera dokumentationen av våra experiement. 1.2 Konventioner I detta kompendium används endast ett fåtal typografiska konventioner. En är när vi visar exakt hur det ser ut när man skriver in kommandon i ComsolScripts kommandofönster och får output tillbaks till det fönstret. Sådana exempel visas inom en ram: Kommandot som skrivs in Respons från ComsolScript Ibland refererar vi till kommandon och variabler i löpande text, och markerar då detta genom att skriva variabelnamnet med särskilt typsnitt a = sin(x). Referenser till ComsolScripts hjälp-dokument skrivs med initialt? och särskilt typsnitt, t.ex.?/comsol Script Basics/Using COMSOL Script/Starting COMSOL Script Hur man använder en sådan referens för att söka ett avsnitt i dokumentationen beskrivs i avsnitt Notera också att ComsolScript använder den anglosaxiska konventionen där decimalkommat inte skrivs med komma utan med punkt. Således är 2,3 ett talpar medan 2.3 är ett decimaltal.

9 Kapitel 2 Att komma igång Efter det första dataövningspasset skall du kunna: Logga in på ditt studentkonto på Fysikums datorer Starta ComsolScript Använda ComsolScript som en enkel mini-räknare använda M-filer och spara dessa på disk. 2.1 De första stegen - Hello World Det finns en slags tradition inom litteraturen om datorprogram och programmeringsspråk enligt vilken den första uppgiften man skall lösa när man ger sig i kast med ett nytt program eller språk är att få programmet att skriva Hello World på skärmen. Det här kan verka litet fånigt, men det är faktiskt inte så dumt. Visserligen är det vi kräver av själva programmet tämligen trivialt, men för att det hela skall fungera måste vi kunna en hel del saker om den miljö i vilket programmet fungerar: vi måste kunna logga in på den dator där programmet skall köras, hitta och starta programmet, få programmet att acceptera våra instruktioner om vad som skall utföras, köra programmet och till sist få programmet att kommunicera ett resultat, vanligtvis via en bildskärm. Kan vi klara av alla dessa uppgifter så kan vi i fortsättningen koncentrera oss på att få programmet att lösa mer och mer komplicerade uppgifter Logga in på datorn. Hur man loggar in på datorerna på övningslabbet kommer troligen att variera med tiden. Det beror också på vilket operativsystem den dator du skall arbeta vid använder. Här beskrivs hur det går till att logga in på en dator som kör operativsystemet Windows under vårterminen Skulle du misslyckas att komma in på det sätt som beskrivs här kan det bero på att förhållandena ändrats, så fråga en assistent om du är tveksam. I normalfallet kommer datorn att visa upp en inloggningsruta på skärmen som litet schematiskt kan se ut på de två sätt som visas till höger. Du kan växla mellan de bägge utseendena genom att klicka på 3

10 4 KAPITEL 2. ATT KOMMA IGÅNG options -knappen längst ned till höger. Du skall logga in med skärmen i det läge som syns till höger i bilden, med tre rader och pilarna till vänster om texten options. På den understa av de tre raderna skall du välja WINADSU. Skriv sedan in ditt användarnamn och lösenord för ditt SU-konto. När du loggar in på detta vis har du full tillgång till dina mappar under SU-kontot. De ligger Starta ComsolScript När du är inloggad kan du se ett antal små bilder - ikoner - på skärmen. Varje ikon är en symbol för ett objekt som finns i datorn. Det kan vara en fil, en mapp (katalog) eller ett program. Vad som händer när du dubbelklickar på en ikon beror på vad ikonen är en symbol för, är det t ex en symbol för en fil skapad i programmet Microsoft Word kommer programmet Microsoft Word att starta och öppna filen.på din skärm kommer du att ha en ikon som visar ComsolScripts symbol. Den ikonen är länkad direkt till programmet ComsolScript, så genom att dubbelklicka på den startar ComsolScript. En alternativ metod att starta ComsolScript är att klicka på den lilla fyrkanten längst ned, märkt med Windows-symbolen och ordet Start. Då öppnas en meny med ett antal alternativ varav ett är Program. Klickar du på den raden så öppnas en mindre meny (det är innebörden av symbolen ), där väljer du COMSOL 3.2a och i den meny som då kommer upp väljer du åter ComsolScript 1.0a. (om ComsolScript 1.0 inte syns så klicka på symbolen i botten av menyn så öppnas fler alternativ) och på den meny som då öppnas återigen ComsolScript ComsolScripts kommandofönster När ComsolScript har startat öppnas ett nytt fönster på din dator som kan se litet olika ut beroende på vilka inställningar som har sparats, men det blir i alla fall en version av det som kallas ComsolScripts kommandofönster. Kommandofönstret (Command Window) är det fönster genom vilket vi och ComsolScript kommunicerar med varandra, där skriver vi in kommandon och ComsolScript skriver ut resultat Say Hello Så har vi äntligen kommit fram till den punkt då vi är redo att säga hallå världen. Det som återstår är att instruera ComsolScript att skriva ut Hello World på skärmen. Det finns fler sätt att få ComsolScript att utföra kommandon, det enklaste som vi skall använda först är att skriva in kommandot i kommandofönstret. När vi skriver ett kommando i kommandofönstret och trycker på return så kontrolleras först att kommandot har en korrekt syntax, dvs att kommandot är skrivet enligt de regler som gäller för ComsolScripts kommandospråk så att programmet kan tolka instruktionen. Om kommandot vi skrivit in är korrekt utförs det och eventuella resultat visas i kommandofönstret. Det kommando vi skall använda för att säga hallå heter disp() efter engelskans display. Kommandot betyder helt enkelt att ComsolScript skall visa det som står inom parantesen (argumentet) i kommandofönstret på skärmen. Det som står inom parantesen kan vara en mängd olika storheter, men just nu är vi intresserade av något som kallas för textsträng. En textsträng är en sträng av tecken, omgiven av enkla citationstecken: ( ). ComsolScript behandlar en textsträng som en liten låda som man inte, i alla fall inte utan en del möda, kan göra något med annat än att spara och ta fram vid behov. Genom att ge textsträngen Hello World som argument till kommandot disp instruerar vi ComsolScript att skriva ut strängen på skärmen. Det sista steget blir alltså att ge kommandot disp( Hello World ) i kommandofönstret, som svar kommer ComsolScript att skriva Hello World i kommandofönstret, och vi har klarat av

11 2.1. DE FÖRSTA STEGEN - HELLO WORLD 5 vår första ComsolScript uppgift. C disp( Hello World ) Hello World ComsolScripts hjälpfunktion ComsolScript har en mycket omfattande on-line dokumentation, och kraftfullt stöd för hjälpfunktionen. Det finns fler sätt att hitta information på, så vi kommer under kursens gång att lära oss fler olika metoder att få hjälp. Den första metoden vi skall använda är att öppna och använda on-line dokumentationen. Det gör du genom att i ComsolScripts menyer gå in i Hjälp, och där klicka på hjälp (HTML/PDF). När du gör det kommer huvudsidan i ComsolScripts dokumentation att öppnas i din web-browser (om du inte redan har startat en browser så görs det automatiskt). På den web-sida som kommer upp -kallad COMSOL Help desk - kan du välja dels vilken del av dokumentationen du vill titta i, dels i vilket format. Du kan antingen klicka dig fram i en web-browser, eller öppna en pdf-fil. Om du vill skriva ut något avsnitt på papper kan det vara bekvämt att använda pdf-filen (men tänk på skogen, skriv inte ut hela manualen!), men för att snabbt bara söka ett svar på något bestämt problem är i allmänhet web-browsern en snabbare och bekvämare metod. I detta kompendium kommer jag om det inte speciellt anges referera till html-metoden. För ComsolScript har vi två avdelningar av dokumentationen att välja på: User s Guide och Command Reference. Users s Guide är den sektion vi oftast kommer att hänvisa till, där finns beskrivningar av hur programmet fungerar uppdelat på ett antal olika ämnen, den andra avdelningen, Command Reference, är en lista på alla kommandon du kan ge i ComsolScript, vad de gör och vilka argument du kan ge. Denna avdelning kan vara användbar om man t ex minns vad ett kommando heter, men inte kan minnas med vilka argument man kallar det (men minns man namnet på kommandot så är det alltid snabbare att bara skriva help kommandonamn i ComsolScripts kommandofönster. Klicka nu på Users s Guide! Du kommer då in i ComsolScripts dokumentation. Den visas hela tiden i ett fönster uppdelat i två spalter. Den vänstra spalten används för att hitta rätt bland dokumentationen, i den högra spalten visas hjälptexten. Låt oss börja med att titta på vänstersidan. Vi kan välja tre olika sätt att leta information genom att välja en av de tre knapparna längst upp i vänsterspalten: contents ger oss en innehållsförteckning där ämnena är grupperade i kapitel och underkapitel i olika nivåer ner till enstaka sidor. index ger oss tillgång till ett alfabetiskt ämnesregister där vi kan söka om vi vet namnet på det kommando eller det begrepp vi vill veta mer om. search ger oss möjlighet att söka i den samlade dokumentationen. Sökningen kan vara efter såväl enstaka ord som hela fraser. Låt oss nu ta en närmare titt på vad som möter oss under fliken contents. Schematiskt ser spalten under contents ut så här: De små boksymbolerna betecknar avsnitt i hjälpkatalogen. Genom att klicka på någon av dem öppnas nästa nivå av innehållsförteckniungen. Klicka på COMSOL Script Basics! Då öppnas nästa nivå Using COMSOL Script som även den symboliseras av en liten bok. Det betyder att vi kan klicka på den för att komma en nivå djupare ned i dokumentationen. Gör vi det ser vi att vi i nästa nivå både möter den välkända bok-symbolen, men också en symbol för en textsida. Dessa visar den lägsta

12 6 KAPITEL 2. ATT KOMMA IGÅNG nivån i hjälpsystemet. Klickar vi på en av dem (eller texten brevid symbolen) så visas den hjälptext som hör till detta avsnitt i det högra fönstret. En underavdelning som är öppnad kan stängas igen: klicka bara på boksymbolen så stängs motsvarande nivå. I det här kompendiet används en speciell syntax för att beskriva hur du skall navigera fram till givna avsnitt i hjälpdokumentationen. Låt oss t ex börja med att hitta det avsnitt i dokumentationen som beskriver ComsolScripts kommandofönster. Till den sidan når du genom att klicka på följande titlar: COMSOL Script Basics Using COMSOL Script The COMSOL Script Environment The Command Window För att spara utrymme kommer vi i det här kompendiet att skriva?/comsol Script Basics / Using COMSOL Script / The COMSOL Script Environments/ The Command Window för klick-serien ovan. När vi har läst färdigt i hjälpfönstret så kan det vara bekvämt att göra sig av med det så att vi lättare kan se kommandofönstret.det gör vi enklast genom att använda oss av en av symbolerna som visas högst upp till höger i varje fönster (alltså inte bara ComsolScripts) som visas på datorn. De tre symbolerna används för att hantera fönster i Windowsmiljön. Symbolen till vänster används för att förminska fönstret till en ikon. Prova att klicka på den, och du ser att fönstret försvinner och att vi obehindrat kan se de fönster som tidigare var dolda bakom hjälpfönstret. Det fina i kråksången är att fönstret finns kvar i skepnad av en liten symbol Help på listen längst ned på datorskärmen. Genom att klicka på den symbolen återställs fönstret genast. Det här är ett bekvämt sätt att göra det enklare att hitta bland alla sina öppna fönster, de som inte används för tillfället minimerar man bara och de finns fortfarande lätt tillgängliga. Krysset längst till höger stänger det aktuella fönstret. Om detta är toppfönstret avslutas det program som öppnat fönstret. Klickar vi där i hjälpfunktionen så avslutas webbläsaren och vi får börja om från början och gå till hjälpmenyn om vi vill ha mer hjälp. Den mittersta symbolen slutligen används för att maximera ett fönsters storlek, klickar vi på den så förstoras fönstret så att det täcker hela datorskärmen. Det här kan vara bekvämt om man till exempel vill kunna läsa en hel sida i dokumentationen på skärmen utan att behöva bläddra upp och ner på skärmen. När vi är klara klickar vi bara en gång till på samma symbol och fönstret återtar sin ursprungliga storlek. Ett annat sätt att få hjälp är att i kommandofönstret skriva help kommando, där kommando byts ut mot namnet på det kommando man söker hjälp om. Detta leder ofta snabbare fram till den information man söker än att söka i dokumentationen. Svårigheten är bara att man måste ha en första idé om vad det är man vill ha hjälp med så att man har något vettigt att skriva in i stället för kommando Avsluta ComsolScript Det finns två sätt att avsluta ComsolScript. Du kan antingen gå in i menyn COMSOL och där välja Quit COMSOL eller också trycka på ctrl Q (trycker samtidigt ner tangenten ctrl i nedre vänstra hörnet av tangentbordet och tangenten Q ). 2.2 Börja Räkna ComsolScript som en räknedosa Enklare matematiska operationer görs precis som på en vanlig räknedosa (med normal, dvs ej omvänd polsk notation à la HP-räknare) med den lilla skillnaden att vi trycker på return

13 2.2. BÖRJA RÄKNA 7 i stället för = när vi vill beräkna resultatet. Pröva t ex att beräkna 2+2: C ans = Operatorer För aritmetik har ComsolScript de vanliga (och en litet ovanlig) operatorerna: + Addition - Subtraktion Multiplikation / Division \ Vänsterdivision Exponentiering, till exempel x 2 = x 2 Komplex konjugering och transponering ( ) Paranteser för att definiera prioritetsordning Prioritetsordningen mellan operatorerna är den normala så att när man till exempel skriver 3 * 4 + 3*2 3 så beräknas först, 2 3, därefter de bägge produkterna och sedan summan Variabler I ComsolScript kan man liksom i alla högnivåspråk definiera variabler, och tilldela dessa värden. Dels underlättar det arbetet genom att man inte behöver upprepa inmatning av samma värde fler gånger, dels gör det instruktionerna enklare att följa och förstå - åtminstone om man väljer namn på konstanterna som är begripliga. Antag som ett exempel att en läskeblask kostar 10 kronor, en varmkorv 12 och en kaffe 4. Om då Kalle köper en korv och fyra kaffe, Lisa en läskeblask och två korvar och Ludde tre korvar och två läskeblask, så kan vi räkna ut vad var och en fick betala på följande sätt (minns att varje rad måste avslutas med return för att ComsolScript skall utföra kommandot): 1 Notera att ComsolScript ingorerar mellanslag i alla uttryck. Det spelar alltså ingen roll om vi skriver 2+3+4*5 eller *5 eller * 5. För att det skall bli enklare att följa uttrycken så är det mellersta sättet att skriva (som ansluter till prioritetsordningen) att föredra.

14 8 KAPITEL 2. ATT KOMMA IGÅNG C laskeblask = 10 laskeblask = 10 C korv = 12 korv = 12 C kaffe = 4 kaffe = 4 C Kalle = 2*korv + 4*kaffe Kalle = 40 C Lisa = laskeblask + korv Lisa = 22 C Ludde = 3*korv + 2 *laskeblask Ludde = 56 I exemplet ovan är laskeblask, korv, kaffe, Kalle, Lisa och Ludde alla variabler. Variabler kan alltså tilldelas värden antingen explicit (uttryckligen) genom t ex korv = 12, eller genom en beräkning som t ex Kalle = 2*korv + 4*kaffe. Observera att man som alltid måste vara noga med syntaxen, eller programmeringsspråkets grammatik. Det går inte att skriva C Dyrt = 3 korv Prova! Du kommer att få ett prov på hur ComsolScript vänligt, men inte särskilt diskret hjälper en tillrätta när man får syntaxen fel. Glömmer man bort vad en läsk kostar kan vi fråga ComsolScript: C laskeblask laskeblask = 10 En fallgrop man får akta sig för är att variabler vars värde beräknas, som t ex Kalle ovan behåller det värde som variabeln tilldelats senaste gången den beräknas, även om en av de variabler som ingår när man beräknar variabelns värde ändras. Ett exempel: C kola = 0.5 kola = C klubba = 2.50 klubba = C Sune = 20 * kola + 4 * klubba Sune = 20 C klubba = 5.00 klubba = C Sune Sune = 20 Värdet på variabeln Sune ändras alltså inte när värdet på klubba ändras, när värdet på Sune beräknades gällde det gamla värdet på klubba och värdet på Sune förblir oförändrat

15 2.2. BÖRJA RÄKNA 9 så länge vi inte räknar om det med C Sune = 20 * kola + 4 * klubba Sune = 30 Variabelnamn i ComsolScript måste börja med en bokstav, följd av en godtycklig kombination av bokstäver (ej å, ä eller ö), siffror eller understrykning ( ), ett variabelnamn kan alltså inte innehålla mellanslag. ComsolScript ser skillnad på stor och liten bokstav, ALLA, Alla och alla är alltså tre olika variabler. Om man vill skapa variabelnamn som är sammansättningar av mer än ett ord finns två konventioner: antingen binder man ihop med ett understrykningstecken, eller också skriver man med små bokstäver, men inleder nya ord med versal. Alltså antingen lagsta strom eller LagstaStrom. Vilket du väljer att göra är godtyckligt, men det är bra om man försöker att hålla sig till ett sätt att skriva. Det är ju enkelt att komma ihåg att variabeln är lägsta ström, men om man på vissa ställen skriver lagsta strom och på andra LagstaStrom så kommer man att hänvisa till olika variabler på olika ställen i sin kod. Man bör därför bestämma sig för en konvention och sedan hålla sig till den. Det kan också vara bra att undvika de svenska bokstäverna även om det program man arbetar med stöder dessa. När man skriver många program skaffar man sig vanor, och det är bra om vanorna fungerar i så många olika sammanhang som möjligt Konstanter ComsolScript har ett antal inbyggda konstanter: pi konstanten π = i roten ur -1. j samma som i. eps 2 52 den minsta relativa skillnaden mellan två rationella tal, eller uttryckt på annat sätt: det minsta tal man kan addera till 1 och få ett tal som är större än 1. realmin , det minsta rationella talet som kan representeras på datorn. realmax (2 eps) 1023, det största rationella talet som kan representeras på datorn. Inf Oändligheten som resultat av en väl definierad matematisk operation, t ex 10/0. NaN Icke definierat (Not a Number), resultatet av en operation där resultate inte är definierat, t ex 0/0 eller Inf - Inf. ans Resultatet av det senaste kommandot. Av dessa kommer vi kanske inte att använda mer än pi (och möjligen ans) i den här kursen, men det är bra att veta att de finns, i vissa lägen kan ComsolScript komma att använda dem i felmeddelanden och då är det bra att veta vad till exempel NaN står för. Vi har här valt att kalla dessa tal för konstanter eftersom det är så vi betraktar och använder dem. Rent tekniskt är de dock implementerade som inbyggda funktioner vilket har som en konsekvens att man kan definiera om dem: C pi pi = C pi = 4.75 pi = De är dock litet mer stabila än vanliga variabler av typ Kalle som vi själva definierar. En variabel vi har definierat kan tas bort så att ComsolScript inte längre minns något om dem

16 10 KAPITEL 2. ATT KOMMA IGÅNG genom att ge commandot clear: C clear Kalle Gör vi samma sak med en av konstanterna i tabellen ovan så återställs värdet till det fördefinierade som visas i tabellen. 2.3 Miljön i ComsolScript Städa upp kommandofönstret: tyst input, fortsättningsrader När man börjar komma igång litet med att använda ComsolScript tycker man ofta att kommandofönstret blir litet ostrukturerat, alla kommandon man ger upprepas slaviskt, vissa värden ges utan decimaler, andra med en lång rad nollor på slutet. Det finns ett antal kommandon som hjälper en att skräddarsy vad vi ser i kommandofönstret. För att stänga av ekot, det vill säga för att få ComsolScript att avstå från att rapportera resultatet av varje kommando vi skriver in räcker det med att avsluta raden med semikolon. Egentligen är det inte raden, utan kommandot som avslutas med semikolon. Distinktionen är viktig, eftersom användandet av semikolon gör det möjligt att skriva mer än ett kommando på varje rad. Denna finess bör användas med omdöme, driver man det för långt kan det bli nästan omöjligt att se vad man gjort, men rätt använt kan det istället göra det lättare att följa med: C laskeblask = 10; korv = 12; kaffe = 4; C Kalle = 2*korv + 4*kaffe Kalle = 40 ser mycket bättre ut än förra gången vi räknade ut Kalles utgifter. Man bör försöka undvika alltför långa kommandon, men ibland kan man behöva skriva kommandon som inte får plats på en rad, som till exempel: Y = ((3.5*(laskeblask+korv)-kaffe)+sin(pi-2.75*Kalle)/korv 2 +(45-kaffe) 3 Om vi behöver dela upp ett kommando på fler rader kan vi göra det: För att tala om för ComsolScript att kommandot inte är slut när raden är slut, vilket är vad ComsolScript normalt antar, så måste den rad som har en fortsättning avslutas med tre punkter omedelbart följda av return: C Y = ((3.5*(laskeblask+korv)-kaffe)+... sin(pi-2.75*kalle)/korv 2+(45-kaffe) 3)) är alltså ett kommando även om det sträcker sig över mer än en rad. För att denna finess skall fungera måste man se till att det som står före... inte är ett korrekt, avslutat kommando: C Y = fungerar, medan C Y = inte fungerar Format och avrundning I exemplen vi sett så här långt har ComsolScript genomgående skrivit ut heltal utan decimaler och decimaltal med fyra decimaler. Det senare gäller såväl i de fall där vi har definierat en

17 2.3. MILJÖN I COMSOLSCRIPT 11 variabel genom att skriva in bara en decimal som t ex 0.5, som i de fall då ComsolScript visar ett tal med oändligt lång decimalutveckling som pi eller 1/3. När vi kommer till mycket stora eller mycket små tal slår ComsolScript om till att använda scientific notation, där tal representeras som ett decimaltal multiplicerat med en lämplig tiopotens. I denna notation skrivs till exempel som 1.602e-19. Hur ComsolScript skall formattera de tal som visas kan påverkas genom kommandot format. För att se vilka alternativ som finns kan vi gå till help fönstret och söka på?/comsol Script Basics/Using COMSOL Script/Numbers and Arithmetics /Output Formats Eller enklare genom att bara skriva C help format Lägg särskilt märke till kommandot format compact som tar bort alla dessa blanka rader som ComsolScript spottar ur sig. I fortsättningen kommer vi att använda detta format i det här kompendiet ComsolScripts Workspace Vi har nu sett hur variabler som vi definierar, till exempel laskeblask i avsnitt 2.2.3, lever kvar. Långt efter det att vi definierat dem kan vi använda dem i nya uttryck, och vi kan se vilka värden de har genom att skriva deras namn i kommandofönstret. Det ställe där dessa variabler lever är en del av datorminnet som ComsolScript reserverar för variabler och som kallas workspace. Under långa ComsolScript sessioner kan ComsolScripts workspace bli ganska tätbefolkad, man kan lätt samla på sig en stor mängd variabler. Som vi snart kommer att se kan ett variabelnamn beteckna inte bara tal, utan vektorer och matriser med hundratals element. Ett sätt att se vad som finns i workspace är att i kommandofönstret ge kommandot whos. Vi kan nu också förstå litet bättre vad clear kommandot gör: genom att skriva clear Kalle tar vi helt enkelt bort variabeln Kalle från ComsolScripts workspace, vilket gör att ComsolScript helt glömmer bort att Kalle existerat. Du kan prova detta genom att skriva clear xxx i kommandofönstret för någon av de variabler som syns i workspace-fönstret och se vad som händer Play it again Sam - att upprepa kommandon I Kalle Ankas Julafton finns en film som visar en husvagnstur med Kalle Anka, Musse Pigg och Långben. I en av scenerna sitter Långben och äter en majskolv. När han gör det för han munnen över majskolven, varvid det hörs ett konstigt knattrande ljud. När han kommit till slutet av majskolven hörs ett pling, varvid han flyttar huvudet till andra sidan av majskolven och proceduren börjar om. När mina barn ser det här skrattar dom, men dom har ingen aning om vad det hela anspelar på: förr i tiden fanns det skrivmaskiner! När författaren var ung var skrivmaskiner nånting ganska häftigt. Med ganska mycket möda kunde man få ett brev eller ett dokument att se jätteproffsigt ut. Kruxet var bara att skrivmaskiner var fullkomligt skoningslösa - skrev man fel var det bara att riva ut pappret och börja om (på hemma-nivå kunde man förstås backa och kryssa över med ett antal XXXX, men det förtog ganska mycket av effekten). Det fanns speciella suddgummin för skrivmaskier, stenhårda skivor som antingen rev sönder pappret i småbitar eller smetade ut skriften över hela pappret. Så småningom kom TipEx, en vit färg man kunde måla över sina misstag med, och sedan skriva ny text ovanpå. Det blev med ens möjligt att hyfsa till dokument om man gjorde något enstaka fel, men riktigt proffssnyggt blev det inte, och man kunde inte heller ändra hela stycken mitt i ett färdigt dokument.

18 12 KAPITEL 2. ATT KOMMA IGÅNG De av oss som har upplevt denna period kan till fullo uppskatta vad ankomsten av små billiga datorer betytt för ordbehandlingen: ändringar blir triviala, felstavningar korrigeras enkelt (ibland till och med automatiskt), man kan återanvända gamla dokument, byta ut stycken helt godtyckligt - aldrig tidigare har så mycket text kunnat produceras med så liten möda! Det vore naturligtvis skönt att kunna få en räknebehandlare som har alla dessa företräden. Har man väl skrivit in Y = ((3.5*(a+b)-c)+sin(phi-2.75*D)/epsil 2+(455-abba )/ (cos(4+pi)-2.75) bara för att komma på att det borde ha varit Y = ((3.5*(a+b)-c)+sin(phi-2.75*B)/epsil 2+ (455-abba 3)/(cos(4+pi)-2.75) så kan man bli litet trött, och önska sig att ComsolScript bar sig åt som en ordbehandlare. Om man sedan kommer tillbaks en vecka senare för att räkna om något på en lab-rapport man fått åter på så önskar man verkligen att man kunde trolla tillbaks vad man gjorde förra veckan. ComsolScript, och andra moderna beräkningsprogram, svarar upp till dessa förväntningar. Dels kan man kan återkalla sina tidigare kommandon och redigera dessa i kommandofönstret innan man exekverar dem igen. Dessutom kan man spara hela sekvenser av kommandon i så kallade M-filer som man sedan kan återkalla, eventuellt redigera, och köra igen Att återkalla kommandon Det enklaste sättet att få chansen att göra om något vi gjort nyligen är att trycka på upp-pilen på tangentbordet. När vi gör det visas det senast utförda kommandot i kommandofönstret. Trycker vi på pilen en gång till kommer kommandot innan dess och så vidare. När vi knappat oss fram till det kommando vi vill göra om så är det bara att trycka på return så utförs kommandot en gång till. Oftast så återkallar man ju ett kommando för att man gjort något smärre fel som man vill korrigera, vilket är lätt gjort. När man bläddrat fram det kommando man vill göra om kan man flytta sig in i raden genom att trycka på vänster-pil. När man gör det rör sig pekaren in över raden, när den står till höger om det man vill ändra kan man radera ut delar av kommandot genom att trycka på delete-knappen. När man suddat det som är fel är det bara att skriva in vad som skall stå i stället 2. När man är nöjd är det sedan bara att trycka på return. Oavsett om pekaren står mitt i raden så kommer ComsolScript att utföra kommandot som står på hela raden. Man kan också ta sig in i raden genom att bara flytta pekaren till något ställe i raden genom att klicka. Prova genom att t ex skriva C y = sin (2 * pi) och sedan återkalla kommandot och till exempel ändra 2 till 3 eller sin till cos. 2.4 Att navigera på datorn Att hålla ordning på alla filer som skapas under ett projekt, som till exempel en laboration eller en ComsolScript övning kräver litet disciplin. Det är naturligtvis extra viktigt att man tänker sig för i en miljö som den på övningslab, där många användare använder samma dator. Innan vi går igenom hur man bör arbeta gör vi först en allmän genomgång över hur program på en dator hanterar disk och minne. 2 De av er som har arbetat i UNIX miljöer kan notera att samma typ av shortcuts går att använd i ComsolScript som i många UNIX-shells: control-d tar bort tecknet till höger om pekaren, control-k tar bort all text till höger om pekaren, control-u tar bort all text till vänster om pekaren osv.

19 2.4. ATT NAVIGERA PÅ DATORN Minne och hårddisk på en dator Ett program som kör på en dator hanterar två typer av information, dels instruktioner - det vi i dagligt tal kallar programmet, som styr datorn och på lägsta nivån talar om för datorn hur den skall utföra olika kommandon, dels data som är vad programmet opererar på. Sett ur det här perspektivet håller ett program som ComsolScript när vi till exempel skriver reda på två saker: dels vad instruktionen x + y innebär och hur ComsolScript skall genomföra den operationen, denna information är det vi kallar instruktioner. Sedan måste programmet också hålla reda på vad x och y är i just den aktuella beräkningen, och spara svaret någonstans, den typen av information kallas data. Den här informationslagringen kan ske på två ställen, antingen på hårddisken eller i datorns internminne. Det finns några skillnader i egenskap hos dessa två lagringsmedia: hårddisken är permanent, i betydelsen att så länge allting fungerar som det skall så finns all information som lagras på hårddisken kvar så länge som man inte uttryckligen raderar den. 3 Internminnet å andra sidan är temporärt i två avseenden, dels så överlever ingen information i internminnet att datorn stängs av, dels är det till och med så att då ett program som ComsolScript avslutas så raderas all information som programmet sparat i minnet. En annan skillnad mellan hårddisk och internminne är att det går mycket snabbare att komma åt data som finns i minnet (oftast talar man om internminnet som bara minnet ) än på disken. Med det här som bakgrund kan vi nu förstå litet bättre vad som händer när vi kör ComsolScript. Eftersom ComsolScript måste finnas kvar varje gång vi startar datorn så måste själva programmet finnas lagrat på hårddisken. Eftersom det tar lång tid att hämta instruktioner som finns lagrade på hårddisken så vill man inte att programmet skall gå och hämta varje instruktion för sig från hårddisken, det skulle dels göra programmet mycket långsamt och dels skulle datorns disk stå och surra hela tiden. Ett program som startar reserverar därför ett stycke minne för instruktioner och kopierar in de mest centrala dit och läser dem direkt därifrån. Skulle ComsolScript träffa på en instruktion som inte finns inkopierad till minnet så går den ut på hårddisken och läser in denna instruktion, men inte bara en enstaka instruktion, utan ett block med instruktioner som ofta används tillsammans. Ett välkonstruerat program behöver därför inte gå ut och läsa från den långsamma disken särskilt ofta, utan håller sig för det mesta till den kopia av instruktionerna som finns i minnet. 4 Samtidigt reserverar programmet en annan del av minnet för att lagra data. Allt som finns i ComsolScripts workspace lever till exempel i internminnet, när vi skriver klubba = 0.5 så reserveras ett litet område i internminnet för variabeln klubba, och värdet 0.5 lagras där. Kommandot clear klubba instruerar ComsolScript att vi inte längre är intresserade av klubba, den delen av minnet flaggas då som ledigt och kan användas av ComsolScript för att spara en ny variabel. Eftersom instruktionerna bara är en kopia av det som finns lagrat på hårddisken så påverkas inte programmets funktion av en eventuell krasch med efterföljande omstart, det är ju bara att 3 Kom ihåg dock att datorerna på övningslabb regelbundet städas och att alla användarfiler tas bort. Det enda ställe där du kan vara säker på att spara dina filer är på ditt afs-konto 4 När vi lärt oss det här om hur datorer fungerar kan vi förstå två saker: Dels varför vissa program ibland kan gå så sagolikt långsamt. Om minnet börjar ta slut, det vill säga om det inte finns något ledigt minne kvar att reservera, vilket kan hända när vi kör många program samtidigt, så kan ett program inte reservera tillräckligt stora delar av minnet för att lagra så många instruktioner så att det kan köra effektivt. Istället måste programmet ut och titt som tätt läsa instruktioner från den långsamma disken. Det här leder till sega program som svarar långsamt på våra kommandon. Vi förstår nu också varför program kraschar. I nio fall av tio (minst) beror det på att program A (ofta tillverkat av Microsoft) har skrivit till exempel data i en del av minnet som program B reserverat för sina instruktioner. I stället för instruktioner om hur programmet skall hantera x + y står det någonting helt annat, som programmet helt oskyldigt försöker genomföra med resultatet att allting hänger sig. Ibland är program A och B identiska, ett program kan skriva över sina egna instruktioner.

20 14 KAPITEL 2. ATT KOMMA IGÅNG skapa en ny kopia av instruktionerna från hårddisken. Data däremot flyger all sin väg. När programmet avslutas, frivilligt eller ofrivilligt, så är all information som lagrats i workspace borta. Om man nu har lagrat priserna för ett stort antal olika sorters godis i ComsolScripts workspace och räknar med att behöva använda den listan igen vid ett senare tillfälle så vill man naturligtvis kunna spara listan även efter det att ComsolScript avslutats för den här gången. Det går att göra, vi kan från ComsolScript spara innehållet i workspace på hårddisken, vi kan också skapa separata filer med data och/eller ComsolScript kommandon som sparas på hårddisk och som vi sedan läser tillbaks, sk M-filer. Detta kommer att bli det sätt vi normalt arbetar med ComsolScript. Genom att spara allt på hårddisk är det enkelt att gå tillbaks och göra smärre korrektioner och modifieringar och framför allt: vi kommer att spara mycket arbete genom att vi kan återanvända kod-snuttar från tidigare övningar Filnamn och Sökvägar Varje fil på en dator måste ha ett unikt namn som fungerar som en sorts adresslapp. Precis som när vi identifierar personer genom namn och en hirearki av adresser alltifrån gata med portnummer upp till städer och länder så har en datoradress flera nivåer. På den lägsta nivån talar vi om filnamn, som till exempel rapport2.text, laboration4.m osv. Varje fil måste vara placerad i en katalog (engelskans directory, på svenska kan vi också kalla det mapp ). Katalogen kan i sin tur vara inplacerad i en annan katalog, och så vidare. Det är klokt att försöka organisera en trädstruktur av kataloger som logiskt delar upp de filer man äger i avgränsade undergrupper som i exemplet nedan. labbar lab1 lab2 lab3 Rapport Rådata Rapport utkast1 utkast1 Vi ser hur det finns en textfil som heter utkast1 i katalogen rapport. Katalogen rapport ligger i sin tur i katalogen lab1, som ligger i katalogen labbar och så vidare. I en given katalog kan det bara finnas en fil med samma namn, vilket inte är så konstigt, hur skulle datorsystemet annars förstå t ex vilken fil vi ville skriva ut när vi ger ett print kommando. Men precis som brevbärarna inte bara kan hantera en Sven Andersson utan kan hålla isär Sven Anderson på Linnégatan från Sven Andersson på Kungsgatan, och Sven Andersson på Linnégatan i Göteborg från Sven Andersson på Linnégatan i Stockholm så kan datorn, om vi bara ger hela adressen, hålla isär en fil som heter utkast1 i katalogen rapport i katalogen lab2 från en fil som heter utkast1 i katalogen rapport i katalogen lab1. För att vara säkra på att vi och datorn förstår varandra när vi refererar till filer så måste vi reda ut två saker. Dels hur man anger att det är filen utkast1 som finns i trädet under lab1 och inte filen med samma namn i trädet under lab2, det vill säga hur bär vi oss åt för

21 2.4. ATT NAVIGERA PÅ DATORN 15 att skriva en fils fullständiga namn, inklusive katalogtillhörigheten (detta kallas på engelska path). Den andra saken vi måste förstå är något som kallas den aktuella katalogen och som avgör hur datorn tolkar våra kommandon när vi bara ger filnamnet och ingen information om katalogtillhörigheten Fullständiga filnamn Ett fullständigt filnamn i operativsystemet Windows börjar med namnet på hårddisken. Den dator du arbetar på kan nämligen ha mer än en hårddisk, 5 och det kan också vara så att du över nätverket kan ha tillgång till hårddiskar som inte fysiskt finns på just den datorn du arbetar vid, som till exempel de filer du lagrar på ditt AFS konto. När du loggat in på ditt AFS konto (se intstruktioner på windows.html) så kommer det att se ut som om de filer du lagrat där ligger på en disk på den dator du jobbar vid med namnet J. (Observera att vilken bokstav som AFS-disken får kan variera från gång till gång, beroende på historien på den dator där du jobbar). I filnamnet följs disknamnet av kolon, därefter \ ( backslash ) och sedan namnen på katalogerna, separerade med backslash. Om vi till exempel antar att katalogen Sten ligger i en katalog USERS som inte har någon katalog över sig på D-disken så blir den fullständiga adressen till filen utkast1: D:\USERS\Sten\Expkursen \labbar\lab1\rapport\utkast1. Även kataloger kan adresseras på detta sätt, katalogen för lab1 har adressen D:\USERS\Sten\ Expkursen\labbar\lab Aktuell katalog Varje gång vi vill spara en fil från ett program så finns det ett förstahandsalternativ, en katalog där programmet vi arbetar i sparar filer om inte användaren aktivt väljer en annan katalog. Denna katalog kallas aktuell katalog (engelska current directory ). Det är alltså här filer hamnar om vi inte aktivt anger en annan katalog. Exakt vilken katalog som är den aktuella kan variera från fall till fall. De flesta program har en katalog någonstans i den katalogstruktur som hör till programmet som används i standardfallet. Öppnar vi Microsoft Word och skapar ett nytt textdokument så sparas det i en katalog som hör till programmet, snarare än i en katalog som hör till dig som användare. Om vi däremot öppnar ett redan existerande dokument genom att dubbelklicka på det, gör några ändringar och sparar det under ett nytt namn så hamnar det i samma katalog som det ursprungliga dokumentet låg. Oftast bereder det oss inte någon större möda att hålla rätt på detta, när vi sparar ett dokument så öppnas ju en dialogruta där vi tydligt kan se i vilken katalog dokumentet hamnar, och vi kan välja en annan katalog. Men om vi till exempel sparar ComsolScripts workspace genom att ge kommandot save i kommandofönstret så får vi inte upp någon dialogruta utan ComsolScript sparar direkt i det som är den aktuella katalogen. Det finns ett antal kommandon som har med kataloghantering att göra. Vi kan finna vilken katalog som är aktuell genom att i kommandofönstret skrive pwd. Vi kan se vilka filer som finns i det aktuella katalogen genom att skriva ls. För att ändra aktuell katalog ger vi kommandot cd katalognamn. När vi gör det kan vi använda två konventioner, antingen ger vi katalognamn som den absoluta adressen, dvs en adress av typen D:\USERS\Sten\ Expkursen\labbar\lab1, en adress som börjar med namnet på disken och sedan fortsätter hela vägen ned till den katalog eller fil vi är intresserade av. Alternativt kan vi ge den relativa adressen, det vill säga adressen relativt det som är aktuell katalog. Om den aktuella katalogen är D:\USERS\Sten så kan vi ge den relativa adressen till samma katalog som ovan genom att skriva cd Expkursen\labbar\lab1. Ger vi en relativ adress så måste den börja med en katalog som ligger i det som för tillfället är den aktuella katalogen. En speciell variant av en relativ adress är.. (två punkter efter 5 Rent fysiskt är det ofta så att på datorer med mer än en hårddisk så finns det egentligen inte mer än en disk, men den är uppdelad i fler avgränsade avdelningar som för datorn ser ut som om de vore helt skilda enheter.

22 16 KAPITEL 2. ATT KOMMA IGÅNG varandra) som pekar på den katalog närmast högre upp i strukturen. Om den aktuella katalogen är D:\USERS\Sten\ Expkursen\labbar så kommer kommandot cd.. att ändra den aktuella katalogen till D:\USERS\Sten\ Expkursen Var söker ComsolScript efter filer ComsolScript har ett antal kommandon som innebär att programmet skall ladda in innehållet i en fil till workspace. Man kan till exempel genom att skriva load filnamn läsa in hela innehållet i filen med namn filnamn in i ComsolScripts workspace, man kan också genom att bara skriva filnamn instruera ComsolScript att läsa in och utföra de kommandon som finns sparade i filen filnamn.m. För att detta skall fungera krävs givetvis att ComsolScript hittar filen i fråga. Det fungerar om den fil vi anger ligger i den aktuella katalogen, men dessutom har ComsolScript en lista med kataloger där den söker efter de filer vi anger i våra kommandon. En sådan lista kallas sökväg (eng. search path). När vi skriver in ett filnamn så kommer ComsolScript att först leta efter filen i den aktuella katalogen, därefter söks filen i alla kataloger som finns med i sökvägen, i den ordning som katalogerna står i sökvägen. Det kan alltså vara viktigt i vilken ordning katalogerna är listade i sökvägen, om det finns flera filer med samma namn. För att arbeta med sökvägen använder vi kommandot path. Om vi bara ger kommandot path listas vilka kataloger som för närvarande ingår i sökvägen. Skriver vi ett filnamn kommer ComsolScript att söka efter filnamn.m i de kataloger som listas i sökvägen i den ordning de listas där. Vi kan förändra listan över sökvägar på två sätt, antingen genom att ge kommandot path(sträng1), där STRÄNG1 är en textsträng som anger ett antal kataloger, separerade med antingen ; (på i Windows), eller : (i alla andra operativsystem). Vi kan också ge kommandot path(sträng1, STRÄNG2) vilket resulterar i att sökvägen ges av unionen av STRÄNG1 och STRÄNG2. Ett viktigt specialfall är när en av strängarna är path vilket anger de redan existerande sökvägarna, path(sträng1,path) lägger till STRÄNG1 före de sökvägar som redan existerar. Du kommer säkert att finna att det oftast är väldigt bekvämt att se till att ditt SU-konto finns i den definierade sökvägen Var skall jag spara filer Eftersom vi arbetar på datorer som används av många personer måste vi vara noggranna med var på hårddisken vi sparar data så att vi inte lämnar efter oss en massa skräp som andra inte är intresserade av. Likaledes är det kanske inte särskilt attraktivt att behöva återvända till exakt samma dator vid nästa arbetspass. Det finns egentligen bara två areor som inte är allmänna, det vill säga som används av alla som använder datorn. Den ena är katalogen USERS som ligger på D disken på datorn. För tillfälligt sparande av personliga filer kan man skapa en underkatalog till denna katalog med sitt eget namn. Men kom ihåg att denna katalog bara kan ses på just denna dator. Använd därför den katalogen bara för temporär lagring under ett arbetspass. Filer som man vill spara för längre tid och kunna komma åt oavsett vilken dator man sitter vid skall sparas på den diskarea som hör till ditt SU-konto. För att ha en rimlig chans att hitta sina sparade data bör man ha en tydlig indelning i olika kataloger som var och en hör samman med ett tydligt delprojekt. Så till exempel bör du antagligen ha en katalog för varje kurs du följer. När vi kommit igång med labbandet är det antagligen bekvämt att ha en katalog som heter Laboration 1 exempelvis med underkataloger rådata, m-filer, rapport mm. Under övandet med ComsolScript bör man därför skaffa sig kataloger som t.ex pass 1 och sedan lägga dem i en katalog som kallas ComsolScriptövningar. Namn på katalogerna är givetvis helt fritt att välja, men det bör vara en logisk struktur där alla filer i en given katalog hör ihop, och har namn som gör att man förstår vad det är för fil utan att behöva öppna den och titta efter.

23 2.5. M-FILER 17 Vartefter som du börjar bygga upp ett bibliotek av standardfiler (t ex sådana som beräknar normalfördelningen) som du tror att du kan komma att använda i olika projekt så bör du kanske spara dessa i en bibliotekskatalog som inte är direkt associerad med en specifik kurs eller laboration. Observera att alla filer som sparas på allmänna områden riskerar att raderas, antingen av misstag av någon av dina kollegor, eller också av systemansvariga när de städar upp på datorns hårddisk Att spara och läsa tillbaks innehållet i workspace Om man sitter mitt i en komplicerad beräkning i ComsolScript kan det vara väldigt besvärligt att avbryta arbetet eftersom ComsolScripts workspace som innehåller alla definierade variabler och deras värden i så fall går förlorat. Har vi knappat in priserna för femton olika godissorter så vill man inte gärna ha det arbetet ogjort och börja om igen bara för att kompisen vill att man skall logga ut och följa med och fika. I sådana nödsituationer kan man spara hela innehållet i ComsolScripts workspace till en diskfil. När man sedan vill återuppta arbetet kan man läsa in filens innehåll till ComsolScripts workspace och enkelt fortsätta med precis samma omgivning som man hade innan man gjorde paus. Sparar man workspace i en AFS-monterad katalog som kan nås från alla datorer så kan man till och med fortsätta på vilken dator som helst. För att spara innehållet i workspace ger man helt enkelt kommandot save( filnamn ) i kommandofönstret. Innehållet i workspace sparas då till en fil med namnet filnamn.ws i den aktuella katalogen (ComsolScript lägger automatiskt till ändelsen.ws ). Filnamet kan vara en sträng som innehåller en komplett sökväg, du kan alltså spara direkt till ditt AFS konto. För att läsa tillbaks innehållet i filen till workspace ger man kommandot load( filnamn ) (utan ändelse). För att detta skall fungera måste filen filnamn finnas antingen i den aktuella katalogen eller i någon av de kataloger som ingår i ComsolScripts sökväg, eller också måste filnamn innehålla en komplett sökväg. 2.5 M-filer Det absolut smidigaste sättet att använda ComsolScript är att konsekvent jobba med så kallade m-filer. I en m-fil kan man skriva in alla kommandon man kan skriva i ComsolScripts kommandofönster och spara dessa till hårddisken. När man sedan skriver namnet på m-filen i ComsolScripts kommandofönster så utförs alla kommandon som står i filen och resultatet visas i ComsolScripts kommandofönster. Genom att utnyttja m-filer kan vi spara en otrolig mängd arbete. Vi kan till exempel skriva in alla rådata från en laboration i en m-fil, sedan steg för steg skriva in alla operationer för att göra mätvärdesbehandling på laborationen. Därefter skriver vi in de kommandon som krävs för att producera de grafer vi skall redovisa i laborationsredogörelsen. Vi kan när som helst i den här processen ta paus, spara filen till disk och fortsätta vid ett senare tillfälle. Det är också enkelt att ändra ett enstaka kommando om man har fått någon formel om bakfoten, eller om man vill ändra någon detalj i ett histogram. Det bästa man kan göra som student är att bygga upp ett förråd av små m-filer som gör avgränsade uppgifter, till exempel en anpassning till en andragradskurva eller en beräkning av chi-kvadrat. Eftersom en m-fil kan kalla en m-fil kan filer som utför klart definierade uppgifter enkelt återanvändas när liknande problem skall lösas editera m-filer Det finns inget som säger att du måste skapa de m-filer du kommer att använda inne i ComsolScript. I princip kan du starta vilken editor som helst och i den skapa en m-fil som du

24 18 KAPITEL 2. ATT KOMMA IGÅNG sedan sparar på disk. Du kan sedan köra den inifrån ComsolScript, förutsatt att filen sparas någonstans i ComsolScripts sökväg. Oftast är det naturligtvis enklast att starta editeringen inifrån ComsolScript. Detta kan göras på två sätt, antingen genom att starta ComsolScripts inbyggda editor, eller genom att starta en annan editor inifrån ComsolScript. I den här kursen kommer vi för det mesta att anta att vi jobbar med en extern editor som heter Crimson 6. Du kan själv välja vilket av dessa alternativ som skall användas genom att i ComsolScripts arkiv meny klicka på inställningar. Under avsnittet Editor kan du antingen klicka i Intern editor eller Extern editor. Väljer du det senare kommer förmodligen oftast Crimson redan vara vald i rutan, men om så inte är fallet så får du klicka på bläddra och i det fönster som kommer upp leta reda på Crimson. Normalt kommer Crimson att finnas på C:\Program Files\CrimsonEditor. När du valt den editor du kommer att jobba med så klickar du bara på OK ComsolScripts inbyggda editor Den inbyggda editorn saknar många av de finesser vi idag har vant oss vid, men den fungerar. För att t ex skapa en fil som säger hej till oss när vi kör den skriver vi edit. Du får då upp ett nytt fönster med titeln untitled.m - COMSOL Script Editor. I Edit -menyn har du tillgång till kommandona cut, copy and paste som har de vanliga funktionerna av att klippa ut, kopiera och klistra in. I menyn File kan du välja mellan New - öppnar ett nytt tomt editorfönster Open - öppnar en redan existerande fil i ett nytt editorfönster. Save - sparar innehållet i editorfönstret till en fil på disken. Save As - sparar innehållet i editor-fönstret till en nydöpt fil på disken. Close - stänger editorfönstret. Du kan nu börja skriva in din matlab-kod i fönstret, skriv t ex sedan spara filen som HejEtt.m. disp( Hello World och Crimson editor Om du som beskrivs ovan har ställt in Crimson editor som extern editor och skriver edit i ComsolScripts kommandofönster så öppnas Crimsons editeringsfönster. Det första du skall göra här är att gå in i menyn document och under Syntax type välja matlab. Det här är en av de stora fördelarna med Crimson över t ex den inbyggda editorn, Crimson känner till en hel del om matlabs-språket. Prova t ex att skriva in % Detta är en kommentar disp( Hello World ) Här händer många saker som inte hände i den inbyggda editorn: Första raden färgas grön. Grönt visar att det som skrivs ut är en kommentar som inte kommer att utföras. Mer om detta nedan. 6 Ett av flera skäl till att välja just den editorn är att du själv gratis kan ladda ned den till din hemdator från

25 2.5. M-FILER 19 disp skrivs ut med blå text. Detta visar att det är ett kommando som finns i matlabspråket. Hellow world färgas violett. Violett är strängar. När du skriver dit högerparantesen efter strängen skriver editorn ut ett tjockt svart streck under den och den vänsterparantes som hör ihop med den du just skrivit in. Detta kan vara oerhört värdefullt när du skriver in komplicerade uttryck med flera parantesnivåer, då kan man lätt tappa bort vilken högerparantes som hänger ihop med vilken vänsterparantes. En ytterligare hjälp är att Crimson längst ned skriver ut vid vilken rad och kolumn pekaren befinner sig. Detta är väldigt bra, eftersom om det finns något syntax-fel i filen så kommer ComsolScript att säga på vilken rad och kolumn felet finns, och då är det naturligtvis bra att kunna hitta dit direkt. Vi kommer inte att gå in i detalj på alla finesser som finns i editorn, du kan använda sammma kommandon för att editera text och spara och öppna filer på samma sätt som för den inbyggda editorn. I övrigt hänvisar vi till den inbyggda hjälpen. Spara nu din fil som HejTva.m Att spara en m-fil på disk Hela poängen med att skapa en m-fil är ju att den skall sparas på hårddisk. För att göra det går vi, oavsett vilken editor vi arbetar i, in i File menyn och väljer Save. Om filen vi vill spara är nyskapad och inte har något namn så kommer editorn att öppna en dialogruta där vi kan ange filens namn och i vilken katalog den skall ligga. Har vi ändrat i en redan existerande fil så sparas den ändrade versionen med samma namn som den ursprungliga. Observera att det här innebär att den ursprungliga versionen är förlorad för gott. Det kan därför vara klokt, särskilt om man vill ändra i en komplicerad redan fungerande fil, att istället för att spara den med samma namn som tidigare spara en kopia med ett annat namn så att den ursprungliga, oförändrade versionen av filen finns kvar på hårddisken. Detta gör man genom att istället för att ange Save väljer Save as... under File -menyn. Vi får även i det här fallet upp dialogrutan där vi kan välja namn och katalog för filen. När man väl har introducerat alla ändringar och fått dem att fungera som man önskar kan man slänga den gamla filen och döpa om den nya till det gamla namnet om man så önskar. En genväg för att spara filen i Crimson är att klicka på diskett-symbolen i verktygsraden. För en ny fil får vi då upp dialogrutan och kan välja namn och katalog, en gammal fil sparas med det gamla namnet Läsa in och köra en m-fil Enklaste sättet att köra en m-fil är att bara skriva dess namn i kommandofönstret. Om filen finns antingen i den aktuella katalogen eller i någon katalog i sökvägen (se avsnitt 2.4.2) 7 7 Om det finns fler filer med samma namn i olika kataloger som finns i sökvägen så väljer ComsolScript den som kommer först. Om resultatet inte blir vad man tänkt sig kan det bero på att det finns en namne till den fil vi egentligen vill köra, och att den hamnar före i kön.

26 20 KAPITEL 2. ATT KOMMA IGÅNG så kommer de kommandon som finns i filen att utföras 8. Prova: C HejEtt Hello World C HejTva Hello World Du kan också köra en m-fil direkt från kommandofönstret genom att i menyn Arkiv välja Kör en m-fil och i det fönster som kommer upp klicka på den fil du vill köra, eller genom att bara skriva control-r och sedan välja filen i det fönster som kommer upp Kommentarer I princip är det ingen skillnad på hur ComsolScript hanterar kommandon som skrivs in i kommandofönstret och kommandon som läses in via en m-fil. Det finns ändå ett antal kommandon som man knappast använder i kommandofönstret men som spelar en stor roll när vi jobbar med m-filer. Viktigast av dessa är kommentarer. Kommentarer inleds med ett procenttecken % och följs av godtycklig text. När ComsolScript utför kommandon ignorerar programmet procenttecknet och vad som följer efter det. Syftet med kommentarer är att göra det enklare att titta i en m-fil och kunna följa med vad programmet gör, och hur. Detta är användbart både om man använder program skrivna av andra, men också när man ett år senare (kom ihåg att ni skall spara alla era gamla m-filer!) återvänder till filer man själv har skrivit, det kan vara nog så svårt att minnas vad man själv tänkt och gjort! Kommentarer används 1. som en varudeklaration i början av ett program (i det här sammanhanget är en m-fil att betrakta som ett program) för att beskriva vad programmet gör, vad det heter, vem som har skrivit det och när, samt om programmet behöver någon speciell typ av indata eller levererar någon speciell typ av ut-data. 2. för att beskriva vad de viktigaste variablerna står för 3. vad de olika programstegen utför Det går nästan alltid att med ett snabbt ögonkast skilja ett program skrivet av en van programmerare från ett skrivet av en nybörjare, även om man inte begriper ett skvatt av vad programmet gör. Eftersom en av skillnaderna ofta är mängden kommentarer - en duktig programmerare skriver mycket kommentarer - så kan man ibland frestas att skriva en kommentar även för triviala steg, vilket inte underlättar läsningen. Exakt hur mycket och vilka avsnitt som skall kommenteras kan vara en smaksak, men ett exempel som författaren tycker är rimligt kan vara: 8 Observera att i den första versionen av ComsolScript vi kör - 1.0a - så fungerar inte detta. På grund av en bugg i programmet så kommer de filer som skapats efter det att ComsolScript startades inte att synas även om de ligger i sökvägen (ligger de i den aktuella katalgoen fungerar det). För att filerna skall vara tillgängliga får man ge commandot clear functions. Representanter för COMSOL har lovat att detta fel skall vara åtgärdat i version 1.0b som kommer under april 2006

27 2.5. M-FILER 21 % % Volume.m % Beraknar volymen for cylindrar baserat pa % matt radie och angiven hojd % Sten Hellman % Radie = [ ] Hojd = [ ] Volym = pi*radie.^2.* Hojd % Felet i radien ar konstant 0.3, felet i hojden % ar 10% av matetalet DeltaRadie = 0.3 * ones(1,6) DeltaHojd = 0.1 * Hojd DeltaVolym = Volym.* sqrt( (DeltaRadie./... (2*Radie) ).^2 +(DeltaHojd./ Hojd).^2) Däremot vore till exempel % Volymen ar pi * r-kvadrat * hojden Volym = pi*radie.^2.* Hojd en överdrift som knappast gör det enklare att följa koden In- och utmatning av data till M-filer En annan skillnad mellan att skriva m-filer och ge kommandon direkt i kommandofönstret är hur data matas in i ComsolScript och hur de presenteras för den som utför ett kommando. Kommandot disp är ju till exempel oftast inte särskilt meningsfullt i kommandofönstret. Att få ComsolScript att skriva Hallo World genom att själv skriva precis samma sak i argumentet till kommandot disp är ju måttligt intressant. I en m-fil som man kör är kommandot däremot mycket nyttigt eftersom det kan användas för att skriva information i kommandofönstret som kan ange resultat av beräkningar eller ange att vi skall mata in information till ComsolScript. Vi kommer snart att märka att det finns ett behov av att kunna mata in data till en körande m-fil och att skriva ut data från filen till kommandofönstret. Man kan till exempel tänka sig att m-filen i föregående avsnitt istället för att beräkna volymen av ett antal cylindrar där vi skriver in radie och höjd i m-filen skriver en mer allmän m-fil som kan användas för att beräkna volymen av en godtycklig cylinder. En sådan m-fil behöver då ha en metod för användaren att mata in ett godtyckligt värde på radien och höjden, och en metod att mata ut resultatet från beräkningen i kommandofönstret. Vi kommer att lära oss hur det går till i avsnitt 9.2 nedan där vi går igenom så kallad formaterad in- och utmatning. Men redan innan vi lärt oss detta kan vi kommunicera med m-filer genom att utnyttja att m-filer och kommandofönstret använder samma workspace. Om vi till exempel kör m-filen ovan för att beräkna cylindervolymer så kommer variabeln Volym som innehåller resultatet att finnas kvar i workspace. Vi kan alltså genom att skriva Volym i kommandofönstret se resultatet av beräkningen. Omvänt kan man tänka sig att ta bort raden Radie = [ ] ur m-filen och istället innan vi kör m-filen tilldela värden i kommandofönstret. Eftersom Radie då existerar i workspace kommer m-filen att fungera precis som vanligt. På det sättet går det enkelt att köra om filen med olika värden på radien, det är bara att skriva in nya värden på Radie.

28 22 KAPITEL 2. ATT KOMMA IGÅNG Utskrift när M-filen kör - Echo kommandot När ComsolScript kör en m-fil så skriver programmet ut varje kommando i kommandofönstret, följt av svaret på kommandot. Det här kan vara väldigt bra om vi sitter och jobbar med en m-fil som ännu inte fungerar som det var tänkt. Men för en fungerande och litet komplicerad m-fil kan det vara väldigt irriterande, kommandofönstret fylls av information som man ofta inte är intresserad av. För att styra detta kan man använda kommandot echo. Skriver vi echo off stängs repetitionen av varje kommando av, skriver vi echo on så sätts den på igen. Fullständig dokumentation av kommandot får du om du skriver help echo. Att sätta echo till off innebär att vi inte behöver se varje kommando upprepas på skärmen, men fortfarande så kommer ComsolScript att visa resultaten, om vi till exempel kör en m-fil med kommandot Radie = [ ] med echo on så ser vi Radie = [ ] Radie = i kommandofönstret. Har vi däremot satt echo till off så ser vi Radie = i kommandofönstret. Även för en fungerande m-fil kan det vara bra att se vilka värden de viktigaste variablerna har, men vi vill förmodligen inte se alla variabler och vilka värden de antar. För att slippa eko av dessa oviktiga variabler använder vi samma knep som när vi skrev in kommandon direkt i kommandofönstret - vi avslutar raden med semikolon Paus i utskriften Ibland vill man att en m-fil som kör skall stanna upp så att man hinner se delresultat. Speciellt om man visar fler plottar i samma figurfönster och vill hinna titta på en plot innan programmet skriver över den med nästa. Då kan vi använda kommandot pause. Ger vi kommandot utan argument i en m-fil så gör exekveringen av filen halt när den kommer till pause-kommandot och programmet skriver ut pause i kommandofönstret. Programmet fortsätter att köra när vi trycker ned en godtycklig tangent. Vi kan också ge kommandot med ett sifferargument, programmet gör då en paus i det antal sekunder som ges i argumentet Namngivning av M-filer En viktig detalj att tänka på är att en m-fil inte skall ha samma namn som en variabel som förekommer i filen. Det är lätt hänt att man ger både filen och den viktigaste variabeln ett namn - samma namn - som anknyter till den uppgift programmet skall lösa. Det här kan leda till mycket förvirrning. Antag till exempel att vi i avsnitt hade kallat m-filen volym. Första gången vi kör filen går allt väl, men om vi därefter ändrar någon liten detalj i programmet och försöker köra om så ser vi antagligen inte alls det vi förväntar oss. Orsaken är att programmet själv skriver in vektorn volym i ComsolScripts workspace. Nästa gång vi försöker köra programmet med samma namn kommer ComsolScript inte att tolka volym som en referens till programmet, utan till vektorn och som respons på kommandot kommer den att skriva ut innehållet i vektorn. Om ni någon gång sitter och försöker ändra i en m-fil men förändringarna inte slår igenom kan det därför vara idé att kontrollera om det finns en variabel med samma namn som m-filen.

29 Kapitel 3 Vektorer och matriser Inbyggda funktioner I det här passet skall vi lära oss hur vi kan hantera vektorer och matriser, samt hur man gör för att skriva program som utför monotona upprepade arbetsuppgifter med enkla kommandon. Vi skall ven g igenom hur man skriver program som kan utföra olika operationer beroende på värdet på vissa kontrollparametrar. 3.1 Litet om vektorer I ComsolScript definieras vektorer i stort sett som i matematiken: en ordnad följd av tal. Att vi skriver i stort sett beror på att en ComsolScript-vektor utöver tal också kan innehålla text-strängar, vi återkommer senare till denna typ av vektorer och koncentrerar oss på vektorer och matriser som endast innehåller tal. När vi talar om vektorer i fysiken så är vi ofta inte så noga med distinktionen mellan radvektor och kolumnvektor (vi använder för det mesta bara radvektorer). I ComsolScript kommer vi att göra skillnad mellan radvektorer och kolumnvektorer, liksom i fysiken är standard -vektorn en radvektor. Kolumn-vektorer skapas genom att transponera en radvektor. ComsolScript betraktar vektorer som specialfall av matriser, en radvektor med n element är en (1 n) matris, en kolumnvektor är en (n 1) matris Skapa vektorer Det enklaste sättet att skapa en radvektor är genom direkt tilldelning, kommandot C x = [ ]; skapar en radvektor med fyra element och ger dem de angivna värdena. Tecknen [ och ] kallas hakparanteser, du skriver dem genom att samtidigt som du trycker ned tangenten Alt Gr till höger om mellanslagstangenten trycka ned 8 resp 9. Vill vi se vilka värden vektorn har skriver vi som vanligt bara namnet på vektorn i kommandofönstret. Vi kan som vanligt adressera enskilda element i vektorerna genom att ge ett index som pekar på ett av elementen i vektorn, x(1) är första elementet i vektorn x osv. 23

30 24 KAPITEL 3. VEKTORER OCH MATRISER INBYGGDA FUNKTIONER Vektorer kan också tilldelas värden som beräknas C y = 7.2; C clear x C x = [y y/2 y+4]; C x x = Här ser vi hur ComsolScript kan beräkna värden för enskilda vektorelement ur givna uttryck. Vill vi skapa en kolumnvektor så gör vi det genom att transponera en radvektor med operatorn. 1 C a = [ 1 2 4] a = C b = a b = Alternativt kan man ge transponeringsoperatorn direkt i tilldelningssatsen: = [ ] markerar direkt att b skall vara en kolumnvektor Räkna med vektorer Vektoralgebran i ComsolScript fungerar som vi är vana vid från matematiken: C a = [1 2 5]; C b = [2-1 3]; C 3*a ans = C a + b ans = C c = a(3) - 7*b(2) ans = 12 C a + 3 ans ComsolScript klarar också av skalärpodukt av vektorer, under förutsättning att man ställer upp det som en matrismultiplikation, det vill säga som en multiplikation av en (1 n) matris med en (n 1) matris för att få en (1 1) matris: C c = a * b c = 15 En annan litet speciell egenskap är att vi kan applicera vissa standardfunktioner på en vektor 1 Det vinns två snarlika tecken på tangentbordet, akut accent och enkelt citationstecken. Operatorn vi skall använda är det senare tecknet, som delar tangent med * nära retur-tangenten

31 3.1. LITET OM VEKTORER 25 och få en ny vektor: C x = [ 0 pi/4 pi/2 3*pi/4 ]; C y = sin(x) y = Elementvisa operationer Ett begrepp som är nytt relativt matematikens vektoralgebra är de elementvisa operationerna. Detta är normala matematiska operationer som utförs på varje element i vektorn i stället för på vektorn själv. Ett exempel är kvadrering, om a är en vektor så betecknar a 2 skalärprodukten av vektorn med sig själv. Många gånger vill vi dock göra saker som att från en vektor med x-värden skapa en vektor med motsvarande x 2 -värden. Det vi vill göra är ju då inte att ta kvadraten av vektorn x, utan kvadraten av varje element i vektorn x och skapa en ny vektor med dessa som element. Detta gör man genom att använda elementvis exponentiering. Vi kan också utföra till exempel elementvis multiplikation mellan två vektorer. En sådan produkt är inte detsamma som skalärprodukten av vektorerna, utan en ny vektor där varje element består av produkten av motsvarande element i de två ursprungliga vektorerna. Elementvisa operatorer har samma symbol som de vanliga operatorerna omedelbart föregånget av en punkt. Vi har t.ex. C clear all; C x = [ ]; C y = x. 2 y = C x.* y ans = C a = [ ]; C a./ y ans = C 1./ x ans = Litet om matriser ComsolScript har en väl utvecklad uppsättning specialfunktioner för matris-algebra. Vi kommer snart att återvända till det, nu börjar vi med att lära oss att skapa matriser och göra några enkla beräkningar med dem.

32 26 KAPITEL 3. VEKTORER OCH MATRISER INBYGGDA FUNKTIONER Skapa matriser Det enklaste (men ofta långt ifrån minst arbetskrävande) sättet att skapa en matris är att skriva in data rad för rad, med hakparantes i början och slutet: C A = [ ] A = Ett enklare sätt att skriva in samma sak är att avgränsa rader med semikolon: C clear all C A = [1 2 4 ; ; 2-1 0]; ger exakt samma resultat. Man kan också skapa matriser ur vektorer: C clear all C b1 = [1 2 4]; b2 = [1 0 3]; b3 = [2-1 0]; C B = [b1 ; b2; b3 ] B = För att komma ihåg vilka element som hamnar var i matrisen kan det vara bra att se saken litet formellt: i raden där vi skapar matrisen B skapar vi rent formellt en 3 1 matris (eller om man så vill en kolumnvektor) där varje rad består av ett element som i sin tur är en vektor, tredje raden blir då lika med vektorn b3 osv. Vi kan vända på steken: C clear all C c1 = [1 ; 2 ; 4]; C c2 = [1 ; 0 ; 3]; C c3 = [2 ; -1 ; 0]; C C = [c1 c2 c3 ] C = Här skapar vi formellt en 1 3 matris (en radvektor) där varje element i sin tur är en kolumnvektor. Om man tänker på det sättet så kan man nästan grafiskt se vad satsen C = [c1 c2 c3 ] ger för resultat Räkna med matriser Normal matrisalgebra fungerar i ComsolScript, dessutom har vi tillgång till de elementvisa operatorerna och vi kan också applicera en mängd standardfunktioner som till exempel cos(x)

33 3.2. INBYGGDA FUNKTIONER 27 också på matriser. Några exempel: C clear all C a = [1 2 5 ; ]; C b = [ 2-1; 5 2; -1 0]; C a * b ans = C 1./a ans = C b. 2 ans = C a(1,2) + b(2,1) ans = 7 Som vanligt gäller naturligtvis att matrisernas dimensioner måste matcha varandra för att matrismultiplikationen skall fungera, annars erhåller vi felmeddelandet: Error: Incompatible dimensions in matrix multiplication. Error in built-in function mtimes. 3.2 Inbyggda funktioner Det finns ett mycket stort antal standardfunktioner inbyggda i ComsolScript, man kan utgå ifrån att den funktion man vill använda också finns inbyggd och bara mycket sällan bli man besviken. De vanligast förekommande är grupperade i tvo sektioner, matematiska och logiska funktioner. Det enklaste sättet att få reda på vilka funktioner som finns är att i hjälpfönstret söka på?/vectors, Matrices, and Arrays/Working with Matrices and Arrays /Elementary and Special Math Functions och?/vectors, Matrices, and Arrays/Working with Matrices and Arrays /Relational and Logical Operators and Functions. När man väl hittat den funktion man söker kan man få mer detaljerade information om den genom att skriva help funktionsnamn i kommandofönstret Operationer på skalärer Avrundning ComsolScript har ett antal funktioner för att runda av decimaltal till heltal: floor som rundar av mot minus oändligheten, dvs mot närmast lägre tal vilket är detsamma som att bara droppa decimaldelen, round som rundar av mot närmaste heltal, ceil som rundar av mot positiva oändligheten, dvs närmast större tal, och fix som rundar av mot noll, dvs nedåt för positiva tal och uppåt för negativa tal Operationer på vektorer ComsolScript har ett antal inbyggda funktioner som opererar på vektorer. Vi har redan sett ett exempel på en sådan, nämligen transponering, som applicerad på en vektor gör om en radvektor till en kolumnvektor och vice versa. Andra funkioner är:

34 28 KAPITEL 3. VEKTORER OCH MATRISER INBYGGDA FUNKTIONER zeros, ones, rand, randn Dessa operatorer kan användas för att skapa vektorer och matriser utan att man behöver tilldela elementen sina värden ett och ett. zeros(n,m) skapar en n m matris där alla element är satta till noll. Som ett specialfall kan n eller m vara 1, i vilket fall en radvektor repektive kolumnvektor skapas. ones (n,m) skapar en n m matris där alla element är satta till 1. rand (n,m) och randn (n,m) skapar matriser där elementen är slumpvis fördelade, rand producerar tal som är jämnt fördelade mellan 0 och 1, randn producerar slumptal som är normalfördelade kring 0 med standardavvikelse lika med 1. För alla dessa gäller att om du bara ger en siffra som argument så skapas en kvadratisk matris. linspace Kommandot linspace(x1, x2, N)skapar en vektor som har N element, x1 som första element och x2 som sista element. Avståndet mellan elementen beräknas automatiskt så att de blir lika stora. Till exempel ger y = linspace(0,1,5) resultatet [ ] medan y=linspace(0,1,4) ger [ ] length(vektor) Kommandot length(vektor) returnerar längden av vektorn x, man kan spara resultatet i en variabel genom att ge kommandot langd = length(vektor). sum (vektor) beräknar summan av alla element i vektorn. kolon - operatorn kolon operatorn är en mycket användbar operator i ComsolScript, både när vi arbetar med vektorer och matriser. Den förekommer i fler olika versioner, vilket i början kan göra det litet förvirrande. Den enklaste formen är a : b viket helt enkelt motsvarar serien av tal från a till b med steget 1 mellan varje tal. Vi kan definiera steget till att vara något annat tal än 1, kolon operatorn ser då ut så här: a : c : b, vilket ger oss en serie tal mallan a och b, med steget c. Några exempel: C vektor1 = [ 2 : 6]; vektor1 = C vektor2 = [ 1 : -0.5 : -4]; vektor2 = kolonoperatorn är uppenbarligen ett utmärkt verktyg för att skapa vektorer med regelbundna intervall mellan elementet. Vi kommer snart att se att när vi skall producera grafer så är det just precis sådana vektorer som vi kommer att skapa om och om igen. Något annat som blir väldigt behändigt med hjälp av kolonoperatorn är att adressera en serie element i en vektor: C d = [ ]; C d(2:4) ans =

35 3.2. INBYGGDA FUNKTIONER Operationer på matriser De flesta av vektorfunktionerna opererar också på matriser, men ibland med litet oväntade resultat. Dessutom finns ett antal funktioner som är specifika för matriser. Några av de viktigaste är: sum(matris) Det är lång ifrån uppenbart vad vi kan förvänta oss här. Funktionen ger inte summan av alla element i matrisen, låt oss prova oss fram: C clear all C A = [ ; ; 7 8 9]; C sum (A) ans = sum (A) ger oss alltså tydligen en radvektor vars element är summan av kolumnerna i matrisen A. Detta beteende är något som kommer att återkomma, ComsolScript arbetar ofta med kolumnerna i en matris. Hur skall vi göra för att beräkna summan av raderna? Det enklaste är att anpassa sig till ComsolScripts preferenser, om ComsolScripts funktioner arbetar med kolumner och vi är intresserade av rader, låt oss transponera matrisen och sedan applicera funktionen på den transponerade matrisen. I det här fallet ger oss sum(a ) en radvektor vars element är summan av kolumnerna av den transponerade matrisern, vilket ju är samma sak som summan av raderna i den ursrpungliga matrisen. Vill vi sedan få det att se litet snyggt ut så transponerar vi resultatet, som ju är en radvektor, till en kolumnvektor. Hängde ni med? Det är nog enklare att bara göra det hela än att försöka läsa den här beskrivningen, alltså: C A ans = C sum(a ) ans = C sum(a ) ans = Kommandot sum(a ) ger oss en kolumnvektor där varje element är summan av raden i den ursprungliga matrisen. Gå igenom exemplet ovan och se till att du förstår alla led i operationerna! eye(n) Eye(N) producerar en N N enhetsmatris. diag(a) Om A är en matris resulterar diag(a) i en kolumnvektor där elementet i raden n motsvarar elementet i diagonalen av matrisen på rad n och i kolumn n.

36 30 KAPITEL 3. VEKTORER OCH MATRISER INBYGGDA FUNKTIONER Om A är en vektor, resulterar M=diag(A) i en matris där diagonalelementen är de samma som elementen i vektorn, alltså M(i,i) = A(i). Detta kommando är väldigt användbart när vi senare vill skapa kovariansmatriser. kolon operatorn Precis som för vektorer är kolonoperatorn ett bekvämt sätt att adressera delar av en matris: A(1:4,3) adresserar elementen som finns i rad 1 till och med fyra i den tredje kolumnen i matrisen A. Ett specialfall är när vi skriver : utan några omgivande siffror, operatorn resulterar då i alla element i en kolumn eller rad: A(:,3) ger alla element i tredje kolumnen av A.

37 3.3. ÖVNINGSUPPGIFTER Övningsuppgifter 1. Skapa en vektor med x-värden: x = (1, 3, 5, 7). Skapa sedan, genom beräkningar på x-vektorn där du använder de elementvisa operationerna, en vektor y där varje element uppfyller y = 3 x 2 + 4x för motsvarande element i x-vektorn. Skapa därefter vektorn yprim, där varje element är lika med derivatan av ekvationen ovan, beräknade för x-värden ur vektorn x. 2. Givet vektorn x = [ ], skapa (använd elementvis operation) y, där varje element ges av y i = 2x 3 i + 4x i 3 3. Konstruera tre kolumnvektorer: och skapa en matris med hjälp av dessa, vars första rad är (2 3 1). vektorerna för att skapa matrisen Använd sedan 4. Konstruera två (3 x 4) matriser A och B: A = och B = beräkna sedan A+B, A-B, A *B 5. Antag att du har gjort fyra mätningar, var och en med en osäkerhet om σ i (i = 1, 2, 3, 4). Kovariansmatrisen definieras då som: V 1 = 1 σ σ σ σ 2 4 Utgå ifrån vektorn S = [ σ 1 σ 2 σ 3 σ 4 ] = [ ] och skapa med enbart vektoroch matrisoperationer matrisen V = Utgå från vektorn alfa = [ ] som betecknar fyra vinklar i grader. Skapa sedan vektorn x där elementen är samma vinklar uttryckta i radianer. Skapa därefter vektorn s där elementen är sinus för de givna vinklarna.

38 32 KAPITEL 3. VEKTORER OCH MATRISER INBYGGDA FUNKTIONER Skapa slutligen vektorn c, där elementen är cosinus för de givna vinklarna. Använd inte funktionen cos, utan beräkna värdet genom formeln cos α = 1 sin 2 α. Använd dessa vektorer för att skapa matrisen A med fyra rader och tre kolumner, varje rad skall bestå av vinkel, sinus för vinkeln och cosinus för vinkeln 7. Fem bollar med olika massor m rullar på rad med varsin konstant hastighet v. Bollarnas massor och hastigheter ges av följande tabell: m (kg) v (m/s) Gör en vektor för samtliga massor och en vektor för samtliga hastigheter och beräkna därefter varje bolls rörelseenergi med ett enda kommando. Räkna ut totala rörelseenergin med ytterligare ett kommando.

39 Kapitel 4 Börja programmera 4.1 Villkorssatser Det är mycket vanligt att ett program skall utföra olika saker beroende på om vissa villkor är uppfyllda eller inte. Den enklaste formen av en villkorssats har formen: if (test)... end där test är en logisk test som är sann eller falsk. Om test är sann utförs koden mellan if och end, annars hoppas det avsnittet över. Enklare villkorssatser kan skrivas på bara en rad om man så önskar, med komma emellan kommandona: if (test),..., end ; Man kan även specificera vad som skall hända om test är falsk genom konstruktionen if (test)... kod 1 else... kod 2 end i det fallet utförs...kod 1 om test är sann, annars...kod 2. Slutligen kan man utföra fler tester med konstruktionen if (test1)... kod 1 elseif(test2)... kod 2 elseif(test3)... kod 3 else... kod 4 end I en sådan konstruktion utförs den kod som följer efter den första test som är sann, är test1 falsk men test2 sann utförs...kod 2 och så vidare. Om ingen av testerna är sann utförs...kod 4. En viktig sak att komma ihåg är att endast ett kodparti utförs, om fler av testerna är sanna så utförs det kodparti som svarar mot den av de sanna testerna som kommer först i konstruktionen. Är både test1 och test3 sanna i exemplet ovan så utförs bara...kod 1, inte...kod 3. Ett test byggs upp av någon av 6 relationsoperatorer: 33

40 34 KAPITEL 4. BÖRJA PROGRAMMERA a < b är sann om a är mindre än b a b är sann om a är mindre än, eller lika med b (kodas <= ) a == b är sann om a är lika med b (notera att vi inte kan skriva a = b, det kommandot sätter a till samma värde som b har) a b är sann om a är större än eller lika med b (kodas >= ) a > b är sann om a är större än b a = b är sann om a inte är lika med b Ett enkelt exempel på villkorssatser är villkorade utskrifter från ett program: if (x>0) disp( x är större än noll ) elseif(x<0) disp( x är mindre än noll ) else disp( x är lika med noll ) end Man kan också kombinera ihop två tester med hjälp av logiska operatorer: operator funktion logikfunktion & and(a,b) och a & b är sann om både a och b är sanna or(a,b) eller a b är sann om minst en av a och b är sann not(a,b) icke a är sann om a är falsk xor(a,b) exklusiv eller a xor b är sann om exakt en av a och b är sann Ett exempel på en sådan kombinerad test är if ((a < b) & (b<c)) som alltså är sann om a < b < c. Om vi använder oss av funktionsformen kan vi skriva samma test if (and(a<b,b<c)), men den viktigaste orsaken till att funktions formen finns är att den gör det lättare att definiera en boolsk variabel, vi kan t.ex. skriva C=and(a<b, b<c) där C är en variabel som har värdet true om villkoret a < b < c är uppfyllt och värdet false om det inte är sant. 4.2 Slingor En mycket viktig komponent i datorprogram är slingor, där monotona repetitiva moment upprepas på ett automatiskt sätt. Tag som exempel serieutvecklingen av cosinus-funktionen: cos(x) = ( 1) i x2i (2i)! = 1 x2 2! + x4 4! x6 6!... i=0 Skall vi för hand göra denna uträkning på en miniräknare måste vi räkna ut varje term för sig och sedan summera alla termer i ett register. Men allt som kan skrivas som en summa på ett så regelbundet sätt som den här formeln kan också kodas på ett enkelt sätt i datorprogram genom att använda så kallade slingor (engelska loop). Det finns två typer av slingor i ComsolScript: for-slingor och while-slingor.

41 4.2. SLINGOR for-slingor For-slingor har formen for index=start:stop end Namnet på den variabel som man använder som loop-index, i exemplet ovan index är godtyckligt. Dock bör man kanske undvika att använda i eftersom det är namnet på en inbyggd funktion. Koden mellan första och sista raden utförs en gång för varje värde på index som anges i första raden. Ett mycket enkelt exempel som visar principen är följande lilla loop som ger oss 7:ans multiplikationstabell: for index = 1:10 k = index * 7 ; disp(k); end En uträkning av de första tio termerna i serieutvecklingen av cosinus kan skrivas som: x=pi/4; cosinus=0; for index=0:9 cosinus = cosinus + (-1) index * x (2*index) / (1:2*index); end (För att beräkna fakulteten använder vi funktionen prod(x) som beräknar produkten av alla element i en vektor x. Som ett för oss lycklig specialfall gäller prod(1:0)=1). Att det här är ett fantastiskt ekonomiskt sätt att koda framgår av att det enda vi behöver göra om vi vill tiofaldiga antalet termer i summan är att ändra index=0:9 till index=0:99. Variabeln i slingan, i det här fallet index, behöver inte delta i de matematiska operationerna, man kan till exempel räkna till tio genom att använda slingan summa = 0; for index=1:10 summa = summa + 1; end En annan sak vi noterar är att variabeln behöver inte räknas upp med ett för varje varv i slingan, index=0:2:10 är en legitim konstruktion. Vi behöver inte ens använda heltal, index=0.2:0.1:0.7 är också en möjlig sling-variabel while-slingor While slingor har formen while (test) end Där test är något villkor som kan utvärderas, som till exempel i<4, sqrt(x)>sin(x) osv. Koden i en while-slinga utförs så länge villkoret i test är sant. Det här betyder för det första att vi måste initialisera de variabler som ingår i testen innan while-slingan startar, och för det andra att det är vårt eget ansvar att de variabler som ingår i testen förändras inuti den

42 36 KAPITEL 4. BÖRJA PROGRAMMERA kod som utförs mellan while och end. Tag till exempel slingan clear all; x=2; sum=0 while (x<4) sum=sum+1; end Denna slinga kommer aldrig att ta slut! Eftersom x är mindre än två när slingan börjar så går vi in i slingan. Men eftersom x inte ändras inuti slingan kommer villkoret alltid att vara sant så slingan kommer bara att fortsätta i all oändlighet. Vi måste alltså tänka oss för när vi använder while-slingor så vi inte får programmet att hänga. (Skulle du någon gång behöva avbryta ComsolScript i en beräkning som spårat ut, t ex genom att fastna i en oändlig loop så gör man det genom att gå till kommandofönstret och där trycka på ctrl-c, dvs control och c samtidigt. Programmet avbryter då vad det håller på med och lämnar tillbaka kontrollen till kommandofönstret). While-slingor är användbara i situationer där vi inte i förväg kan förutsäga hur många varv vi måste löpa igenom en slinga. En sak som gör while-slingor så användbara är att villkoret inte behöver vara ett villkor på en enstaka variabel, utan kan vara mer komplext. Antag till exempel att vi vill undersöka hur många termer vi måsta ta med i summan för cosinus innan skillnaden mellan summan och det verkliga värdet är mindre än något givet värde epsilon. Detta kan vi koda på följande sätt: x= pi/4; epsilon=1*10-6; cosinus=0; index=0; while (abs(cos(x)-cosinus) > epsilon) cosinus = cosinus + (-1) index * x (2*index) / prod(1:2*index); index=index+1; end out= Serien konvergerade efter ; disp(out); index disp( termer ) Att hoppa ut ur en slinga - kommandot break Ibland vill man hoppa ur en slinga innan den nått det slut som angivits. Antag till exempel att vi skriver en rutin som skall kontrollera om ett tal är primtal eller inte. Vi vet att den minsta faktorn inte kan vara större än roten ur talet självt. Vi behöver därför bara testa att dividera med alla heltal upp till roten ur talet om ingen division går jämnt upp är talet ett primtal. Men om vi någonstans på vägen hittar en primfaktor så behöver vi ju inte fortsätta till det bittra slutet, finns det en faktor så är talet i fråga inte ett primtal. Att dividera med alla heltal upp till det tal som är kvadratroten ur talet är urtypen för en uppgift som vi löser i en slinga. Men om vi hittar en faktor vill vi hoppa ur slingan med en gång istället för att utföra en massa onödiga divisioner och tester. Här kan vi använda kommandot break, som när det utförs hoppar till den del av koden som står efter end kommandot för slingan. En sådan kod kan se ut så här (vi bortser här ifrån att vi egentligen inte behöver testa andra

43 4.3. FUNKTIONER 37 jämna tal än 2): index=2; primtal=1; while (index <= sqrt(x)) kvot = x / index; rest = x - index*floor(kvot); % om rest är noll går divisionen jämnt ut if(rest==0) primtal=0; break; end index=index+1; end 4.3 Funktioner Det finns många uppgifter som vi vill utföra ofta i olika sammanhang, i den här kursen kommer vi till exempel ofta att vilja beräkna en normalfördelning med ett givet medelvärde och standardavvikelse. Istället för att skriva den kod som behövs för att utföra detta, och sedan kopiera in den i varje m-fil där vi har behov av den kan vi skriva en så kallad funktion som vi med ett enkelt anrop kan köra i vilken m-fil som helst. Det kan ju också vara så att vi vill göra samma sak på flera olika ställen i en stor m-fil, då är det enklare att kalla en funktion än att upprepa koden på flera ställen i samma fil. En annan fördel med en funktion är att alla variabler är lokala, det vill säga en funktion delar inte workspace med det program som anropar funktionen. Detta är en stor fördel i stora program där det annars kan vara svårt att hålla reda på alla variabler som används till exempel för index i slingor eller x-koordinater i plottar (man kan inte använda samma variabelnamn i två olika betydelser!) För att detta skall fungera väl måste vi dels följa en viss syntax för hur en funktion skall kodas i ComsolScript, men också skriva koden som skall rymmas i funktionen på ett klokt sätt. Vi måste försöka göra funktionen så allmän som möjligt så att den verkligen går att återanvända. Vi skall exemplifiera med att skissa hur man kan skriva en funktion som för en given in-vektor x beräknar en y-vektor med normalfördelningens värde i motsvarande punkter. Vi skall kunna ange vilket medelvärde och standardavvikelse fördelningen skall ha, men om vi utelämnar dessa argument så skall standard normalfördelningen, det vill säga den med medelvärde 0 och standardavvikelse 1 beräknas. Vi får alltså om vi definierar en vektor x, och sedan skriver y=normal(x,medel,sigma) en y-vektor som innehåller värdet för normalfördelningen i varje punkt x som vi anger när vi anropar funktionen Syntaxen för funktioner En funktion inleds alltid med en rad som börjar med function och sedan ger syntaxen för hur funktionen anropas. I vårt fall börjar funktionen alltså: function y=normal(x, mean, sigma) Här är y resultatet av funktionen, de variabler som ges inom parantes är funktionens argument. Eftersom varje funktion har en separat workspace så är enda sättet att utbyta information mellan en funktion och det program som anropar funktionen genom argumenten och de värden som kommer ut ur funktionen. Om man behöver ge mer än ett (i det här fallet tre) utargument, resultat från funktionen, gör man det med hjälp av syntaxen function [a b c ]=normal(x, mean, sigma) Förutom första raden följer en funktion samma regler som vilken annan m-fil som helst vad gäller syntax. Har man bara designat gränssnittet mot omvärlden korrekt så att all nödvändig

44 38 KAPITEL 4. BÖRJA PROGRAMMERA information finns tillgänglig så är det sedan bara att koda den önskade algoritmen. Vi måste dock se till att spara den fil som innehåller funktionen med samma namn som vi ger i första raden, med tillägget (engelska extension).m help för en funktion En speciell sak med en funktion är att om vi skriver ett block med kommentarer efter första raden så kommer dessa att skrivas ut i kommandofönstret när vi skriver help funktionsnamn. Detta gäller bara det första blocket av kommentarer, ingen av de kommentarer som kommer längre ned i koden syns. Här skall vi alltså skriva in den information som kan behövas för att förstå hur man skall använda funktionen. Vi kan se massor av exempel på hur det kan göras, i själva verket är det precis det som händer varje gång vi skriver help i kommandofönstret, vi läser då helt enkelt det första blocket med kommentarer i den fil som utför funktionen. Vår funktion för normalfördelningen bör då börja någonting i stil med % NORMAL Normalf\"ordelningsfunktionen % y=normal(x,m,s) % Indata: x av typ vektor % m medelv\"ardet % s varians % % om m utel\"amnas s\"atts m=0 % om s utel\"amnas s\"atts s=1 % prova att koda detta och sedan skriva help normal (normal.m måste sparas någonstans i ComsolScripts sökväg) Testa antalet argument Vi har sett fler exempel på funktioner som accepterar olika antal argument, och som också levererar litet olika resultat beroende på hur många utvariabler man anger, ett exempel på det är kommandot hist (se avsnit 7.3.2) som kommer att bli en av våra favoriter. Det här är ett sätt att inte behöva introducera ett stort antal funktioner som gör nästan samma sak, men inte riktigt. Det är mer ekonomiskt att i stället låta en funktions beteende variera litet beroende på hur man anropar den, och hur man formaterar resultaten från funktionen. Rent tekniskt är det ju inte så svårt att låta en funktion göra litet olika saker med hjälp av villkors-satser, det gäller bara att veta hur funktionen har blivit kallad. För detta finns kommandona nargin och nargout som talar om hur många argument som gavs när funktionen anropades, och hur många ut-argument som angavs i anropet. Genom att testa på antalet argument kan vi styra villkoren för hur funktionen skall bete sig. if nargin < 3, s=1; end if nargin < 2, m=0; end en svaghet i denna konstruktion är att man måste utesluta argument bakifrån, dvs vi förutsätter att om ett argument är utelämnat så är det standardavvikelsen, och inte medelvärdet i exemplet ovan. Det finns vägar runt detta 1 men det kräver en hel del arbete och komplicerad kodning, så det lämnar vi till den som är speciellt intresserad. 1 Man använder kommandot varargin och tänker ut tester som kan avgöra vilka argument som faktiskt lämnades.

45 4.3. FUNKTIONER 39 På motsvarande sätt kan man testa hur många ut-argument som gavs i anropet, i vårt fall om normal kallades med y=normal(x,m,s) eller med normal(x,m,s). Att kommandot som gör det heter nargout kommer väl knappast som en överraskning? Exempel på funktion Vi visar här ett exempel på hur en funktion kan användas. Funktionen total räknar ut hur stor summa man måste betala för ett lån taget till olika räntor: function total=interest(belopp, rantesats, manader, period) % % total beräknar totalt återbetalat belopp. % % utdata total - total skuld % % indata belopp - lånat belopp % rantesats - räntesatsen i procent % manader - lånets löptid i månader % period [ m / y ] - period % för vilken räntesatsen gäller % måste vara antingen m för månad % eller y för år. % om period utlämnas antas år % % Sten Hellman if (nargin == 3); period= y ; end; if (period == y ) total = belopp * (1 + rantesats/100) (manader / 12); elseif (period == m ) total = belopp * (1 + rantesats/100) (manader); else disp( perioden måste anges som m eller y ); total = -99; end Denna funktion kan man sedan kalla från ett program där man lägger in olika möjliga alternativ för att kunna bestämma vilket som är mest förmånligt: % kreditkort ett år till 4.3% i månaden kredit = interest(10000, 4.3, 12, m ) % bank ett år till 23% per år bank = interest(10000, 23, 12)

46 40 KAPITEL 4. BÖRJA PROGRAMMERA 4.4 Övningsuppgifter 1. Skapa en vektor med tio element som består av likformigt fördelade slumptal som antar heltalsvärden från 1 till Skriv en funktion som returnerar ett slumptal mellan 1 och 100. Talet skall vara ett heltal, dvs inga decimaler skall finnas med. Första raden i filen kan se ut så här: function y = slumptal() 3. Skriv ett program som genererar en slumpmässig tipsrad. Anta att sannolikheten för 1, x och 2 alla är 1/3, och låt programmet skriva ut tipsraden (en tipsrad består av tretton stycken tecken). Ett exempel på en körning kan se ut så här: >> tipsrad 2 x x 2 1 x En metod för att approximera kvadratroten av ett tal är Newtons metod som ger ) x yk med y k+1 = 1 2 (y k + x och y yk 1 = 1. Skriv en funktion y=newton(x) som använder denna metod för att beräkna kavdratroten ur ett godtyckligt positivt tal. Kadratroten skall anges korrekt avrundad med tre decimalsiffrors noggrannhet. Ledning: eftersom vi inte har något facit måste vi i funktionen själva avgöra när serien har konvergerat tillräckligt för att vi skall ha den sökta noggrannheten. Vi måste dessutom hitta på ett trick för att runda av korrekt, de rutiner vi har till hands rundar ju bara av heltal. Detta kan vi komma runt genom att transformera vårt decimaltal till ett lämpligt heltal som vi sedan rundar av och därefter transformerar tillbaks till ett decimaltal.

47 Kapitel 5 Ordbehandling med OpenOffice writer 5.1 OpenOffice OpenOffice är en serie program som erbjuder ungefär samma funktionalitet som Microsofts Office-paket. På Fysikum har vi just genomfört övergången från Microsofts produkter till OpenOffice av flera skäl: OpenOffice är öppen källkod och kan laddas ned gratis. Programmet finns för fler operativsystem än Microsofts produkter, speciellt så finns programmen även för operativsystemet Linux som är vanligt på Fysikum. Dessutom är OpenOffice.writer mycket bättre på att hantera formler än vad motsvarande Microsoft produkt är. Det är möjligt att byta filer mellan OpenOffice och Microsofts program men kompatibiliteten är inte 100-procentig, i synnerhet inte när man använder formler och symboler. Men i dessa fall är inte kompatibiliteten 100-procentig ens om man bara byter mellan två Microsoftprogramm under olika operativsystem. För dig som student innebär det här att du fritt kan ladda ned OpenOffice till din hemdator från Vi på Fysikum hjälper gärna till om du stöter på svårigheter med detta. Vi kan eventuellt också försöka göra några CD-skivor som de som har långsamma uppkopplingar kan anväda för att installera programmet. OpenOffice har en hjälpfunktion som är ganska lik den för Matlab. Den öppnar du genom att gå in i Help menyn och välja OpenOffice.org Help. Du får då upp ett fönster där hjälpfunktionerna för hela OpenOffice paketet finns tillgängliga. 5.2 Allmänna kommentarer Du startar OpenOffice genom att först trycka på knappen som det står Start på, och som har Windows-loggan på sig, som sitter i nedre vänstra hörnet. I den meny som sedan kommer upp trycker du på alternativet Programs, och till sist Microsoft Word i den meny som då kommer upp. Oftast ligger det även en ikon märkt MicroSoft Word på skrivbordet, i så fall är det naturligtvis enklare att bara dubbelklicka på den. Längst upp på Word-fönstret som öppnas finns en blå list. Om du tar musen och trycker med vänsterknappen på listen och håller den nedtryckt så kan du flytta runt fönstret tills det att du släpper knappen. Under listen finns Words menyer som heter Arkiv, Redigera, Visa och så vidare. Om du trycker på ett av dessa ord kommer en meny att öppna sig där du kan välja mellan menyns alternativ. Under raden med menyer finns det som kallas verktygsfältet. I verktygsfältet finns en mängd knappar och vi kommer att nämna de viktigaste som du bör känna till i detta dokument. Om du för musen över en knapp och håller den still där utan att trycka på någon musknapp så kommer en liten gul hjälpruta att visa sig där det står vad knappen 41

48 42 KAPITEL 5. ORDBEHANDLING MED OPENOFFICE WRITER gör. Testa detta! Under verktygsfältet sitter något som ser ut som en linjal, denna används för att sätta bredden på marginalerna på det dokument du ska skriva. Under denna linjal finns slutligen själva fönstret där du kan skriva in din text. När du startar Word ser det bara ut som ett tomt papper. På det tomma pappret kan du se ett blinkande vertikalt streck som kallas för markör. Markören talar om var den text du skriver in kommer att hamna. Du kan flytta runt markören med hjälp av piltangenterna, eller genom att klicka med musen på det ställe du vill att markören ska flytta sig till. 5.3 Textbehandling När du startat OpenOffice writer är det bara att börja skriva in text direkt. Man kan ändra utseendet på den text man skriver på många olika sätt. De vanligaste sakerna man kan vilja ändra på själva texten är vilket typsnitt (på engelska font ) man använder, vilken storlek texten har, om texten är fet, kursiv, eller understruken och hur texten är justerad (vilket vi visar lite senare). Att markera text Flera gånger i de här instruktionerna kommer vi att uppmana dig att markera någon textsnutt. Du markerar text genom att klicka med musen (vänster musknapp, när vi skriver klicka med musknappen avses alltid vänster musknapp om inget annat sägs) framför det första ordet i stycket du vill markera och sedan hålla nere musknappen medan du drar musen till det sista ordet du vill markera och sedan släpper musknappen. Testa att skriva in några ord i Word och att sedan markera dem. Man kan också markera ett helt ord genom att först klicka någonstans i ordet och sedan dubbelklicka med musen. Klickar man tre gånger i snabb följd markeras hela stycket. Klippa ut, Kopiera och Klistra in text Det är ofta man vill flytta runt saker man skrivit i ett dokument och då gör man det enklast genom att kopiera eller klippa ut den text man vill flytta och sedan klistra in den på det nya stället där man vill ha texten. Skillnaden mellan att kopiera och att klippa ut en bit text är att om du kopierar den så finns texten kvar där den står från början medan om du klipper ut den så försvinner den (men du kan alltid klistra in den igen). För att kopiera en bit text markerar du först texten. Sedan finns det fyra alternativa sätt att gå till väga och du ska använda det sätt du tycker är bekvämast. Det första sättet är att öppna menyn Edit genom att klicka på den, och sedan klicka på Copy. Ett annat sätt är att klicka på knappen i verktygsfältet. Det tredje sättet är att trycka på Ctrl-C (tryck ner tangenten som heter Ctrl i nedre vänstra hörnet på tangentbordet och håll den nedtryckt samtidigt som du trycker på tangenten för bokstaven C). Det fjärde sättet är att hålla ned Ctrl-knappen samtidigt som du trycker ned musknappen och drar iväg till det ställe dit du vill kopiera texten. När du släpper upp musknappen kopieras texten till det ställe där du är. Den här tekniken kallas Klicka och dra. Att klippa ut en bit text går till på ett väldigt likartat sätt som att kopiera text. Först måste du markera den textsnutt som du vill klippa ut. Sedan finns det igen fyra sätt att gå till väga. Det första är att öppna menyn Edit och sedan välja Cut. Det andra är att klicka på knappen i verktygsfältet och det tredje är att trycka på Ctrl-X. Slutligen kan du helt enkelt trycka på delete tangenten (men då går det inte att klistra in det du har tagit bort på ett annat ställe, vill du göra det kan du istället använda klicka och dra metoden, men utan att trycka ned ctrl tangenten när du drar). Efter att du har klippt ut eller kopierat en snutt text är nästa steg att klistra in texten igen där du

49 5.3. TEXTBEHANDLING 43 vill ha den. Detta gör du genom att flytta markören till det ställe där du vill att texten ska ligga, och sedan finns det fyra sätt (blev du förvånad?) att klistra in texten. Det första är att öppna menyn Edit och välja Paste in, det andra är att klicka på symbolen i verktygsfältet och det tredje är att trycka på Ctrl-V. Det fjärde sättet är att helt enkelt markera den textsnutt du vill flytta och sedan klicka och dra utan att trycka ned någon tangent. Detta sammanfattas i tabellen nedan: Kopiera Klippa ut Klistra in Sätt nummer 1 Välj Coopy i Välj Cut i Välj Paste i menyn Edit menyn Edit menyn Edit Sätt nummer 2 Tryck på Tryck på Tryck på Sätt nummer 3 Tryck Ctrl-C Tryck Ctrl-X Tryck Ctrl-V Sätt nummer 4 Klicka och dra med Tryck på delete Klicka och dra Ctrl nedtryckt Tabell 5.1: Kopiera, Klippa ut och Klistra in text Typsnitt OpenOffice har flera typsnitt fördefinierade som du lätt kan välja mellan. I verktygslisten finns en ruta där det står Times New Roman som på bilden här intill, och bredvid finns en nedåtpil. Om du klickar på nedåtpilen så öppnas en meny där du kan se OpenOffice s alla typsnitt (eng. font) och du väljer det du vill ha genom att klicka på det. Om du nu skriver in lite text ser du att den ser ut som det typsnitt du valt. Om man redan har skrivit in text och man i efterhand vill ändra typsnittet, eller om man bara vill ändra typsnittet på ett ord mitt i ett stycke text (som med engelskans font här ovan) gör man det lättast genom att markera den text man vill ändra och sedan välja typsnitt i menyn. Då kommer bara typsnittet på den markerade texten att ändras Storlek på texten Bredvid rutan där du väljer typsnitt finns en ruta där du väljer storlek på texten. När du startar OpenOffice så står det säkert antingen 10 eller 12 i den här rutan, och bredvid rutan med siffran finns en nedåtpil. Om du trycker på den så får du upp en meny med de alternativ som finns att välja mellan för storleken på texten. Det här är inget konstigt och du kan säkert prova dig fram själv Fet, kursiv och understruken text Du kan välja att skriva med fet text, kursiv text, eller understruken text, genom att trycka på någon av knapparna. Testa att trycka in en eller flera av dessa knappar och skriv sedan lite text. Om du vill ändra på en redan inskriven text kan du markera texten du vill ändra och sedan trycka på knapparna så ändras utseendet på den markerade texten. Testa även detta. Fet text är användbar när du skriver rubriker och när du skriver undertexter till tabeller och figurer i dina labrapporter. Kursiv text används när man vill betona något, men man bör använda detta sparsamt. Vidare använder man kursiv text när man skriver ekvationer (Equation Editor använder automatiskt kursiv text) och det är också snyggt att använda det när man pratar om variabler i en text, till exempel: Vi mätte längden x till värdet 10, och

50 44 KAPITEL 5. ORDBEHANDLING MED OPENOFFICE WRITER tiden t till värdet 5, och beräknade hastigheten v till v = x/t. Kursiv text används också ibland när man presenterar termer på andra spåk. Understruken text används sällan och är dessutom ganska jobbig att läsa. Nuförtiden används också understruken text ofta för att indikera länkar, man bör därför vara försiktig med att använda understruken text där det kan missförstås Att justera texten Med att justera texten menar man att bestämma längs vilken kant texten ska ligga, alternativt om den ska ligga i mitten (vara centrerad). Några exempel: Vanlig text är vänsterjusterad. Den här texten är centrerad. Är mer användbart än högerjusterad text. Det här är högerjusterad text. Den ligger till höger. Den här texten är marginaljusterad vilket som syns på raden ovanför kan se ganska bedrövligt ut om raderna blir korta, men som ibland används i löpande text för att få både rak vänstermarginal och högermarginal. Använder man marginaljusterad text och vill ha en enstaka kort rad så avslutar man den med return varvid den korta raden blir normalt vänsterjusterad. Man justerar texten genom att trycka på knapparna. Vanligtvis är knappen för vänstercentrerad text intryckt. Naturligt nog kan bara en av knapparna vara intryckt åt gången, så om du trycker på knappen för högerjustering så kommer den att tryckas in och knappen för vänsterjustering kommer att åka ut. Om du vill ändra justeringen på en redan inskriven text kan du som vanligt markera texten och sedan trycka på knappen för den justering som du vill byta till Att göra en rubrik Under Default (i övre vänstra hörnet, se bilden här bredvid) finns ett antal fördefinierade rubriktyper som ni väljer genom att trycka på nedåtpilen till höger om ordet Default och sedan klicka på den rubriktyp som ni vill ha. Som ni ser finns det ett antal rubriktyper att välja mellan, trycker man på more så kommer det upp ändå fler. Trycker vi t ex på Heading 1 får vi en rubrik satt med fet stil av litet större typsnitt, lämplig t ex för kapitel rubriker, Heading 2 är litet mindre och lämpar sig för avsnittsrubriker osv. När man skriver en labrapport är detta praktiskt, eftersom man nu lätt får samma utseende på alla rubriker i rapporten. Man kan definiera egna typer som man sedan kan spara på de tre platserna i menyn. För att definiera din egen rubriktyp gör du så här: Formattera texten som du vill att den nya rubriktypen skall se ut och markera den. Öppna menyn under Default (klicka på nedåtpilen). Klicka på more... längst ned i den rullmeny som kommer upp.. Klicka på symbolen längst till höger i verktygslisten i det fönster som då öppnas. Klikcka på New Style from Selection. Ge rubriktypen ett namn och klicka på OK.

51 5.4. EGNA FORMATMALLAR 45 I rullgardinsmenyn för rubriktyper finns nu din nya rubriksort tillgänglig. Du kan också ändra en av de fördefinierade rubriktyperna, t ex Heading 4. För det gör du så här: Välj den rubriktyp du vill ändra och skriv in litet text som formatteras med den gamla rubriktypen. Ändra formatteringen av texten så att den blir som du vill att den nya definitionen skall motsvara. Välj More pss som ovan, och tryck på symbolen längst till höger. Välj Uppdate Style i den rullgardinsmeny som kommer upp. Om du vill ta bort dina ändringar i rubrikmeny trycker du bara på Clear Styles. Om man i ett dokument har underavsnitt till ett avsnitt bör man ha en annan rubriktyp för underavsnitten som är något mindre. Man kallar detta att man har olika rubriktyper för olika nivåer i dokumentet, eller helt enkelt att det finns olika nivåer av rubriker. Därför är det praktiskt att du kan spara mer än en rubriktyp som du har definierat, det kan vara bra att spara en för varje nivå som behövs. Som ett exempel kan vi titta på avsnittet Textbehandling i detta dokument som har flera underavsnitt Att markera text, Klippa ut, Kopiera och Klistra in text och så vidare. För rubriken Textbehandling användes typsnittet Arial, fet stil och storleken 16 punkter. För rubriken Att markera text användes typsnittet Arial, fet stil och storleken 12 punkter. Oftast är det snyggast att använda samma typsnitt för alla rubriker och bara variera storleken på texten. För att skriva detta dokument sparade jag därför två olika rubriktyper som jag definierade själv. 5.4 Egna formatmallar Egna definitioner av t ex rubriker sparas i något som kallas template i OpenOffice. Men eftersom datorerna i datorsalarna regelbundet städas så kommer words formatmallar med jämna mellanrum återställas till sina standardvärden. Dessutom är ju de mallar som lagras internt i OpenOffice bara åtkomliga just på den dator där de skapades. Men det går att spara och komma åt egendefinierade formatmallar: I menyn File väljer du Templates, i det fönster som då kommer upp väljer du save. Du får då möjlighet att spara den aktuella formatmallen till disk, för att du skall kunna nå mallen från vilken dator som helst skall du spara mallen på din AFS-disk. Du kan emellertid inte välja din AFS-disk i det fönster som öppnas när du trycker på save. OpenOffice har en speciell sökväg definierad för att avgöra var olika typer av inställningsfiler ligger, så även för template-filer. För att ändra den klickar du på Tools i verktygslisten och väljer options.... i menyn som kommer opp. Klicka på OpenOffice.org så att trädstrukturen öppnas, och välj Paths. Klicka på raden Templates så att den markeras och tryck på Edit. Nu har du (äntligen) möjlighet att lägga in din AFS-area i sökvägen. (Det här är dock en temporär åtgärd, när datorerna städas kommer denna information att försvinna). För att kunna använda mallen när du arbetar på en annan dator får du i OpenOffice öppna mallhanteraren och läsa in formatmallen från din AFS-disk. 5.5 Lägga till knappar till verktygsfältet I verktygsfältet har OpenOffice en mängd knappar, de flesta behöver man inte särskilt ofta och de viktigaste knapparna saknas! Lyckligtvis kan man själv lägga till de viktiga knapparna till de funktioner man använder ofta. När du skriver labrapporter kommer du speciellt att

52 46 KAPITEL 5. ORDBEHANDLING MED OPENOFFICE WRITER behöva knapparna för Formula, för Nedsänkt och Upphöjd text väldigt ofta. Formelverktyget Nedsänkt text Upphöjd text Om dessa inte redan finns i ditt verktygsfält ska du nu få lära dig hur du lägger dit dem. Klicka på menyn Tools. Välj Customize. Klicka på fliken Toolbars. Markera i den övre halvan av fönstret den kategori där kommandot du vill ha en knapp för finns. Knapparna för nedsänkt och upphöjd text hittar du under kategorin Formatting. I den undre halvan av fönstret scrollar du ned tills du hittar superscript och subscript. Se till att de är ikryssade och tryck på OK. Om du vill ta bort en knapp från verktygsfältet så behöver du bara klicka bort den i samma meny. Som du ser finns det många fler verktygsfält än vad som visas i fönstret. Vilka som syns kan du styra själv genom att gå in i menyn View, välja Toolbars och sedan välja om ett visst verktygsfält skall vara aktivt eller inte. Det kan bli ganska trångt i fönstret om man väljer för många aktiva verktygsfält. Därför kan man ibland vilja lägga till en verktygsknapp i ett fält som man visar, även om den egentligen hör hemma i ett annat verktygsfält, som t ex insert formula knappen i standard-verktygsfältet. För att göra det går du igen in i Tools - Customize och väljer Standard i det övre fältet. Klicka på add i den undre halvan. Du får då upp ytterligare ett fönster, där du kan leta upp det verktygsknapp du vill lägga till i standard. När du hittat den lägger du enklast till den genom att bara dra symbolen till verktygsfältet där du vill lägga till den. 5.6 Sidbrytning Ibland kan man vilja göra en framsida till det dokument man skriver, även om en framsida inte är nödvändig för kortare dokument som labrapporter. Om man vill tvinga OpenOffice att byta sida och lämna resten av sidan tom så är det bästa sättet att infoga en sidbrytning (istället för att bara trycka Enter en massa gånger). En sidbrytning hindrar texten att flyta ner under det ställe där du sätter din sidbrytning. Du inför en sidbrytning genom att först öppna menyn Insert och sedan välja alternativet Manual break. Du får då upp ett litet fönster där du kan markera vilken typ av textbrytning du vill införa, välj Page break och tryck på OK -knappen. 5.7 Sidnumrering Om du vill att OpenOffice ska numrera sidorna i dokumentet du skriver öppnar du menyn Insert och väljer alternativet Footer. Längst ned på varje sida får du då ett område som kallas footer och som kan formatteras av dig. Om du skriver in någon text där kommer den att upprepas på varje sida. Du kan också lägga till vad som kallas fält. Ett exempel på fält och som visar hur det fungerar är just sidnummer. Sätt pekaren i en sidofot och välj insert - field - Page number. I varje sidfot kommer nu det aktuella sidnummret att skrivas in på den position där du lagt in fältet. Du kan formattera sidnumret på vanligt sätt, välja typsnitt, storlek, färg, vänster- eller högerjustering mm mm.

53 5.8. FOTNOTER Fotnoter Om du vill införa en fotnot i din text gör du så här 1 : Ställ markören där du vill att den lilla siffran som visar att det finns en fotnot ska finnas (det vill säga den lilla ettan i meningen ovan). Öppna menyn Insert. Välj alternativet Footnotes OpenOffice kommer då att öppna ett litet fönster där du väljer att markera alternativen Footnote och Numbering automatic. Tryck på OK -knappen. Markören flyttas nu längst ner på sidan där du kan skriva in det du vill att fotnoten ska säga 2. För att komma tillbaka till texten där du införde din fotnot flyttar du pekaren tillbaks till texten och klickar. 5.9 Numrerade listor Om man vill göra en punktlista som ser ut så här: Första saken... Andra saken... eller en numrerad lista som ser ut så här: 1. Första saken Andra saken... så finns det två knappar i verktygsfältet som du kan använda, för att göra en punktlista och för att göra en numrerad lista. När du valt vilken typ av lista du vill göra är det bara att börja skriva in texten för första punkten. När du trycker på Enter så kommer du till nästa punkt i listan, så om en punkt består av en text med flera meningar ska du inte trycka Enter efter första meningen utan bara fortsätt att skriva. Listan avslutas om du trycker på Enter två gånger i följd (det vill säga du lämnar en punkt tom). Ibland Vill man kunna lägga in en radbrytning i en lista utan att skapa en ny punkt. Detta gör man genom att hålla ned skift-tangenten när man trycker på Enter Om du vill kunna välja mellan alla typer av listor som OpenOffice har att erbjuda öppnar du menyn Format och väljer alternativet bullets and nubmering. Här kan du välja mellan flera olika utseenden för din punktlista eller numrerade lista och du kan också välja att göra en lista med flera nivåer. För finliraren kan också nämnas att du själv kan byta ut de objekt som används punkter i punktlistan till nästan vilken bild som helst. 1 Det här är ett exempel på en fotnot 2 Det vill säga den här texten

54 48 KAPITEL 5. ORDBEHANDLING MED OPENOFFICE WRITER 5.10 Tabeller Att göra tabeller är en viktig del av att skriva en bra rapport. I OpenOffice kan man göra ganska snygga tabeller och det finns en hel del finlir man kan göra med tabeller som kan vara bra att kunna. När du gör en tabell är oftast den bästa taktiken först fylla i dina data i tabellen och sedan bekymra sig om tabellens utseende. För att skapa en tabell gör du så här: Först måste du tala om för OpenOffice att du vill göra en tabell. Det enklaste sättet om du bara vill göra en liten tabell är att klicka på tabellknappen och sedan dra med musen så att rätt antal rader och kolumner markeras. Det mer generella sättet att infoga en tabell är att öppna menyn Table och välja alternativet Infoga och sedan klicka på Table. Du får då upp ett nytt fönster där du kan fylla i hur många rader och kolumner du vill att din tabell ska ha. Ett tredje alternativ är att trycka ctrl-f12, där F12 är funktionstangenten längst upp på tangentbordet. Du får nu upp ett tomt rutnät där du kan börja fylla i dina uppgifter. Klicka med musen i den ruta du vill börja skriva in dina uppgifter och skriv in det som ska stå där. Du kan sedan flytta dig runt i tabellen genom att trycka på Tab -tangenten för att komma till nästa ruta i tabellen, alternativt kan du klicka med musen i den ruta du vill till. Om du klickar någonstans i en tabell så kan du i menyn Table välja Table properties. Där kan du under de olika flikarna välja bl a: Hur tabellen skall linjeras upp i dokumentet (centrerat, vänster mm) Hur texten skall flyta i tabellen, om man skall tillåta sidbrytning i tabellen eller inte, om tabellhuvudet skall upprepas på varje ny sida. Kollumnvidden kan justeras till en exakt bredd. Linjernas tjocklek och färg kan justeras, liksom cellernas bakgrundsfärg. Under menyn Table har du också möjlighet att lägga till eller ta bort nya rader eller kolumner. Du kan också lägga till en tabell inuti en cell för att få en mer komplicerad struktur på tabellen. Har du valt en cell i tabellen kan du i menyn Table välja att dela upp den i fler antingen rader eller kolumner. Väljer du två eller fler celler som är grannar kan du i Table välja merge för att slå ihop dem till en. När tabellen ser ut som du vill ha den och du har fyllt i allt du vill ska stå i tabellen går du till nästa punkt. När du skrivit in allt du vill ska stå i tabellen så sätter du pekaren någonstans i tabellen så att den är vald. Gå sedan till menyn Table och välj alternativet Auto format. Du får då upp ett nytt fönster där du kan välja mellan de olika stilar som finns för tabeller och väljer den som du vill ha och klickar på OK -knappen (tänk på att din tabell skall se bra ut också när den skrivs ut i svart-vitt). Slutligen skriver du en tabelltext och justerar tabellen (i meningen lägger den där du vill ha den på sidan). Oftast vill man ha centrerade tabeller. Det är i alla fall lättast att få tabelltexten under tabellen på ett snyggt sätt för centrerade tabeller. För att centrera en tabell markerar du hela tabellen och trycker på knappen för centrering. Precis som när du skriver vanlig text kan du bestämma hur texten i din tabell ska se ut, det vill säga vilket typsnitt, vilken storlek och så vidare.

55 5.11. FIGURER Tabelltext Alla tabeller ska ha en tabelltext där tabellen numreras och det står en kort beskrivning av vad tabellen innehåller. I stycket för Textbehandling fanns till exempel en tabell med följande tabelltext: Tabell 5.1: Kopiera, Klippa ut och Klistra in text. Tabelltexten skrivs med ett lite mindre typsnitt än den vanliga texten, vanligtvis två punkter mindre. Den inleds med tabellens namn, i det här fallet Tabell 4.1 som ska vara i fet stil. När du refererar till din tabell i texten sedan är det till det här namnet du refererar. Efter tabellnamnet kan du skriva in en kort beskrivning av vad tabellen innehåller. Det är klart snyggast om tabelltexten står centrerad under tabellen Figurer Det kommer ofta behov av att inkludera bilder i dina dokument, framför allt plottar du gjort i ComsolScript. Det bästa sättet är att i OpenOffice s grafikfönster spara bilden som en fil och inkluderar filen i OpenOffice. Om du har bilden sparad som en fil så öppnar du menyn Insert, väljer alternativet Picture och From file. Sedan får du leta reda på den bildfil du vill infoga på hårddisken, markera den och trycka på OK -knappen. När din bild väl är inne i OpenOffice kan du flytta runt den genom att klicka på bilden, hålla nere musknappen och flytta runt bilden med musen tills det att du släpper musknappen. Att få bilder att hamna på rätt plats kan ibland vara lite svårt Ankra bilder Om du skriver in text ovanför bilden kommer bilden att flyta med texten nedåt, och du kan inte skriva något på sidorna av bilden. Ofta vill man ha bilden kvar på det ställe du har bestämt och sedan vill man att texten ska flyta runt bilden (om bilden är liten, är bilden stor är det bättre att låta texten fortsätta under bilden). För att få bilden att ligga still och få möjligheten att låta texten flyta runt bilden så måste du ankra bilden. Det gör du så här: Markera bilden. Det gör du genom att klicka en gång på bilden. Öppna menyn Format och välj alternativet Anchor. Välj antingen page om du bara vill förvissa dig om att bilden ligger kvar på sidan, eller paragraph om du vill att den skall ligga kvar i det avsnitt där en är lagd. Klicka på knappen där det står Inställningar. Nu ligger bilden fast i dokumentet och du kan skriva din text hur du vill utan att bilden flyttar sig. Se mer i avsnitt för att se hur du skall styra hur texten flyter runt bilden Figurtext Precis som med tabeller ska varje figur ha en figurtext. En figurtext följer samma regler som en tabelltext förutom att namnet ska vara Figur 1 såklart. Figurer brukar ofta vara centrerade automatiskt så då ska figurtexten givetvis också vara centrerad.

56 50 KAPITEL 5. ORDBEHANDLING MED OPENOFFICE WRITER 5.12 Speciella symboler Om du vill skriva en grekisk bokstav, ett æ eller ç eller något annat tecken som inte finns på tangentbordet så kallas det att infoga en speciell symbol. För att göra detta kan du öppna menyn Insert och välja alternativet Special Character.Det här är något man gör så ofta att man vill ha en knapp i verktygsfältet för detta, och den ser ut så här. Om den lägga till den själv (se avsnittet om att Lägga till knappar till verktygsfältet ). När du trycker på knappen får du upp ett fönster med massor av symboler. Leta reda på den du är ute efter och markera den (tryck på den) och tryck sedan på knappen OK. Det finns ett flertal olika kombinationer av typsnitt och Subset, du får helt enkelt pröva dig fram, men en matnyttig kombination är Symbol och Basic greek där du kan hitta många av de vanligaste symbolerna och naturligtvis det grekiska alfabetet Ekvationer I OpenOffice kan man skriva även ganska avancerade formler på ett hyggligt snyggt sätt. Det är inte helt okomplicerat och eftersom man behöver göra det väldigt ofta är det bra att träna en del på det. Vi kommer att behöva verktyget Formula Editor ofta så det kan vara bra att ha det verktyget till hands i verktygslisten. Man kan säga att det finns tre sätt att skriva formler i OpenOffice, vi skall exemplifiera dem genom att i vårt dokument sätta in uttrycket för Pythagaros sats: a 2 + b 2 = c 2 : Börja med att placera pekaren där du vill ha formeln, tryck sedan på symbolen för Formula Editor. Då händer ett antal saker i ditt OpenOffice fönster: a Huvudfönstret delas i två delar, den övre delen visar ditt dokumet, den undre öppnar en tom area där den formel du vill skapa långsamt kommer att växa fram i en symbolisk form som OpenOffice använder för att visa matematiska formler. b Ett litet friflytande fönster märkt Selection öppnas. c Verktygslisten för huvudfönstret ändras och du har nu verktygsknappar som används när vi skapar formler aktiva. Det här är dina verktyg för att skapa formler låt oss nu skriva in Pythagaros sats på de tre olika metoderna. 1. Använd Selection panelen. Den är indelad i två halvor, genom att klicka på knappar i den övre halvan väljer du vilka grupper av verktyg som skall visas i den nedre. Om du låter pekaren sväva litet över knapparna så visas en hjälptext. Klicka på knappen längst till höger i den undre av de två raderna - Formats. Du får då upp ett antal knappar i undre halvan som visar olika formatteringar. Vi vill ha Superscript Right, tredje från vänster i översta raden i den undre panelen. Klicka på den. Då dyker <? > ˆ{<? >} upp i den undre halvan av huvudfönstret. <? > är en platshållare som skall ersättas av den text vi vill ha i just det här fallet. Gå in i det nedre fönstret och ersätt den första <? > med a och den andra med 2. Du kan då se att i den övre halvan av dokumentfönstret så visas hur formeln växer fram. Vi fortsätter och klickar i Selection fönstret på den övre vänstra knappen - Unary operators. I den undre halvan klickar vi då på + a. När vi gör det kommer <? > redan att vara markerat, så vi fortsätter och klickar en gång till på superscript right och skriver in b och 2. Vi fortsätter sedan genom att klicka på andra knappen från vänster i Selection s övre rad - relations - och sedan a = b. Vi får sedan ta bort det första <? > och ersätta det andra <? > med c 2 på samma sätt som ovan. När du är klar är det bara att klicka någonstans i övre halvan av huvudfönstret så är du tillbaks i redigeringsläget.

57 5.13. EKVATIONER Använd Selection panelen och skriv i formelfönstret. Text som vi skriver i den undre panelen i huvudfönstret kommer att bli en del av formeln. Ett litet enklare sätt att göra formler är därför att ta hjälp av knapparna i selection panelen för att hitta formen för ett uttryck, men sedan skriva in så mycket som möjligt för hand i det undre fönstret. Pythagaros sats på det här sättet får vi in genom att efter att ha klickat på Formula Editor knappen gå in i Selection panelen, trycka på Formats och sedan Superscript right. Vi får då precis som i exemplet ovan <? > ˆ{<? > } i den undre halvan av dokumentfönstret. Precis som ovan går vi in och ersätter den första <? > med a och den andra med 2. Men nu ser vi hur superskript kodas, så nu fortsätter vi för hand i det nedre fönstret i dokumentfönstret och skriver aˆ{2} + bˆ{2} = cˆ{2}. 3. Skriv formeln direkt i texten. OpenOffice är tvåspråkig (minst) när det gäller att koda för formler. Utöver den uppsättning kommandon som du kan se i formelfönstret när du använder Selection editorn finns det ett annat språk att koda formler, ett språk som ansluter ganska väl till LaTeX ett formatteringsspråk som är ganska vanligt som ett alternativ till Open Office och MS Word. För att få in Pythagaros sats med den här metoden sätter vi pekaren på den plats i dokumentet där vi vill ha formeln och skriver: a sup 2 + b sup 2 = c sup 2. Markera sedan texten och tryck på Forumla Editor verktyget. Open office formatterar då omedelbart om texten till en formel. Det kan naturligtvis verka besvärligt att det finns två språk för att skriva in formler, men du kommer snart att märka att det går bra att blanda de bägge syntaxerna, till och med i samma formel. Efter ett tag kommer du säkert att använda metod 3 så länge du kommer ihåg syntaxen för den formel du vill skriva, sedan fyller du i med metod 2. När du avslutar Formula Editor genom att klicka i dokumentet utanför ekvationsrutan så behandlas den färdiga ekvationen som en bild, du kan flytta runt den med musen och placera den där du vill ha den. Om du vill redigera en formel i efterhand kan du dubbelklicka på formeln så kommer du tillbaka till Formula Editor och kan göra de ändringar du vill. Du ser att i den nedre delen av dokumentfönstret så skrivs formeln ut i den syntax du ursprungligen skrev den i t.ex. aˆ{2} + bˆ{2} = c{2} men det går alldeles utmärkt att utvidga den genom att använda den andra syntaxen, t ex genom att i den undre rutan lägga till + d sup 2 för att få a 2 + b 2 = c 2 + d 2. Syntaxen för alla möjliga element i formler finns listade, för de bägge språken, i appendix i detta häfte. Du kan också hitta den i hjälpfönstret för OpenOffice. Välj hjälp, i det fönster som då öppnas måste du välja OpenOffice.org Math i rullgardinsmeny längst upp till vänster. Välj sedan Formula Reference Tables i det högra fönstret för att få tillgång till alla tabeller med syntax. I fortsättningen kommer vi att kalla den syntax som används i Selection editorn för Metod 1, den som används när man skriver in formler direkt för Metod 2. När man arbetar med formler så finns det några saker som inte är så uppenbara innan man stött på dem första gången, så låt oss titta på några små exempel. Men sedan är det bästa sättet att lära sig att pröva på för att skapa de formler man vill ha. Normalt så finns inga extra mellanslag mellan komponenterna i en formel. Vill man av någon anledning ha extra mellanslag så måste man lägga in dem som ett element i formeln. I Metod 1 väljer vi Format knappen. I den pannå som då kommer upp finns två elment, small gap och wide gap, trycker vi på någon av de knapparna så läggs ett mellanrum in i formeln. I Metod 2 skriver vi in motsvarande syntax element, för litet mellanrum och för stort mellanrum.

58 52 KAPITEL 5. ORDBEHANDLING MED OPENOFFICE WRITER Grekiska bokstäver kan man infoga på två sätt. Antingen kan klicka på Formula Editor knappen. När alla fönster är öppna har du tillgång till verktygsknappen Catalog i verktygslisten (det är den som ser ut som Σ ). Trycker du på den så öppnas ett fönster där du kan välja en grekisk bokstav och infoga den på plats. Alternativt kan du utnyttja att det i både Metod 1 och Metod 2 går att skriva in bokstaven direkt. Syntaxen är ett procent-tecken följt av det engelska namnet på den grekiska bokstaven, t.ex. %Pi %rho som ger Π rho. De vanliga paranteserna ( ) sträcker sig inte över mer än en rad. Vill man ha en formel som ser ut som 1π, och inte ( 1 π ) måste vi använda skalbara (scalable) parentestecken. 4 4 Använder du Metod 1 så får du dem genom att välja en verktygsknapp (under Format ) där det står två bokstäver ovanför varandra mellan parenteserna, använder du Metod 2 så är symbolerna de samma som för vanliga parantestecken, men föregånget av \lef t, eller \right som t ex \right (, för en skalbar vänsterparantes. Ekvationer kan antingen stå på en egen rad 3(2x+5) - 5(2x-3) = -4x eller vara en del av texten ( A)da = A dl som här. Man bör endast låta korta ekvationer vara en del av texten. Om du vill ha formeln centrerat på en egen rad så ser du till att den står på en egen rad, sedan ser du bara till att raden är mitt-justerad Spara dokument När du vill spara något du skrivit i OpenOffice så går det till på samma sätt som i de flesta andra Windows-program. Du kan antingen klicka på eller öppna menyn File och välja något av alternativen Save eller Save as. Ett snabbalternativ till Spara är att trycka på Ctrl-s på tangentbordet. Om du inte har sparat ditt dokument förut, eller om du väljer alternativet Spara som, kommer det upp ett nytt fönster där du kan välja vilket namn du vill att filen ska ha och var på hårddisken du vill spara filen (kom ihåg att välja din hemkatalog om du vill hitta filen igen!). När man sitter och skriver länge på en lång labrapport är det en bra vana att trycka på Ctrl-s lite då och då! Om du har öppnat OpenOffice och vill fortsätta skriva på ett dokument som du har skrivit tidigare och sedan sparat, så måste du öppna dokumentet först. Det gör du genom att antingen klicka på eller genom att öppna menyn File och välja alternativet Open (snabbalternativ Ctrl-o ). Du får då upp ett nytt fönster där du kan leta reda på ditt dokument på hårddisken. OpenOffice sparar också automatiskt med jämna mellanrum en kopia av vad du har ändrat sedan filen sist sparades på disk. Kontrollera att detta är påslaget genom att gå in i Toolmenyn, välj Options och klicka på Load and Save och sedan General. Se till att rutan vid Spara information för återskapning var 10 min är fylld, och att det är 10 (eller någon annan lämplig tidsrymd som är ifylld). Med detta läge aktivt kommer OpenOffice att spara ned dina ändringar var tionde minut, skulle programmet krascha går det - oftast - att återskapa ändringarna fram till den tidpunkt du word senast gjorde detta. Säkrast är dock att ta för vana att trycka på Spara med jämna mellanrum Spara i pdf-format När du vill vara säker på att andra människor kan läsa det du skriver. bör du skicka filen i pdf-format. Det gör du enklast genom att klicka på verktygsknappen Export Directly As PDF. Du kan också gå in i menyn File, och välja Export as PDF... PDF-formatet är det du normalt använder för att lämna in labrapporter.

59 5.16. ÖVNINGSUPPGIFTER Övningsuppgifter 1. Försök att göra följande tabell (inklusive tabelltext): Tabell 1. Det här är den första testtabellen. (den här tabellen är gjord med 5 kolumner och fem rader, centrerad text, fet text i första kolumnen och Tabellformatet Rutnät 8. För att flytta tabellen till mitten av sidan kan du flytta vänstermarginalen (det som ser ut som ett timglas på linjalen under Verktygsfältet) tills den hamnar ungefär under knappen för Fet text.) 2. Försök att göra följande tabell (inklusive tabelltext): Tabell 2. Det här är den andra testtabellen. (i den här tabellen har jag använt Lista 3 och sedan fyllt i de flesta linjerna för hand med verktygen från fönstret Rita tabeller. Jag använde 1,5 punkters bred linje för de tjocka strecken och 1 punkt bred linje för de smala strecken.) 3. Försök att göra följande tabell (inklusive tabelltext): Tabell 3. Det här är den tredje testtabellen. 4. Här kommer lite fler ekvationer att träna på: R ab R g ab = 8π T ab

60 54 KAPITEL 5. ORDBEHANDLING MED OPENOFFICE WRITER n + j + m, n j m x K 0 2 = xt t J t 2 dt ( ) ( ) ( 2 1 x 15.1 = 4 6 y x 5y z = 7 x + 7y + 4z = 1 2x 6y z = 6 ) (σ kx σ k x + σ ky σ k y ) = S 2 Sz 2 k,k dp dz = c 2 ( ) ω 2 32π 2 σ δ ω λ C c 2 Ψ µω λ n 2 c 2 ( ) µωλɛ 2 1 ω2 λ ω 2 n t Ψ 2 + ω ω Ψ 2 λ dl f(x) = { 3x for x 0 3 x for x > 0 n=1 G rn = (, ) x E, l, m = il 2mk h π jl (kr)ym l (r)

61 Kapitel 6 Felsökning - Debuggning. Nästan inga program blir helt rätt från början. När det uppstår fel i enklare program kan man ofta hitta orsaken bara genom att gå igenom programmet en gång till med vetskap om vad som gick fel. Men i takt med att programmen blir större och mer komplicerade blir denna procedur mer och mer besvärlig och tidskrävande. Ett fel i ett datorprogram kallas på engelska bug. Detta uttryck sägs härstamma från datorernas barndom. Vid ett tillfälle hade ett team som jobbade med en av de första stora beräkningsmaskinerna (rörbestyckad) länge försökt att ta reda på vad som gick fel i ett program. Till slut upptäckte man att orsaken inte låg i programmet utan att en död insekt inuti maskinen hade orsakat en kortslutning. Denna historia må vara sann eller inte, men ett fel i ett datorprogram heter på engelska bug, och processen att hitta och korrigera fel heter de-bugging. På svenska säger man oftast bugg och debugga, men ibland kan man möta termen avlusa. För att underlätta denna process finns i de flesta datormiljöer verktyg som på olika sätt underlättar felsökningen i program. Vi skall i det här kapitlet illustrera hur man kan arbeta dem genom att korrigera ett felaktigt program för att beräkna primtalsfaktorer. AntalFaktorer=0; i=2; while (i < x) kvot = x/i; rest = i*floor(kvot) - x; % om rest är noll går divisionen jämnt ut if(rest==0) AntalFaktorer = AntalFaktorer +1; Faktor(AntalFaktorer) = i; end if(i==2) i=i+1; else i=i+2; end end AntalFaktorer Faktor Lägg märke till att det inte räcker att gå upp till i < sqrt(x), om talet har primfaktorer så måste minst en av dem vara lägre än roten ur talet, men andra faktorer kan vara större. Det räcker alltså att loopa upp till roten ur x om vi bara vill veta om x är ett primtal eller inte, men om vi vill hitta alla primfaktorer så måste vi gå hela vägen. 55

62 56 KAPITEL 6. FELSÖKNING - DEBUGGNING. 6.1 Debuggning med breakpoints Låt oss illustrera processen med hjälp av programmet på föregående sida för att beräkna primtalsfaktorer. Skriv in koden i en m-fil och spara den med namnet prim1.m i den aktuella katalogen. Om vi nu i kommandofönstret skriver x=9 för att ladda ned det värdet i workspace och sedan kör programmet, enklast genom att sriva prim1 så ser vi att programmet uppenbarligen inte fungerar som det var tänkt, AntalFaktorer är lika med ett och inte två. För att undersöka vad som händer sätter vi en så kallad break-point i programmet. Detta gör vi genom att skriva dbstop prim1. När vi nu exekverar prim1.m genom att skriva prim1 så går ComsolScript in i Debug-mod, vilket visas genom att prompten C byts ut mot D. I debug-mod stannar program-exekveringen där man satt sin break-point, i det här fallet i början av programmet prim1 (man kan genom att ge kommandot dbstop prim1 # där # är en siffra instruera ComsolScript att sätta en break-point vid rad # i en given rutin). När programmet stannar så skrivs först radnummret och sedan kommandot som ges på den raden ut. Genom kommandot dbstep kan vi stega igenom filen steg för steg. Vi kan vid varje rad kontrollera värdet på variabler i programmet genom att bara skriva namnet på variabeln, jfr exemplet: C clear all C x=9 x = 9 C dbstop prim1 C prim1 prim1 1 AntalFaktorer=0; D dbstep prim1 2 i=2; D dbstep prim1 3 while (i x) D dbstep prim1 4 kvot = x/i; D x x = 9 D i i = 2 D kvot Error: Unknown function kvot. prim1 4 kvot = x/i; D dbstep prim1 5 rest = i*floor(kvot) - x; D kvot kvot = Det här visar något som är viktig att komma ihåg: när vi stannar vid en punkt i programmet och ComsolScript skriver ut kommandot i kommandofönstret så har kommandot ännu inte utförts. Så när vi stannar vid rad 4 så är kvot ännu inte definierad eftersom divisionen inte utförts. Det kan bli ganska omständigt att stega igenom varje kommando i ett program, ofta vill man istället t ex stanna till en gång i varje loop. Det kan vi göra genom att utnyttja möjliheten att stätta en break-point på godtyckligt ställe i en fil. Vi går ur debug-mode genom att ge

63 6.1. DEBUGGNING MED BREAKPOINTS 57 dbquit, tar bort vår gamla break-point med dbclear och sätter en vid början av whileloopen med dbstop prim1 4. När vi sedan kör prim1 stannar ComsolScript i debug-mod vid rad 4, dvs första gången vi är inuti while-loopen. Vi kan nu undersöka värdet på våra variabler genom att t.ex. skriva x eller i i kommandofönstret. Gör vi det ser vi att allt verkar normalt, x är 9 och i är 2, precis som förväntat. Vi fortsätter nu genom att ge kommandot dbcont. Det kommandot innebär att exekveringen av programmet fortsätter tills man kommer fram till nästa break-point (det går bra att sätta mer än en break-point i ett program). Vi ger dbcont en gång till för att se vad som händer nästa varv i loopen. Vi ser att i stegas upp till 3, x är fortfarande 9, vi tar ett varv till och finner x = 9, i = 5 och AntalFaktorer = 1. Här har vi felet! Programmet har visserligen sett att 3 är en faktor i nio, men vi testar inte om faktorn finns mer än en gång: variabeln stegas upp till 5 utan att testa om 3 förekommer som faktor mer än en gång. Vi måste alltså låta bli att stega upp i när divisionen går jämnt upp för att testa om samma faktor finns mer än en gång. Vi ändrar i vår kod, från: if(rest==0) AntalFaktorer = AntalFaktorer +1; Faktor(AntalFaktorer) = i; end if(i==2) i=i+1 else i=i+2 end till if(rest==0) AntalFaktorer = AntalFaktorer +1; Faktor(AntalFaktorer) = i; else if(i==2) i=i+1 else i=i+2 end end så att inte i stegas upp om den är en faktor i x. Vi korrigerar detta och verifierar att programmet ger rätt resultat. För att slippa stega oss fram tar vi då bort vår tidigare breakpoint, enklast genom att skriva dbclear, clear all följt av x = 9 och kör sedan genom att ge prim1: När vi gör det inträffar något som händer litet då och då: när vi trycker på return försvinner prompten och ingenting händer, ingen output, och ingenting händer om vi försöker skriva in kommandon. Oftast är det här beteendet förorsakat av att programmet har hamnat i en oändlig loop där villkoret för att loopen skall avbrytas aldrig blir sant. För att kunna åtgärda felet måste vi först och främst få ComsolScript att sluta med loopandet, det åstadkommer vi genom att klicka i kommandofönstret och trycka ctrl-c, dvs vi trycker samtidigt in control-tangenten och c. Som svar på ctrl-c avbryter ComsolScript utförandet av det program som kör och lämnar tillbaka kontrollen till kommandofönstret. Vi gör clear all för att bli av med eventuellt skräp och sätter x=9. Vi kan undersöka var felet ligger med hjälp av en annan av metoderna i debuggern. Sätt tillbaks en break-point på samma ställe och skriver prim1 stannar vi vid vår break-point igen. Vi kan nu fortsätta härifrån en rad i taget genom skriva dbstep. När vi gör det flyttas vi stegvis genom programmet. Det här illustrerar ett annat sätt att utnyttja debuggern, vi kan se exakt i vilken ordning raderna i programmet utförs och på så sätt se exakt hur vi rör oss

64 58 KAPITEL 6. FELSÖKNING - DEBUGGNING. genom komplicerade if-strukturer. Vid varje punkt kan i programmet kan vi dessutom som vanligt undersöka/sätta värdet på variabler i programmet. Genom att stega oss fram från vår break-point kan vi se hur programmet korrekt detekterar att 2 inte är en faktor i 9, hur i stegas upp från 2 till 3 och hur vi sedan testar om 3 är en faktor i 9. Efter att ha sett att så är fallet, och korrekt stegat upp AntalFaktorer fortsätter programmet, och eftersom tre var en faktor stegas i inte upp. Du skall nu med hjälp av debuggern ge dig i kast med övningsuppgift 1 där uppgiften är att genom att fortsätta att stega dig framåt dels finna orsaken till den oändliga loopen, dels försöka korrigera ytterligare ett återstående fel i programmet som gör att även när du kurerat den oändliga loopen så får vi fortfarande inte rätt svar för antalet faktorer. Mer hjälp om debuggern kan du få i on-line hjälpen via?/comsolscript/the Programming Language/Debugging/Debug Commands

65 6.2. ÖVNINGSUPPGIFTER Övningsuppgifter 1. Använd ComsolScripts debugger för att förstå hur den oändliga loopen uppstår och korrigera programmet så att det på ett korrekt sätt beräknar primtalsfaktorerna i godtyckliga tal.

66 60 KAPITEL 6. FELSÖKNING - DEBUGGNING.

67 Kapitel 7 2D-Grafik I det här passet kommer vi att koncentrera oss på att skapa grafik: histogram, plottar och annat som kan användas för att åskådliggöra experimentella resultat. Vi skall försöka avstå från frestelsen att komma med pekpinnar om hur grafik skall utformas för att vara bra, utan i stället koncentrera oss på att gå igenom tekniken, så att vi kan åstadkomma grafik som ser ut som vi vill. Efter att ha gått igenom det här passet skall du själv kunna producera en plot som den ovan och också kunna både skriva ut den och kopiera in den i ett dokument för att bifogas i en lab-rapport. 61

68 62 KAPITEL 7. 2D-GRAFIK 7.1 Kurvor i två dimensioner Att skapa enklare två-dimensionella plottar i ComsolScript är relativt enkelt. En skillnad mellan ComsolScript och en del andra grafikprogram är att vi inte kan instruera ComsolScript att till exempel rita kurvan y=sin(x). Istället måste vi ge ComsolScript en uppsättning punkter med en x-koordinat och en y-koordinat. ComsolScript ritar sedan upp en mjuk kurva som förbinder punkterna. Vill vi rita upp y = sin(x) måste vi därför först själva skapa en x-vektor och sen en y-vektor 1 där y=sin(x) och instruera ComsolScript att rita en kurva mellan de punkter som beskrivs av dessa vektorerna. Låt oss börja med något enkelt som att rita grafen för y = 2x + 3. x = [1 8]; y = 2*x + 3; plot (x,y) Att växla mellan fönster, och städa i fönster. När vi trycker på return efter att ha givit plot kommandot öppnas ett nytt fönster, ComsolScripts grafikfönster där plotten visas. När vi jobbar med grafik kommer vi att vilja pendla mellan många fönster. Ofta kommer vi att utföra samma lunk mellan editorns fönster där vi just ändrat någon detalj i en m-fil till kommandofönstret för att köra filen till grafikfönstret för att se hur det blev. Det finns flera metoder för att snabbt växla mellan fönster, vilken som passar bäst just för stunden beror litet på exakt vad man håller på med och hur man föredrar att jobba. Det kanske enklaste sättet är att helt enkelt lägga fönstren bredvid varandra, eller i alla fall se till inget fönster ligger helt bakom de andra. Genom att klicka och dra på kanten av ett fönster kan du flytta det vart du vill på datorns skrivbord, och genom att klicka och dra i ett aktivt fönsters nedre högra hörn kan du ändra dess storlek. Om du lägger upp de fönster du jobbar i så att det alltid sticker fram någon bit av fönstret även när det är de andra fönstren som är aktiva så kan du enkelt byta fönster bara genom att klicka med musen i det fönster du vill skall bli det aktiva. I windows finns det en funktion för att bläddra mellan alla fönster som är öppna på datorns skrivbord. Håll alt -tangenten nedtryckt och tryck på TAB tangenten. Varje gång du trycker ned TAB bläddras ett nytt fönster fram som aktivt, vilket fönster som görs aktivt visas i en liten ruta. Befinner du dig i ComsolScripts kommandofönster och vill till grafikfönstret kan du skriva figure(1) i kommandofönstret, då blir fönstret med det namnet aktivt. Vill du tillbaks från grafikfönstret till kommandofönstret trycker du bara på return. Vill du städa upp i grafikfönstret skriver du (i kommandofönstret) clf (CLear Figure window), vill du städa upp i kommandofönstret ger du kommandot clc (CLear Command window). Du kan stänga grafikfönstret genom att ge kommandot close. 1 Eftersom det ComsolScript använder i plottandet är punkter, vars x- och y-koordinater kommer från vektorerna x och y så måste vektorerna ha samma antal element.

69 7.1. KURVOR I TVÅ DIMENSIONER plot-kommandot Låt oss prova att plotta en litet mer komplicerad kurva, y = x 2. Pröva clear all; x = [1 4]; y = x. 2; plot(x,y) Resultatet blir inte direkt vad vi väntat oss, men egentligen är det inte så märkligt: plot kommandot ser ju bara de punkter vi vill rita en graf mellan och har ingen aning om huruvida de två punkterna (1,1) och (4,16) är två punkter på kurvan y=x 2, eller om de ligger på kurvan y = 5x-4. Mer information måste alltså till, pröva att lägga till punkten ( x,y) = (2,4). Inte heller särskilt imponerande. För att kurvan skall bli jämn och fin och följa det funktionssamband vi önskar måste vi ge ComsolScripts plot-kommando vektorer där punkterna ligger ganska tätt. Det görs enklast om vi använder oss av ComsolScripts vektorfunktioner. Antag till exempel att vi vill plotta y=x 2 mellan 0 och 4.5. Vi kan då antingen använda kolonoperatorn för att skaffa oss en x-vektor där elementen har värden från 0 till 4.5 med vilket avstånd vi vill, till exempel 0.1: x = (0:0.1:4.5); (när vektorerna får så här många element vill man gärna stänga av ekot genom att ge semikolon efter kommandot). Alternativt kan vi använda linspace för att skapa 50 punkter mellan 0 och 4.5: x = linspace(0,4.5,50); ger oss också en användbar x-vektor. När x-vektorn är klar skapar vi en y-vektor med y = x. 2 och plottar resultatet. Prova nu att plotta några andra funktioner som polynom och sin(x) för att se att resultatet blir som du förväntar dig Styra utseendet på grafiken Det mesta av den tid man spenderar på att göra grafer tenderar att läggas på att få lay-outen att bli vad man har tänkt sig. Eftersom korrekt och tydlig lay-out är ett viktigt verktyg för att åstadkomma grafik av hög kvalitet kan det vara värt besväret att redan från början försöka lära sig de kommandon som krävs för att man skall kunna styra programmet dit man vill. Linjefärg, linjetyp och markörer Kommandot plot kan ges med tre argument: plot(x,y,s). Argumentet S är en textsträng som anger hur linjen som ritas skall formateras. Det finns tre typer av information att styra, färgen på linjen, hur linjen dras (heldragen, prickad mm), och slutligen markör, eller vilken symbol som skall ritas ut i de punkter som anges av vektorerna. Skriver du help plot kan du bland annat hitta följande lista på vilka möjligheterna är: Linjefärg Markör Linjetyp y yellow. dot - solid m magenta o circle : dotted c cyan + plus -. dashdot r red * star - - dashed g green s square (none) ingen linje b blue v triangle k black p pentagram Man kan i plot kommandot använda en godtycklig kombination av dessa (men bara ett val för varje kategori!). Prova med litet olika kombinationer för att se hur det fungerar, en gul

70 64 KAPITEL 7. 2D-GRAFIK kurva med heldragen linje mellan små cirklar ges t.ex av plot(x,y, yo- ). Märk att om man ger formatkommandot för linjefärg och markör men inte någon kod för linjetyp som t.ex. plot(x,y, bo ) så ritas endast punkterna ut utan någon sammanbindande linje. Rutnät Ibland vill man lägga in ett rutnät över grafen för att underlätta avläsningen av koordinater. Detta görs med kommandot grid on. För att slå av ett rutnät använder du grid off. Ger man bara kommandot grid så växlar man mellan dessa tillstånd (engelskans toggle) Koordinataxlar Om vi inte ger något kommando för att speciellt formatera koordinataxlarna väljer ComsolScript axlar så att hela grafen lagom ryms i grafikfönstret. Många gånger vill man själv bestämma hur koordinataxlarna läggs ut, antingen för att man vill zooma in ett intressant område, eller för att man vill lägga in litet luft, plotta till exempel y=x 2 mellan -2 och 3, det ser inte snyggt ut just kring origo. För att styra detta ger vi kommandot axis([xmin xmax ymin ymax]) där xmin är minimivärdet på x-axeln och så vidare. Kommandot axis skall ges efter plot-kommandot, testa med axis ( [ ] ) på vår andragradskurva! Det kan verka en smula omständigt att axis kommandot tar sitt argument i formen av en vektor, vilket gör att vi måste skriva in två omgångar parantestecken när vi skriver in kommandot. Rätt använt kan dock just detta faktum spara mycket arbete särskilt när vi skriver m-filer som skall producera grafik. Den enklaste varianten är att vi istället för att ange siffervärden lagrar siffrorna i en vektor och ger den som argument till axis kommandot. Prova till exempel stor = [ ]; axis(stor); figure(1) liten = [ ]; axis(liten); figure(1) Tappar vi tråden kan vi se vilken inställning som för ögonblicket gäller genom att ge kommandot axis utan argument. ComsolScript skriver då ut den aktuella vektorn. Vi kan även spara en inställning genom att ge kommandot vektor = axis, där vektor är ett godtyckligt namn på en vektor i vilken de aktuella värdena sparas. Ett användningsområde för detta trick är om vi skriver en allmän m-fil för att plotta data och alltså inte i förväg vet vilka x- och y-värden som blir aktuella. Om vi ändå vill plotta kurvan med litet luft ikring kan vi använda en variant av följande sekvens: x = -1.5:.05 : 1.5; y = sin(x); plot(x,y) current=axis; mellanrum=0.3 ny(1) = current(1) - mellanrum; ny(2) = current(2) + mellanrum; ny(3) = current(3) - mellanrum; ny(4) = current(4) + mellanrum; axis(ny); figure(1) Axis har en hel del special-argument, för en fullständig lista skriv mer användbara är: help axis, några av de

71 7.1. KURVOR I TVÅ DIMENSIONER 65 AXIS( auto ) gör att axlarnas gränser sätts räknas om när nya kurvor läggs till i samma graf. AXIS( manual ) sätter axelgränserna i manuellt läge, så att gränserna inte ändras när nya kurvor läggs till i samma graf. AXIS( equal ) sätter axlarnas gränser så att skalindelningen blir lika i x- och y-led. AXIS( normal ) motsatsen till AXIS( equal ). Här kan x- och y-axeln ha olika skalor. AXIS( tight ) krymper gränserna på axlarna så att plotten precis ryms i grafen. Dessutom finns två argument som bara används för tredimensionella grafer: AXIS( on ) visar axlar, axelmarkeringar och axel-etiketter. AXIS( off ) slår av visning av axlar, markeringar och etiketter. För att skriva ut beteckningar på x- och y-axeln använder vi kommandona xlabel( text ) respective ylabel( text ), där text är den sträng vi vill skriva ut som beteckning på axeln. Prova att skriva in beteckingar på bägge axlarna! Man kan påverka utformningen av etiketterna på många vis genom att i grafikfönstret klicka på den lilla palettsymbolen. I det fönster som kommer upp kan man välja en mängd egenskaper hos axlarna, som tex färg, typsnitt och storlek. Du kan läsa mer om detta i hjälp-avsnittet?/plotting and Visualizing Data/Graphics/ Axes Text Titel-text Ofta kommer vi att vilja lägga till text i graferna för att till exempel visa vilka parametervärden som använts. Det första vi gör är att lägga till en titel högst upp i bildytan, med kommandot title( text ), prova med title( Sinuskurvan )! Även titeltexten går att formattera genom att öppna graf-editorn från grafikfönstret. Fri text Vi kan ocskå lägga till text på godtyckligt ställe i grafen genom att använda kommandot text(x,y, sträng ) som skriver in texten sträng vid punkten (x,y). Prova att placera in en textsträng på rätt ställe i grafen, det kan ta ett tag innan man får koordinaterna rätt. Du ser att textsträngens nedre vänstra hörn placeras vid den koordinat som anges. Om man ger fler textkommandon i följd så försvinner inte de gamla textsträngarna. Även för fri text kan man ändra egenskapern genom att öppna graf-editorn i grafikfönstret. För att kunna arbeta med texten måste du först klicka på text i vänsterspalten i fönstret som öppnas. Kurvbeskrivningar Vi kommer snart att börja plotta mer än en kurva i varje graf. Det kan då vara bra att ha en beskrivning över vilken kurva som visar vilken storhet. En sådan läggs in med kommandot legend( beskrivning 1, beskrivning 2,...) där beskrivning 1 är den textsträng som beskriver den kurva som ritades med det första plot kommandot, beskrivning 2 den som ritades med det andra plot kommandot osv. Genom att ge kommandot legend( show ) och legend( hide ) kan du välja om kurvbeskrivningen skall visas eller inte.

72 66 KAPITEL 7. 2D-GRAFIK 7.2 Plotta punkter med fel Om du gjort en serie mätningar av en variabel y som funktion av x, och y-värdena har ett fel dy så vill man ofta visa mätserien i en plot med felstaplar angivna. För detta kan vi använda kommandot errobar(x,y,dy). Prova till exempel: x =[ ]; y =[ ]; dy = [ ]; plot(x,y) errorbar(x,y,dy) Ofta vill vi inte ha någon linje som förbinder punkterna, det blir tydligare att bara plotta punkterna med till exempel en ring. Prova t.ex. errorbar(x,y,dy, o ), kommandot errorbar accepterar samma parametrar för att styra linjefärg mm som plot gör. Man kan också plotta asymmetriska fel genom att ge två vektorer med fel, den första ger då felet i positiv riktning, den andra felet i negativ riktning, ett fullständigt kommando blir i det fallet errobar(x,y,dyminus,dyplus, sträng ). Vill vi rita felstaplar i både x- och y- riktning kan vi inte använda inbyggda funktioner. Vi får istället själva först beräkna x- och y-koordinater för felstaplarna och använda kommandot line för att rita linjer i grafen. Detta är inte så svårt, vi kommer senare att titta på det som en övning i att programmera. 7.3 Histogram Förutom kurvor och punkter med felstaplar kommer vi ofta vilja producera stapelhistogram. Det finns flera varianter att välja på som producerar litet olika typer av grafer. För att kunna pröva oss fram skapar vi först en vektor med data som vi vill stoppa in i histogrammet: x = rand(1,20); ger oss en vektor med 20 tal, vart och ett slumpvis draget mellan 0 och Kommandot bar - stapeldiagram Kommandot bar(x) ger oss ett stapeldiagram med de 20 talen. Vi kan Vi kan också lägga till en textsträng som anger vilken färg staplarna skall ha, här använder vi samma kod som för plot-kommandot som t ex bar(x, r ) Kommandot hist - histogram Oftast vill vi nog inte bara plotta värdet för våra 20 tal. Vanligare är att vi vill visa ett histogram som visar till exempel hur många av talen som ligger mellan 0.0 och 0.2 och så vidare. För att göra detta ger vi kommandot hist(x). Om vi inte anger annat delas data upp i 10 binnar, men vi kan ange hur många binnar vi vill visa i ett andra argument till exempel hist(x,5). Tänker vi efter litet inser vi att kommandot hist egentligen utför två ganska olika uppgifter: I det första steget delas data in i binnar (10 binnar eller det antal som vi anger) som sträcker sig mellan det minsta och högsta värdet. I det andra steget plottas sedan stapeldiagrammet i grafen. Ibland kommer vi att vilja använda bara det första steget för att sedan själva plotta data - eller använda dem i beräkningar. Det går om vi ger kommandot som antal = hist(x,8) så skapas vektorn antal vars element anger hur många av elementen i x som faller inom vart och ett av 8 intervall mellan det lägsta och högsta värdet som förekommer i x. Vi kan även skapa en vektor med mittpunkterna i varje interval genom kommandot [antal mitt] = hist(x,8). Vektorn antal innehåller då frekvensen och vektorn mitt

73 7.4. UTSKRIFTER AV GRAFIK 67 interval-mitten för de 8 intervallen. De vektorerna kan sedan till exempel användas för att plotta punkter istället för histogram med plot(mitt, antal). När du prövade hist(x,8) fick du antagligen ganska konstiga värden på intervallbredden (och en smal glipa i histogrammets vänsterkant). Detta beror på att hist-kommandot beräknar intervallbredden genom att dela avståndet mellan högsta x-värdet och lägsta x- värdet med 8, istället för att beräkna intervallbredden som (X max X min )/8 (det vill säga det högsta möjliga värdet, i det här fallet 1, minus det lägsta möjliga (0), delat med antalet binnar) vilket hade varit mer naturligt för den här typen av data. För att kunna rätta till sådana skönhetsfläckar kan vi istället för antalet binnar ange var vi vill ha klassmitten i anropet till hist. Vi kan till exempel sätta mycenter = 0.1 : 0.2 : 0.9 följt av hist(x,mycenter). Ett mer allmänt sätt att skapa ett histogram från minvalue till maxvalue med binvidd vidd är att skapa mycenter genom kommandot mycenter = [minvalue+vidd/2 : vidd : maxvalue-vidd/2] följt av hist(x,mycenter). Vi kan lägga till luft runt plotten genom att använda axis kommandot även för den här typen av grafer. 7.4 Utskrifter av grafik Det enklaste sättet att skriva ut en graf på en printer är att trycka på den lilla printersymbolen i grafikfönstret. Du får då upp en dialogruta där du kan välja printer och pappersformat. 7.5 Spara grafer och flytta till andra program Ofta kommer vi att behöva kopiera in en graf vi har producerat i ComsolScript i en rapport. Det gör vi enklast genom att trycka på save-knappen i grafikfönstret. Vi får då upp ett fönster där vi kan sätta ett antal parametrar, viktigast av dessa är bredd och höjd på den sparade figuren. När vi sedan trycker på Exportera... kommer vi till ett fönster där vi dels kan välja var vi sparar grafen, dels välja i vilket format vi vill spara grafen. Normalt är Portabel nätverksgrafik (*.png) det bästa valet, 2 eftersom en graf sparad i det formatet enkelt kan kopieras in i t.ex. OpenOffice dokument. Png formatet tillåter också att man när grafen importerats ändrar storleken på grafen i dokumentet med bibehållen kvalitet. Det är alltså inte nödvändigt att spara grafen i exakt den storlek som man vill visa den i det dokument där man kommer att använda grafen. Dock är det bra att försöka spara grafen i ungefär rätt storlek för när man skalar om grafen kommer även siffror och bokstäver på axlar och i titlar mm att skalas om, vilket ibland leder till alldeles för små eller stora sifror i dokumenten Lägga in bilder i OpenOffice dokument När vi vill använda bilder i OpenOffice placerar vi pekaren där vi vill ha bilden. För att läsa in bilden så går vi in i insert och väljer picture och sedan From file. Vi får då upp en dialogruta där vi kan välja vilken fil vi vill inkludera. När grafen väl kommit in i vårt dokument blir den ett objekt som vi kan välja. Klickar vi en gång på bilden så kommer det fram åtta små fyrkanter runt grafen. Dessa kan användas för att ändra bildens storlek genom att placera pekaren i en av rutorna, hålla musknappen nertryckt och dra åt det håll vi vill flytta grafens kant. Om vi använder rutorna i något av hörnen för detta så ändras bredd och höjd proportionerligt. Man skall bara i undantagsfall ändra en grafs storlek genom att ändra bredd eller höjd separat eftersom både siffror och text 2 de som skriver sina dokument i LaTex vill troligen helst importera grafer i eps-formatet. Detta format är inte tillgängligt i ComsolScript 1.0a. Eps-formatet är utlovat för version 1.0b.

74 68 KAPITEL 7. 2D-GRAFIK då blir mer eller mindre distorderade. Om man vill flytta bilden i texten så kan man dra den genom att dra figuren, dvs sätta pekaren över figuren, trycka ned musknappen och flytta pekaren, med knappen nedtryckt, kan vi flytta figuren till valfri plats i texten. När vi släpper upp mustangenten kommer bilden att flytta till den platsen. Genom att gå in i format och välja Wrap kan vi styra hur texten flyter runt bilden. Det finns fler atlternativ, men de som är lämpligast att använda är: Wrap of f där texten inte sätts vid sidan av bilden. Bilden läggs in mellan två rader text, även om bildens bredd är mindre än sidans bredd. Page wrap där texten, om den får plats, läggs på bögge sidor om bilden Optimal Page wrap där texten läggs på en sida om bilden, den sida där det finns mest plats för text. att flytta pekaren så att den ligger på bilden, hålla musknappen nere och dra. När vi väl placerat in bilden där vi vill ha den så kommer den att flyta runt litet när vi introducerar mer text. Vill man låsa fast bilden så att den inte flyttar sig nedåt sidan om vi skriver in mer text så klickar men en gång på bilden så att den markeras. Sedan går man in i Format väljer Bild och får upp en dialogruta. Klicka på fliken Placering och markera boxen Lås fästpunkten och avmarkera Låt bilden följa texten. Grafens placering fryses då så att även om vi skriver in mer text ovanför bilden så ligger den kvar, det är texten som flyter runt. Med standardinställningar kommer det att vara textfritt på bägge sidor om grafen. Ibland när man visar en liten bild, som här, så kan man vilja låta texten fylla upp utrymmet vid sidan om bilden. För litet större bilder är Wrap off den bästa inställningen. För mindre bilder är det bäst att lägga bilden antingen längst till höger eller längst till vänster och använda Optimal page wrap. Som framgår av det här exemplet är det oftast inte så snyggt att lägga texten på bägge sidor om bilden, dels eftersom textraderna ofta blir för korta för att brytas på ett vettigt sätt, dels för att det kan vara svårt att följa en rad tvärs över grafen när man läser. Oftast är det därför bättre att flytta bilden till ena sidan och låta texten löpa bara på en sida. 7.6 Fler Kurvor i samma graf - kommandot hold. Det är ganska vanligt att vi vill rita mer än en kurva i samma graf. För att undvika att ComsolScript hela tiden suddar den gamla plotten när vi ger ett nytt plot-kommando så kan vi använda kommandot hold on. Prova till exempel: x= -2*pi:0.05:2*pi; y=sin(x); plot(x,y) hold on z=cos(x); plot(x,z, r ) Det är nu vi kan börja få användning för legend-kommandot, prova: legend( Sinus x, Cosinus x ) En svårighet med hold-kommandot är att det inte går att ge kommandot axis efter att hold on är givet. Det gäller alltså att formattera axlarna innan man ger hold on. Det här betyder att komplicerade grafer, som allt annat i ComsolScript, måste göras via m-filer eftersom man säkert kommer att behöva gå in och ändra många detaljer i graferna innan man får det helt rätt.

75 7.7. FLER GRAFER I SAMMA FÖNSTER - KOMMANDOT SUBPLOT 69 När man vill börja på ny kula så ger man kommandot hold off. Notera att det som fryses är grafikfönstret i sig, vilket inte är specifikt för just plot-kommandot. Vi kan alltså överlagra allt som man kan visa i grafikfönstret, till exempel histogram, kurvor och mätpunkter med felstaplar i samma fönster. 7.7 Fler grafer i samma fönster - kommandot subplot (2,3,1) (2,3,2) 2,3,3) För att rita mer än en graf i samma fönster kan vi (2,3,4) (2,3,5) (2,3,6) avända oss av kommandot subplot som delar in grafikfönstret i ett antal rader och kolumner och låter oss adressera ett sådant delfönster med våra grafikkommandon. Kommandot har syntaxen subplot(antalrader, AntalKolumner, Rutnummer). Rutnumreringen görs löpande med övre vänstra hörnet som nummer 1 och hörnet längst ned till höger som nummer AntalRader AntalKolumner, se figuren härintill. Så snart vi har gett kommandot subplot(x,y,z) så kommer de följande grafik-kommandona att hänföra sig till enbart den lilla rutan. De andra rutorn förblir tomma tills vi ger ett nytt subplotkommando vartefter alla kommandon hänför sig till det nya delfönstret. I det läget är det ganska krångligt att komma tillbaka till ett del-fönster vi tidigare ritat i. Kommandon som title, xlabel mm måste alltså ges innan vi med ett nytt subplot kommando tar oss vidare till nästa delfönster. Ytterligare ett skäl till att jobba med m-filer och inte direkt i kommandofönstret - det här blir nästan aldrig rätt första gången! 7.8 Rita i grafer Ibland vill vi kunna rita i grafer, som till exempel när vi vill rita ut felstaplar i både x och y. För detta använder vi kommandot line(x,y) där x och y är vektorer med samma dimension. Kommandot ritar linjer mellan punkterna med koordinater ( x(i), y(i) ). Prova clear all x=[ ] y=[ ] line(x,y) axis([ ]) % för att inte linjen skall överlappa bildkanten. Om grafikfönstret är tomt innan vi kallar line så kommer ComsolScript att skapa ett fönster där de linjer vi ritar upp nätt och jämnt får plats. Vill vi frilägga strecken får vi använda axis kommandot. Normalt ritar man dock i ett fönster där det redan finns en graf, så detta brukar inte vara ett problem. Vi kan påverka linjen genom att i kommandot lägga till egenskaper och värden på denna egenskap som par av argument för kommandot. Så kan vi t ex skapa en röd linje med linjebredd 4 pixlar genom att ge line(x,y, color, r, linewidth,4). Vi kan också editera interaktivt genom att klicka på den lilla palett-symbolen i grafikfönstret. Vi får då upp ett fönster där vi kan ändra olika egenskaper hos de ritade linjerna genom att först välja line i vänsterspalten. I vissa grafer kan det finnas fler line -objekt, men genom att välja ett av dem så markeras de i grafen så det är lätt att se vilket objekt ändringarna kommer att göras för. Kommandot line accepterar också matriser som argument, om x och y är 2 n matriser så behandlar line varje kolumn som ett punktpar. Detkan vara enlare att skriva in koor-

76 70 KAPITEL 7. 2D-GRAFIK dinatparen i en nx2 matris och sedan transponera i line-kommandot: x=[1 1 ; 2 2 ;3 3.5] y = [2.5 2 ; 2 1.5; 1.5 1] line(x,y ) Kommandot line kan användas för att rita felstaplar i x- och y-led: x = [ ]; y = [ ]; deltax = 0.2*ones(1,3); deltay= 0.08 * y; plot(x,y, ob ) axis([min(x)-0.5 max(x) min(y)-0.5 max(y)+0.5]); %frilägger punkterna hold on % plotta först felet i x-led xline(1,1) = x(1)-deltax(1); xline(2,1) = x(1)+deltax(1); yline(1,1) = y(1); yline(2,1) = y(1); xline(1,2) = x(2)-deltax(2); xline(2,2) = x(2)+deltax(2); yline(1,2) = y(2); yline(2,2) = y(2); xline(1,3) = x(3)-deltax(3); xline(2,3) = x(3)+deltax(3); yline(1,3) = y(3); yline(2,3) = y(3); line(xline, yline) hold off Konstruktionen xline(1,1) = x(1)-deltax(1); xline(2,1) = x(1)+deltax(1); yline(1,1) = y(1); yline(2,1) = y(1); tillsammans med användandet av matriser i line-kommandot gör det enkelt att generalisera tilldelningen av värden till en slinga. Använder vi en sådan behöver vi inte upprepa koden för varje punkt utan kan istället skriva: for i=1:max xline(1,i) = x(i)-deltax(i); xline(2,i) = x(i)+deltax(i); yline(1,i) = y(i); yline(2,i) = y(i); end I slingan (koden mellan for... och...end) kommer alla värden mellan 1 och max att användas. Har vi organiserat våra data i vektorer så kan vi alltså spara in mycket kod genom att använda en slinga istället för att upprepa denna kodsekvens en gång för varje värde på i. Genom att ha felen i vektorer som har samma dimension som vektorn som håller mätpunkterna kan man också enkelt behandla fel som är olika stora i de olika punkterna. Pröva nu att introducera koden för att rita felstaplar i y-led. Vill man finlira så kan man också definiera en variabel epsilon som sätts till ett sådant värde att felstrecken inte går igenom ringen kring data punkten utan stannar vid ringen. Varje felstapel får då ritas som två separata streck, det vänstra mellan (x - deltax) och (x-epsilon), det högra mellan (x + epsilon) och (x + deltax).

77 7.9. LOGARITM-SKALOR Logaritm-skalor För att plotta med logskalor på en eller bägge axlar finns tre kommandon att tillgå: semilogy, semilogx och loglog som fungerar exakt som plot kommandot bortsett från att logaritmisk skala (bas 10) används för x-axeln, y-axeln och bägge axlarna.vi kan också välja logaritm-skala på x- eller y-axeln, eller bägge två, genom att trycka ned motsvarande knapp i grafikfönstret.

78 72 KAPITEL 7. 2D-GRAFIK 7.10 Övningsuppgifter 1. (Uppgift 5.4 ur Taylor) A student makes 20 measurements of the time for a ball bearing to fall from the top to the bottom of a vertical cylinder of oil. She arranges her results in increasing order and counts how many times she got each different value, as follows (with the times in tenths of a second): Time, t: Occurences a) Draw a bin histogram of these results using bins of width 1, starting at (Notice that, with bins of width 1, this bin histogram gives essentially the same result as a bar histogram.) b) Redraw the histogram with a bin width of 2, again starting at c) Notice how the wider bins in part b) give a smoother histogram. If the chosen bins are too wide, however, information starts to be lost. To illustrate this loss, redraw the histogram with a bin width of 10, again starting at Betrakta följande polynom av stigande grad: x x - x 3 /3! x - x 3 /3! + x 5 /5! x - x 3 /3! + x 5 /5! - x 7 /7! x - x 3 /3! + x 5 /5! - x 7 /7! + x 9 /9! Plotta dessa polynom i en och samma graf tillsammans med funktionen sin(x). Ta med cirka en period av sinus i x-led. Håll reda på vilken kurva som hör till vilken funktion genom att t ex plotta dem med olika färger eller symboler. Vad är det som sker och varför? Ta en liten funderare!

79 Kapitel 8 Text-strängar, beräkningar och anpassningar 8.1 Text-strängar Vi har hitills endast sett den enklaste formen av en text-sträng: a = Detta är en textsnutt. Det finns många kommandon som kan användas för att omvandla numeriska variabler till strängar och utföra andra operationer på strängvariabler. Här kommer vi bara att gå in på några få av dessa som utför lite enklare manipulationer av strängar. I nästa avsnitt skall vi lära oss hur vi formaterar in- och utmatning, vill du lära dig mer om stränghantering kan du läsa hjälpavsnittet:?/strings and Character Arrays/ Data Types for Non-Numeric Values: Strings, Cell Arrays, Structures i hjälpavsnittet Manipulera textsträngar Det är möjligt att lägga ihop två text-strängar till en längre sträng, men kanske inte riktigt som man först kan tro. Tag till exempel a = detta är och b = en textsträng. Lägger vi dem bredvid varandra som i kommandot c = detta är en textsträng (inget mellanslag mellan ) händer något intressant, prova! Det här illustrerar en annan sak vi kan behöva tänka på: eftersom enkelt citationstecken utgör start- och sluttecken för en sträng så måste vi göra något särskilt för att kunna skriva ut det tecknet i en text-sträng. Detta något särskilt är att vi skriver två tecken efter varandra. Prova att skriva ut strängen För att skriva ut måste man dubblera. För att kunna sätta ihop två strängar till en längre sträng, något som kallas att konkatenera (engelska concatenate) måste vi använda en syntax där det på något sätt framgår att de två citationstecknen som följer på varandra inte betyder att vi vill skriva ut det tecknet, det gör vi genom att omsluta de strängar som skall läggas ihop med hakparenteser: c = [ detta är en textsträng ] (med mellanslag mellan de bägge strängarna!) fungerar, liksom c = [a b] Delsträngar Vad vi inte berörde tidigare var att internt så lagras varje text-sträng som en vektor på vilken vi kan operera med som vi gör med numeriska vektorer 1 vi kan på vanligt sätt adressera delar 1 I sjäva verket lagras text-strängen som en numerisk vektor - varje tecken som finns på tangentbordet har en standardiserad numeriska kod - ASCII kod, a=97, A=65. Functionen abs( sträng ) ger ASCII koden för strängen om du är nyfiken. 73

80 74 KAPITEL 8. TEXT-STRÄNGAR, BERÄKNINGAR OCH ANPASSNINGAR av dem: a = Detta är en textsnutt a = Detta är en textsnutt length(a) ans = 21 a(7:11) ans = är en En nyttig funktion när vi manipulerar delsträngar är k=findstr(s1,s2). Detta kommandot söker efter den kortare av strängarna S1 och S2 i den längre och returnerar en vektor k som innehåller index för alla förekomster av den kortare strängen. Antag att S = En ensam enhörning så ger kommandot k = findstr( en,s) resultatet Notera att 1 (svarande mot En ) inte ingår i svaret, findstr är känslig för versal/gemen (detta kallas på engelska case sensitive). I följande exempel anväder vi findstr för att hitta ett filnamn i en textsträng. Vi vet att filnamnet kommer efter ordet namnet och avslutas med.m a= Den angivna filen har namnet resistor4.m, vilket är sökbart ; hitta1=findstr(a, namnet ); hitta2=findstr(a,.m ); filnamn=a((hitta1+length( namnet )):(hitta2+1)) filnamn = resistor4.m Att hitta filnamnet i en sträng som skrivs in för hand i programmet är väl inte så intressant men metoden i exemplet kan användas för att leta reda på till exempel ett filnamn som kan ha getts i en inmatningsrad från en användare. Detta namn kan sedan användas när vi i en m-fil sparar data till hårddisken 8.2 Enkel statistik MATLAB är i allmänhet mycket bra på att hantera matriser och vektorer. Det lönar sig att försöka att konsekvent utnyttja det när vi behandlar data. Antag till exempel att vi gjort en serie mätningar (3.6, 5.4, 2.8, 8.3, 3.7, 4.2, 6.1, 4.1, 3.8, 2.3) och vill beräkna medelvärde och standardavvikelse för dessa. Vi kan då naturligtvis göra detta genom att tilldela 10 olika variabler dessa värden: x1 = 3.6, x2=5.4, x3= och sedan beräkna < x > = (x1 + x2 + x x10)/10, och sedan fortsätta på motsvarande sätt för standardavvikelsen. Men det är mycket enklare att istället fylla en vektor med mätdata och sedan operera på vektorn: medel = sum(x)/length(x) diff = x - medel diff2 = diff. 2 sigma = sqrt(sum(diff2)/(length(x)-1)) Ännu enklare är givetvis att använda de inbyggda funktionerna mean(x) och std(x), men innan ni gör det måste ni en gång ha kodat detta för hand! 8.3 Polynom MATLAB har några inbyggda funktioner för att hantera polynom, för en fullständig beskrivning hänvisas du till?/data Analysis, Statistics, and I/O/ Interpolation and

81 8.3. POLYNOM 75 Polynomials/Working With Polynomials. Vi går här igenom några av de viktigaste funktionerna Hitta rötter till polynom. Givet ett polynom som till exempel y = 3x 3 7x + 4, så beräknas rötterna (nollställena) till polynomet med funktonen roots(p) där p är en vektor med koefficienterna för varje term i fallande ordning. Notera att om någon koefficient är noll så måste detta explicit anges med en nolla på rätt ställe i vektorn p. p = [ ]; roots(p) ans = Finn polynomuttryck för givna rötter Om vi omvänt har ett antal nollställen i en vektor n så ger oss funktionen poly(n) det polynom som har dessa rötter: n =[ ]; poly(n) ans = vilket alltså uttyds som polynomet x 4 10x x x Värden på polynom Värdet för ett polynom med koefficientvektor p i punkten x ges av polyval(p,x): m =[ ]; polyval(m,4.2) ans = Allts f(4.2) = om f(x) = 3x 3 2x 2 + 4x Derivator av polynom Att derivera ett polynom är naturligtvis inte särskilt svårt att göra utan ComsolScripts hjälp. Det kan dock ibland när man skriver generella program vara behändigt att ha en funktion till hands för detta, i ComsolScript heter den polyder(n) Produkter och kvoter av polynom ComsolScript beräknar produkter av två polynom med funktionen conv(a,b), samt kvoten mellan två polynom med funktionen deconv(a,b). För mer information använder du hjälpfunktionen.

82 76 KAPITEL 8. TEXT-STRÄNGAR, BERÄKNINGAR OCH ANPASSNINGAR 8.4 Matrisekvationer Vi har många gånger i detta kompendium tjatat om hur bra ComsolScript är för matrisberäkningar. Nu skall vi titta litet närmare på detta fält. Vi börjar med några enkla exempel. Inversen A 1 till matrisen A är en matris så att A 1 ( A = 1. I linjär ) algebra har vi lärt oss 3 4 metoder för att beräkna inversen till matriser som A =. ComsolScript-användare 2 1 kan slöa litet och istället använda sig av kommandot inv: A=[4 2; 1 0]; B=inv(A) B = B*A ans = Eftersom den numeriska precisionen hos datorn är begränsad till ett visst antal decimaler så blir svaret oftast inte riktigt exakt 1 när man kontrollräknar. Många fysikaliska fenomen kan beskrivas av matematiska formler som lämpar sig för att beräknas i en matrisformalism genom att en matris som representerar en operation appliceras på ett initialtillstånd och resulterar i ett sluttillstånd, vi kan skriva det som en matrismultiplikation: S = O I. Vi kommer då ofta att söka värden på den operator O som resulterar i sluttillståndet S givet ett initialtillstånd I. Det här kan låta väldigt abstrakt, och många gånger är det väl också på det viset. Men beräkningsmässigt handlar det om att vi känner matrisen I och S (ofta kolumnvektorer) så söker vi matrisen O som satisfierar ekvationen ovan. Detta problem löser vi genom att multiplicera med lämpliga inverser - från rätt håll: S I 1 = O I I 1 = O. 8.5 Minsta kvadratanpassning Om vi antar att en uppsättning mätpunkter (x i, y i ) uppfyller sambandet y = a + bx så kan vi med hjälp av maximum likelihood principen finna att den bästa (i meningen att summan av de kvadratiska avvikelserna minimieras) uppskattningen av parametrarna a och b ges av: a = wi x 2 i wi y i w i x i wi x i y i där w i = 1 σi 2 och wi wi x i y i w i x i wi y i och b = = ( ) 2 w i wi x 2 i wi x i Dessa ekvationer är relativt enkla att beräkna med hjälp av ComsolScript. Låt oss exemplifiera genom att lösa en variation på uppgift 8.13 i Taylor, där vi skall anpassa mätdata givna i tabellen till uttrycket s = s 0 + vt. Tid (s) Position (cm) Osäkerhet i position (cm) Felet i tiden är negligerbart. För att utföra anpassningen måste vi beräkna ett antal termer av typen wx vilket är relativt enkelt med ComsolScripts vektoroperationer och elementvisa operatorer. Summan är ju uppbyggd så att först skall varje element i w multipliceras med motsvarande element i x, därefter skall dessa produkter summeras. Vektoroperationen wx = w.* x utför den första av dessa operationer och skapar en ny vektor där elementen

83 8.5. MINSTA KVADRATANPASSNING 77 är produkten av motsvarande element i w och x vektorerna. Vi kan sedan enkelt summera dessa genom att applicera vektoroperatorn sum på denna vektor. Vi får alltså något i stil med % linfit.m % performs least squares fit to y=a+bx % Sten Hellman % % clear all; tid = [ ]; position=[ ]; DeltaPos = [ ]; x = tid; y = position; sigma = DeltaPos; w = 1./sigma. 2; xy = x.*y; x2 = x. 2; wx = w.*x; wy = w.*y; wx2 = w.*x2; wxy = w.*xy; sumw = sum(w); sumwx = sum(wx); sumwy = sum(wy); sumwxy = sum(wxy); sumwx2 = sum(wx2); delta=sumw * sumwx2 - sumwx 2; a = (sumwx2 * sumwy - sumwx * sumwxy) / delta; b = (sumw * sumwxy - sumwx * sumwy) / delta; Man kan givetvis hoppa över steget där vi går ifrån t.ex. tid till x, jag har valt att ha med det steget för att göra det hela tydligare. Vi kommer senare se hur vi skall skriva den del av koden som gör själva anpassningen som en allmän funktion som i stort sett ser ut som den del av koden som kommer efter de kommandon där vi byter variabelnamn. Det blir då naturligt att funktionen internt arbetar med variablerna x,y,w, och att den m-fil som kallar funktionen använder de variabelnamn som är de som används i problemformuleringen. Eftersom det hela finns sparat i en m-fil kan vi enkelt verifiera att vi reproducerar de resultat som anges i facit i Taylor om vi sätter alla vikter till 1, dvs sätter alla fel till 1. När vi ändå är igång är det lämpligt att plotta den kurva vi får ur anpassningen och data i

84 78 KAPITEL 8. TEXT-STRÄNGAR, BERÄKNINGAR OCH ANPASSNINGAR samma graf: xmin = min(x) -1; xmax = max(x) +1; xfit = xmin:xmax; yfit = a + b * xfit; plot(xfit, yfit, b- ); hold on; current = axis; luft = 0.5; new = [current(1)-luft current(2)+luft current(3)-luft current(4)+luft]; axis(new); errorbar(x, y, sigma, or ); hold off Den här delen av koden är skriven så att vi får en graf med en linje som är lagom lång för att omfatta de mätta punkterna och med lagom med luft mellan data och kanten av grafen utan att vi gör några antaganden om vare sig vilka värden mätdata antar eller om hur många punkter som är mätta. Det är en god vana att försöka skriva sin kod på det viset. Just anpassning till en rät linje är ju ett exempel på en uppgift som vi skall lösa många gånger i olika sammanhang. Det är därför bra att ha en m-fil som löser den uppgiften under så allmänna förutsättningar som möjligt. 8.6 Minsta kvadratanpassning med matrismetod En minsta kvadratanpassning av mätdata till ett andragradspolynom y = a + bx + cx 2 kan göras om vi formulerar sambandet mellan variabelvärden x i, mätta värden y i som en matrisoperation Y = X A: y 1 y 2 y 3. =. 1 x 1 x x 2 x x 3 x a b c Vi definierar dessutom en viktmatris: V 1 = 1 σ σ σ Minstakvadratmetoden ger då en uppskattning av parametervektorn som ges av A=(X T V 1 X) 1 (X T V 1 Y), vi får även en uppskattning av felen i parametervärdena som ges av A=(X T V 1 X) 1. Antag till exempel att vi med försumbart fel i x har mätt följande y-värden x y samt att felet i y-mätningen är 0.1. För att finna det anpassade värdet på koefficienterna sätter vi in våra värden i matrisformalismen och beräknar enligt receptet ovan. Vi har

85 8.6. MINSTA KVADRATANPASSNING MED MATRISMETOD 79 Y = , X = , V 1 = kodat i MATLAB blir detta: x=[1 ; 2 ; 3 ; 4 ; 5; 6]; y=[7.9 ; 26.1 ; 58.0 ; ; ; 238.0]; X=[ones(6,1) x x. 2]; sigma = 0.1 ; vminus1 = eye(6) * 1/sigma 2 ; A=inv(X * vminus1 * X) * (X * vminus1 * y) A = DeltaA=inv(X * vminus1 * X) Deltapar=sqrt(diag(DeltaA)); Deltapar = Det finns några teknikaliteter att begrunda i detta exempel. Först måste vi tänka på att inte frestas att inludera ett minustecken i namnet på covariansmatrisen. MATLAB tolkar V-1 som en instruktion att subtrahera V med enhetsmatrisen 1. Giltiga operatorer kan inte vara en del av variabelnamn! Sedan kan vi se hur vi i satsen där vi tilldelar värden till matrisen X har använt den genväg som MATLAB öppnar för oss och byggt en matris genom att kombinera kolumnvektorer. Eftersom vektorn x redan existerar så är det mycket enklare att skapa kolumnvektorn med en rad ettor och kolumnvektorn med kvadraten på elementen i x och sedan bygga matrisen från dem än att bygga en matris genom att placera ut elementen ett och ett. Minns också hur vi enkelt kan skapa en vektor ur elementen på diagonalen i en matris med kommandot diag.

86 80 KAPITEL 8. TEXT-STRÄNGAR, BERÄKNINGAR OCH ANPASSNINGAR 8.7 Övningsuppgifter 1. Pröva att finna vilken matris som löser ekvationen S = O I givet I = ( ) S = Lös följande ekvationssystem: ( ) och 4x - 5y + 3z = 22 x + 5y - 6z = -21 3x + y + 4z = 17 Använd dig av att ekvationssystemet kan skrivas på formen AX = B, där A är en känd matris, B en känd kolumnvektor, medan X är en okänd kolumnvektor vars komponenter x, y och z sökes. 3. Komplettera m-filen som visas i avsnitt 8.5 så att även felen i de anpassade parametrarna a och b beräknas som i problem 8.19 i Taylor.

87 Kapitel 9 Programmering De m-filer som ni skapat tidigare under kursen är exempel på små datorprogram. De har varit väldigt arbetsbesparande, kanske mest för att det har varit så enkelt att ändra någon liten detalj i en lång beräkning utan att behöva göra om hela arbetet. Nu skall vi ta den processen ett steg längre. Den stora arbetsbesparingen 1 när man använder datorprogram kommer dels av att man kan få en dator att utföra monotona uppgifter utan att behöva skriva ett kommando för varje uppgift som skall utföras, som när man använder en for-slinga för att upprepa samma kommando flera gånger med olika värden på en variabel. Den andra stora besparingen kommer när man vänjer sig att skriva generella programsnuttar, som till exempel för att beräkna normalfördelningen, som sedan kan användas som delprogram av andra program. I det här passet skall vi gå igenom vad man behöver tänka på för att skriva bra program, och de viktigaste kommandon som vi kommer att behöva. 9.1 Att programmera Att programmera är en konst man behöver lära sig. Hur man bäst skall göra det är naturligtvis väldigt individuellt, men de allra flesta kommer ganska långt med att träna genom att skriva de program man för stunden har behov av. Men det finns också en omfattande litteratur och teoribildning om hur bra datorprogram skall vara konstruerade. Man skall vara medveten om att kunskap om att programmera och kunskap om ett programmeringsspråk inte behöver vara samma sak. Man måste självklart kunna ComsolScriptspråket ordentligt för att kunna skriva bra ComsolScript-program, men det är inte tillräckligt. Omvänt kan man på en abstrakt nivå designa ett program utan att veta ett dyft om det programmeringsspråk programmet sedan implementeras i. Den här kursen har en praktiskt/pragmatisk inriktning, vi kommer inte att gå in på teorin kring programmerandet utan försöker lära genom exempel. Vi skall dock i detta kapitel ta upp vissa saker som är bra att försöka att hålla i huvudet när vi börjar skriva program. För att exemplifiera de olika elementen skall vi skriva en allmän rutin som beräknar primfaktorer för ett givet tal Design av programmet Den viktigaste delen av programmerandet börjar egentligen innan vi skrivit ett enda Comsol- Script-kommando, nämligen design-fasen. Innan vi börjar skriva in en massa kommandon bör man sitta ned och tänka igenom vilka steg programmet skall utföra, i vilken ordning och vad som är de möjliga utfallen under det att programmet kör. Nuförtiden finns det program som hjälper till i den här fasen och som ibland till och med skriver programkoden automatiskt 1 Kom ihåg att arbetsbesparingen i många fall kan vara så stor att den förvandlar någonting som varit fullständigt omöjligt att göra till något som går att genomföra. Det är alltså inte bara frågan om att göra samma saker snabbare och lättare, man kan göra helt nya saker också! 81

88 82 KAPITEL 9. PROGRAMMERING när man väl en gång på ett symboliskt sätt bestämt vad programmet skall utföra. Men man kommer ganska långt med ett gammalt hederligt flödesschema, en slags ritning över programmet. Det finns väl definierade regler för hur man skall rita ett flödesschema, här skall vi inte gå in i några detaljer 2 utan följer bara konventionen att beslut fattas i rombiska boxar, medan processer sker i vanliga rektanglar. Som exempel visar vi ett flödesschema för ett program som beräknar primfaktorer för ett godtyckligt tal: Bara genom att göra en sådan här enkel liten skiss dyker det upp många viktiga aspekter av programmet som man kanske inte tänker på från början, som till exempel att vi måste avdela en variabel för att lagra de primfaktorer som poppar upp. Vi ser också tydligt vilka data som skall in i programmet (x, det tal vi söker faktorer för) och vad som skall ut (antal primfaktorer och vilka de är). Vi ser också att en viss del av koden kommer att upprepas ett stort antal gånger för olika värden på variabeln i. Studerar man schemat en stund till inser man att programmet, som det är designat i figuren, kommer att testa alla faktorer udda som jämna vilket naturligtvis inte är nödvändigt eftersom den enda möjliga jämna faktorn är två. Det är då dags för steg 2: omdesign. I det här fallet väljer man lämpligen att först testa på faktorn två tills man har ett udda tal kvar, och sedan testa från 3 och uppåt med alla udda tal (byt i = i + 1 mot i = i + 2). Ett bra flödesschema skall bryta ned programmet i avskilda block som utför en specifik uppgift, visa vilka grenpunkter (villkor) som finns i programmet och hur dessa leder till att olika delar av koden utförs. Vidare skall vilka data som utbyts mellan programmet och dess omgivning - det så kallade gränssnittet - vara tydligt Dokumentation av programmet. Vi har tidigare berört vikten av att dokumentera program med kommentarer i koden. För stora program räcker inte detta sätt att dokumentera vad programmet gör, och vilket dess 2 I ritverktyget ( Show Draw Functions i verktygslisten öppnar en separat verktygslist för ritverktyg) finns en meny ( Flow-charts ) som innehåller olika symboler för ett flödesschema.

89 9.2. FORMATERAD IN- OCH UTMATNING 83 gränssnitt mot omvärlden är. Om programmet börjar omfatta tusentals rader med kod är det inte praktiskt att bläddra igenom koden på jakt efter kommentarer som avslöjar allt om programmet. I sådana fall bör man producera en separat dokumentation som talar om hur man använder programmet, vad programmet utför och vad som krävs för att programmet skall kunna köra (till exempel vilka data som måste matas in i programmet och i vilket format). Den här typen av dokumentation - Användarhandbok, engelska Users Guide - skall kunna läsas av någon som inte har några egentliga kunskaper i det programmeringsspråk som använts i det aktuella fallet. Däremot är det viktigt att dokumentera till exempel matematiska algoritmer som används av programmet om dessa har betydelse för hur man skall förstå resultaten. Inom den här kursen är det knappast troligt att ni kommer att skriva såpass stora program att de behöver dokumenteras på den här nivån, i allmänhet kommer kommentarer i koden att räcka till. Verkliga proffs låter dokumentationen av programmet ingå i design-fasen, jag har själv sett exempel på duktiga programmerare som först har utarbetat dokumentationen av programmet och diskuterat den med användarna av programmet i olika omgångar tills de varit nöjda, och först därefter börjat arbetet med att skriva programmet. Det är väl kanske onödigt att tillägga att de flesta av oss inte alls lever som vi lär utan sätter oss ned och försöker koda programmet rakt av och göra någon slags design as you go. Har man lite vana fungerar det också, för det mesta, men vi skulle nog skriva bättre program, och få dem klara lite tidigare om vi lade ned lite mer möda på design och dokumentation. 9.2 Formaterad in- och utmatning Hitills har vi inte haft något särskilt elegant sätt att kommunicera med våra m-filer: vi har kunnat skicka variabler mellan kommandofönstret och m-filen genom att utnyttja att de använder samma workspace, och vi har kunnat använda kommandot disp för att skriva ut textsträngar i kommandofönstret. För att kunna skriva användbara program måste vi ha en elegantare och flexiblare metod för att skicka information mellan de olika komponenterna Läs data och strängar från kommandofönstret - kommandot input. För att mata in data och textsträngar i en m-fil kan vi använda kommandot input. Kommandot förekommer i två former beroende på om vi vill läsa in en variabel: x = input(sträng), eller om vi vill läsa in en textsträng: text = (sträng, s ). I bägge fallen är sträng en textsträng som skrivs ut i kommandofönstret för att göra oss uppmärksamma på att programmet förväntar sig att vi skriver in något. En specialitet är att markören kommer att stanna omedelbart efter det att strängen skrivits ut. Om vi låter vårt program för primtalsfaktorer ha den litet hurtiga artighet som kännetecknar en del moderna program skulle vårt program kunna börja: disp( Hej och välkommen till PRIMFAKT - ) namn=input( Vad heter du?, s ); out1 = [ Hej namn]; disp(out1) out=[ Mata nu in det tal du vill söka faktorer för ]; x=input(out); för den fortsatta behandlingen finns nu det tal för vilket vi söker primfaktorer lagrat i variabeln x. (Observera att det är viktigt att lägga till semikolon i slutet av de kommandon där någon tilldelning sker, annars kommer denna att eka på skärmen och det ser inte alls snyggt ut).

90 84 KAPITEL 9. PROGRAMMERING Formatera strängar för utmatning - Formatkoder och kommandot sprintf När vi vill skriva ut ett resultat från en m-fil till kommandofönstret så kan vi använda kommandot num2str(x) som omvandlar en siffra till motsvarande textsträng. Vi kan då bygga upp en textsträng som vi sedan skriver ut i kommandofönstret med kommandot disp: out = [ Primfaktorerna är num2str(f(1)) och num2str(f(2))] följt av disp(out);. Problemet med den konstruktionen är att vi måste veta från början hur många tal vi vill skriva in i strängen. Ett mer flexibelt sätt att göra samma sak är att använda kommandot sprintf. Kommandot sprintf låter oss skriva in text och variabler till en textsträng med användande av formateringsregler, vi kan sedan skriva ut strängen på skärmen med användande av disp, precis som vanligt. Att beskriva hur formaterad utskrift går till kan bli väldigt abstrakt, så låt oss börja med ett exempel och försöka förstå det hela utifrån det exemplet. I kommandot y=2; x=3; string = sprintf( Svaret är %f eller kanske %g,y,x) skapar sprintf en textsträng som kallas string av den sträng som står till vänster om det första kommatecknet i parantesen. Men varje gång en formatkod - ordet som inleds med % - förekommer så ersättes formatkoden med en variabel hämtad efter det första kommatecknet. Antag att y = 2 och x = 3, strängen string blir då lika med Svaret är eller kanske 3. Men varför skrivs y ut med 6 decimaler och g utan decimaler? Det beror på att formatkoden inte bara visar att man skall stoppa in värdet av en variabel på den platsen i strängen, utan också hur den skall formateras. %f säger att det tal som skall stoppas in är ett decimaltal, och om vi inte anger annat så kommer det att skrivas med 6 decimaler. %g anger att talet skall skrivas ut på lämpligt sätt - om det är ett tal större än 10 4 och mindre än 10 6 skrivs det ut som ett decimaltal, men utan efterföljande nollor. Ligger talet utanför det intervallet skrivs det som ett decimaltal gånger en exponent av tio. Vill man alltid ha det senare formatet kan man använda formatkoden %e. Prova till exempel följande (för att skriva ut ett procenttecken i en textsträng skriver man %%): y=2.17; x= ; string = sprintf( x och y med formatet %%f %f %f,x,y) disp(string) string = sprintf( x och y med formatet %%g %g %g,x,y) disp(string) string = sprintf( x och y med formatet %%e %e %e,x,y) disp(string) Vi kan påverka både hur stor bredd sifferfältet skall uppta i textsträngen och hur många decimaler talet skall skrivas ut med. Det görs genom att skriva in siffror mellan procenttecknet och formatkoden. Den första siffran talar om vilken minsta bredd sifferfältet skall uppta, den andra siffran talar om hur många decimaler vi vill se utskrivna, mellan dessa siffror skrivs en punkt. Så betyder %7.3f att vi vill skriva ut ett decimaltal så att totala bredden blir minst 7 tecken och att talet skall ha 3 decimaler. Prova y=2.17; x= ; string =... sprintf( x har värdet %7.3f och y har %7.3f med formatet %%7.3f,x,y); disp(string) för att se hur det fungerar. Lägg märke till dels att talet skrivs ut med större bredd än den

91 9.2. FORMATERAD IN- OCH UTMATNING 85 minimibredd vi anger om detta är nödvändigt för att vi skall få plats med hela talet inklusive det antal decimaler vi ber om, dels att om talet är kortare så fylls det på med blanktecken för att minimikravet på bredd skall uppfyllas (vill vi att siffrorna skall stå till vänster i fältet skriver vi %-7.3f istället). Oftast vill man ju inte ha dessa blanka tecken inuti strängen utan skriver %0.3f för att ange antalet decimalsiffror, men ibland kan man vilja linjera upp siffror som skrivs ut i på varandra följande rader, och då kan en fix vidd vara användbar. Prova också vad som händer om ni använder formaten string = sprintf( x is%7.3g and y is %7.3g with format %%7.3g,x,y); och string = sprintf( x is %7.3e and y is %7.3e with format %%7.3e,x,y); Utöver e, f och g så finns det ett antal andra formatkoder, prova help sprintf. Den som vi kan komma att behöva i den här kursen är s som anger att vi vill stoppa in en hel sträng, oavsett hur lång den är (den kan alltså ha längden 1 när vi bara vill skriva ut en enskild boskstav). Det som gör sprintf lämplig att använda för att skriva ut resultat när vi inte vet hur många variabler vi vill skriva ut är att om det finns fler variabler till höger om det första kommat inom parantesen efter sprintf så börjar tolkningen om från början. Fel använt blir det inte särskilt snyggt, prova hur out=sprintf( Resultatet är %g,x,y) ser ut. Istället får vi konstruera fler strängar, varav en bara består av det okända antalet variabler som vi vill skriva ut, för att sedan lägga ihop strängarna till en lång sträng som vi lägger ut med hjälp av disp: x=1:7; out1=sprintf( Resultatet är ); out2=sprintf( %g,x); out=[out1 out2 ]; disp(out) Observera att strängen out2 innehåller ett mellanslag. Vi är nu mogna att koda den sista delen av vårt program, där vi skriver ut primfaktorerna: out1=sprintf( Talet %0.0f har %0.0f primfaktorer \n De är, x,... AntalFaktorer); out2=sprintf( %g,faktor); out=[out1 out2]; disp(out)

92 86 KAPITEL 9. PROGRAMMERING 9.3 Övningsuppgifter 1. Samla ihop alla delarna av programmet för att beräkna primfaktorer till ett fungerande program. 2. Skriv ett program som beräknar en approximation till e, basen för den naturliga logaritmen, från summan. 1 e = k! k=0 Låt programmet läsa in hur många termer som skall finnas med i summan, och skriv sedan i kommandofönstret ut hur många termer som summerats, och skillnaden mellan approximationen och exp(1), genom en lämpligt formaterad textsträng. 3. Modifiera programmet så att det istället frågar efter hur liten liten mellan approximationen och exp(1) som eftersträvas och sedan beräknar hur många termer som behövs innan approximationen blir tillräckligt bra.

93 Kapitel 10 Mer grafik och programmering 10.1 Mer om 2D-grafik I detta avsnitt samlar vi några kommandon som kan användas för mer avancerad 2D-grafik Avancerade kommandon för 2-D grafik Fler grafikfönster - kommandot figure Normalt ritas alla grafer i ett fönster som heter figure(1). Ibland när man till exempel analyserar resultaten från en laboration så vill man köra igenom ett program som gör hela analysen och spara ett antal olika plottar. Detta kan man göra genom att ge kommandot figure(#) där # är ett tal. Alla plottar som ritas efter detta kommando kommer att ritas i ett grafikfönster som heter figure(#) ända tills vi ger ett nytt kommando med ett nytt fönsternamn Att redigera en graf interaktivt I ComsolScript kan vi redigera grafer för hand direkt i det fönster där grafen ritas. Uppe i verktygslisten finns en knapp som ser ut som en liten palett. Trycker man på den öppnas ett fönster Redigera graf. För att demonstrera hur man redigerar grafer kör vi först följande kod: clf clear all x=0:.2:4; y= sin(x); z=cos(x); subplot(2,1,1) plot(x,y) subplot(2,1,2) plot(x,z, r* ) Innan du börjar redigera måste du välja vilket objekt du vill påverka. Detta gör du genom att välja något av de element som listas i vänsterspalten. I ComsolScript kallas det vi normalt kallar graf för Axes. Eftersom vi har två grafer i grafikfönstret finns det två objekt som kallas Axes i vänsterspalten. Objekten Axes kommer i samma ordning som numreringen i subplot-kommandot, så när vi klickar på den första Axes i listan, eller något objekt under det, så påverkar vi enbart egenskaper i det fönster som svarar mot position ett osv. Väljer vi Axes i vänsterspalten öppnas ett fönster där vi kan påverka ett antal egenskaper hos grafen. 87

94 88 KAPITEL 10. MER GRAFIK OCH PROGRAMMERING Axlar. Här kan vi redigera axlarna och stdrastret. Om vi normalt r Axlar valt i den versta flikmenyn nr fnstret ppnas. Vi kan d välja manuella värden för min och max på skalan genom att vid x/y-gränser ta bort markeringen vid Automatisk och skriva in nya min och maxvärden. Vi kan också välja att visa ha logaritmisk skala på en eller bägge axlar. Fyller vi i boxen Homogena axlar så kommer längdskalan på x- och y-axeln att sättas lika. Titel. Här kan vi välja en titel för hela figuren, och etiketter för x- och y-axeln. Typsnitt. Här kan vi välja typsnitt, storlek, stil och färg för texten i grafen. Om vi istället väljer line i vänsterspalten kan vi påverka hur data representeras i grafen. Vi kan ändra färg, linjebredd, linjetyp. Vi kan också välja vilken typ av markör som visas i datapunkterna och skriva dit en dataetikett Vi kan ändra 10.3 Handtags-grafik ComsolScript ger oss möjlighet att i detalj via kommandon styra utseendet av den grafik vi producerar på ungefär samma sätt som när vi redigerar interaktivt som ovan. Detta kan vara av värde när vi producerar grafik i ett program och vill påverka utseendet av graferna inifrån programmet istället för att göra det interaktivt. Detta görs med hjälp av något som kallas handtagsgrafik (eng handle graphics). När vi ägnar oss åt datorprogrammering så är ett handtag en variabel som pekar tillbaks på ett objekt vars egenskaper vi vill kunna påverka. Det kan vara en fil vi har öppnat i ett program och som vi vill skriva data till eller stänga eller byta namn på, eller som i det här fallet ett diagram vars egenskaper vi vill kunna ändra. Handtagen skaffar man sig genom kommandot handtag = cga. Detta ger oss ett handtag som vi sedan kan använda dels för att skaffa oss information om grafer, dels ändra variabel värden, och därmed egenskaper hos grafen. Handtagsgrafik är i sig en skön konst, vi kan inte gör mer än skrapa på ytan här, för en mer fullständig beskrivning hänvisar vi till?axes/plotting and Visualizing Data/Overview of Axes Functions Vi kan få en lista över de egenskaper vi får tillgång till genom det handtag vi skapar när vi ger plotkommandot är linjens egenskaper, om vi skriver get(handtag) i kommandofönstret så får vi en lista på de egenskaper hos detta objekt som vi kan ändra. Tabell 9.4 i?axes/plotting and Visualizing Data/Axes/Axes properties ger en fullständig beskrivning av vilka egenskaper hos grafikfönstret du kan ändra. Motsvarande egenskaper hos grafen självt beskrivs i Tabell 9.8 i?axes/plotting and Visualizing Data/2D Graphics/Editing Plots Låt oss genom ett exempel visa hur man kan arbeta med handtagsgrafik, börja med att skapa

95 D GRAFIK 89 följande plot: clear all clf x=0:.1:4; y=sin(x); z=cos(x); subplot(2,1,1) plot(x,y) handtag1 = gca subplot(2,1,2) plot(x,z, r-+ ) handtag2 = gca Prova nu att modifiera dessa plottar t.ex. på följande sätt: C set(handtag1, Ylim,[ ]) C xnu = get(handtag1, Xlim ) C xnu(1)=xnu(1)-0.5 C set(handtag1, Xlim,xnu) C set(handtag1, Xlim,xnu) C XTick=-0.5:.25:4.5; C set(handtag1, XTick,XTick) C set(handtag1, FontSize,10) C set(handtag1, FontSize,10) C handtag2line = get(handtag2, Children ) % skaffar handtag till linjen i graf 2 C get(handtag2line) % visar vilka objekt vi kan påverka set(handtag2line, LineStyle,, Linewidth,2, LegendString, cosinus x, Legend, on ) D grafik Tre-dimensionell grafik är ju något av en hägring, eftersom vi alltid får hålla tillgodo med tvådimensionella projektioner av kroppar och ytor i den tredimensionella rymden. ComsolScript hjälper oss att skapa sådana hägringar på flera olika sätt. Vi skummar litet på ytan, och hänvisar den som behöver en grundlig genomgång till?axes/plotting and Visualizing Data/3D Graphics Kurvor i rymden - plot3 Kommandot plot3(x,y,z,s) fungerar ekvivalent med kommandot plot i två dimensioner. Om x, y och z är vektorer (med samma längd) så plottas kurvan mellan punkterna, strängen s styr linjens utseende och har samma format som för plot-kommandot. Argumenten x, y och z kan också vara matriser av samma storlek, kommandot plottar då en kurva för varje kolumn i matriserna. Vill man ha fler kurvor i samma graf, men med olika antal punkter, eller med olika egenskaper hos linjen kan man ge kommandot på formen plot3(x1, y1,

96 90 KAPITEL 10. MER GRAFIK OCH PROGRAMMERING z1, s1, x2, y2, z3, s2,...). I övrigt fungerar de flesta kommandon som kan användas på en tvådimensionell plot också här: clear all; z=1:pi/32:2*pi; y=sin(z); x=cos(z); plot3(x,y,z, r ) xlabel( cos(t) ) ylabel( sin(t) ) zlabel( t ) grid on title( Helix i tre dimensioner ) I grafikfönstret kan vi rotera grafen för att betrakta den ur valfritt perspektiv. Tryck ned knappen Kretsa/Panorera/Zooma. Om vi trycker ned musknappen med markören någonstans i grafikfönstret och drar kommer grafen att rotera. Pröva! Vi kan också zooma in och ut med knappen Glidning in/ut. När man börjar rotera grafen är det lätt att gå vilse och till slut inte veta vad som är upp och ned. Då kan knappen Gå till standard 3D vy hjälpa oss hem igen. Beroende på vilka inställningar som gällde senast du var inne och plottade visas ibland den 3-dimensionella grafen utan axlar. Detta kan du ändra genom att ge box on. Alternativt kan du ge enbart box, som togglar, dvs sätter box= on om den är off och omvänt Funktionsytor - mesh och surf Funktionsytor kan åskådliggöras på två sätt, antingen som ett galler eller som en hel yta. Innan vi ger oss hän måste vi, i analogi med hur vi först skapade en x-vektor för att göra en tvådimensionell plot av en funktion skaffa oss ett x-y galler där funktionen skall utvärderas. Detta görs med kommandot [x, y] = meshgrid(xintervall, yintervall) som ger två matriser x och y som innehåller koordinaterna för varje punkt där funktionen skall utvärderas. Prova till exempel: clear all; clf figure(1) xkoord=-8:.1:4; ykoord=-4:.1:8; [x, y]=meshgrid(xkoord, ykoord); z=sin(sqrt(x. 2+y. 2)); mesh(x,y,z); figure(2) surf(x,y,z); Att styra utseendet av en 3D-graf Perspektiv Förutom att lägga till axel-rubriker och titlar, och ändra axlarna gradering som för en tvådimensionell graf (och naturligtvis hela batteriet med manipuleringar som handtagsgrafiken öppnar upp) så finns det några speciella funktioner för en 3D-graf. En är kommandot view som anger ur vilken riktning vi betraktar en graf. Denna anges med två vinklar (i grader): theta och phi. Theta är vinkeln mellan x-axeln och det plan i vilket grafen ligger. Theta=0 anger att x-axeln löper parallellt med bildytan, och att y-axeln pekar inåt i

97 10.5. MER OM PROGRAMMERING OCH FUNKTIONER 91 grafen (ser inget vidare ut!). Phi-vinkeln anger den vinkel som synlinjen bildar med horisontalplanet, phi=0 anger att vi ser på grafen horisontellt från sidan, phi=90 att vi betraktar det hela rakt ovanifrån. Dessa vinklar kan man ändra genom kommandot view(theta,phi). Det är lätt att gå bort sig när man börjar ändra denna vinkel, vill man komma tillbaks till det normala värdet (theta = -37.5, phi = 30) skriver man view(3). Man kan också ge view( xy osv om man vill visa plotten i xy-planet. view(3) visar standard 3D vy. Färgskala För att rita in en färgkarta som anger vilken färg som svarar mot vilket värde ger man kommandot colorbar. Tycker man inte att färgsättningen duger så finns det ett antal olika färgkartor att välja på - se tabell 9-10 i?/colormaps and Color Bars/3D Graphics/Plotting and Visualizing Data för att se vilka möjligheter som finns. Förutom att ange vilken typ av färgkarta du vill ha kan man också ange mellan vilka max- och min-värden färskalan skall sträcka sig. Du kan experimentera litet, som till exempel: C surf(x,y,z, ColorMap, bone(256), Clim,[-4 4]) C colorbar C surf(x,y,z, ColorMap, bone(256), Clim,[-1 1]) C colorbar C surf(x,y,z, ColorMap, jet(256), Clim,[-1 1]) C colorbar C surf(x,y,z, ColorMap, jet(256), Clim,[-2 2]) C colorbar C surf(x,y,z, ColorMap, jet(16), Clim,[-2 2]) C colorbar för att se hur det fungerar. ColorMap och Clim är bägge egenskaper som kan ändras genom att använda handtagsgrafik. En yta som plottas byggs internt upp av ett antal små element, pixlar. Hur dessa färgas styrs av kommandot shading. Det finns tre varianter, shading( flat ) visar varje enskilt bildelement med en färg, vald i en av hörnen av elementet. shading( faceted är samma sak, men med varje elemnt omges av en svart kant. Vi kan slutligen få en utjämnad färgsättning utan rutnät med shading interp. Har vi gjort en snygg färgad yta kan det ibland vara effektfullt (men oftast inte särskilt informativt) att helt frilägga den innan vi klipper in den i något annat program. Det görs genom grid off och axis off Konturplottar och projektioner Vi kan rita konturplottar med kommandot ett fjärde argument. contour(x,y,z), antalet nivåer kan styras med 10.5 Mer om programmering och funktioner Som en avrundning av kursen skall du skapa några funktioner som kan vara bra att ha med sig i bagaget under fortsättningen här på fysikum. Vi kommer inte att ge några färdiga recept, utan istället skissar vi litet på hur funktionerna skall fungera, vad som kan vara bra att tänka på och exemplifiera med några korta kod-avsnitt. För det här avsnittet finns inget klart facit, många av uppgifterna kan lösas på mer än ett sätt, kvittot på att du gjort rätt får du när funktionen fungerar som det är tänkt 1. 1 När man blir mer avancerad och skriver kod för stora program är inte detta ett tillräckligt kriterium för att en funktion är väl kodad. I sådana sammanhang gäller det dessutom att skriva effektivt, det vill säga

98 92 KAPITEL 10. MER GRAFIK OCH PROGRAMMERING Linjär korrelationskoefficient Låt oss börja med en funktion som beräknar den linjära korrelationskoefficienten för en datamängd av punkter med x- och y-värden. Algoritm Givet en uppsättning x- och y-värden beräknas korrelationskoefficienten ur: r = N (x i x)(y i ȳ) i=1 N N (x i x) 2 (y i ȳ) 2 i=1 i=1 Gränssnitt och syntax Vi börjar med att fundera över funktionens gränssnitt mot de omgivande programmen, som i det här fallet är ganska enkelt: nödvändiga indata till funktionen är datamängdens x- och y-värden. Dessa organiserar vi lämpligen som två vektorer där den ena innehåller x- värdet och den andra y-värdet för en given punkt. Vi behöver då bara vara noga med att index löper på samma sätt i de bägge vektorerna, så att x(3) och y(3) är x- och y-värde för samma mätpunkt. Resultatet vi förväntar oss efter att ha kallat funktionen är helt enkelt korrelationsparametern r, given av formeln Men skall vi skriva en så allmän funktion som möjligt, och det är ju det vi strävar efter, så bör vi kanske även förutse en möjlighet att få ut antalet mätpunkter ur funktionen, eftersom vi kan behöva det när vi går in i tabeller (som appendix C i Taylor) för att få ett värde på sannolikheten för en given korrelationskoefficient för givet antal mätpunkter. Det är naturligtvis lika enkelt att räkna ut hur många mätpunkter man har i huvudprogrammet som kallar funktionen som det är att göra i funktionen, vi måste alltså på något sätt försöka bestämma vilket vi tycker är bäst. Huvudregeln är att man skall försöka kapsla in så mycket som möjligt i funktionerna, gränssnittet mellan en kallande rutin och en funktion skall man försöka hålla så litet som möjligt för att behålla flexibilitet. I det här fallet är det ju också så att vi inte vet om man kommer att använda N i huvudprogrammet eller inte, medan vi vet att N är nödvändigt inuti funktionen. Det är därför logiskt att beräkna N i funktionen, och att ge N som ett resultat från funktionen. Funktionens syntax bör därför bli function [CorCoefficient, N] =lincorr(x, y). Felkontroll - kommandot error och warning När man skriver kod man skall använda länge och i många sammanhang, och kanske till och med skall dela med sig av till andra användare så måste man tänka igenom vilka möjliga fel som kan uppstå och hur man skall hantera dessa. Ett klassiskt exempel är division med noll, innan man utför det sista steget för att beräkna r bör man därför kontrollera att nämnaren inte blir noll. En annan sak som kan vara värd att kontrollera är att de bägge vektorerna x och y verkligen uppfyller förutsättningen att ha lika många element. En check på length(x) = length(y) är nödvändig. Säg att man hittar ett av dessa fel i funktionen, hur skall man då reagera? På något sätt måste felet signaleras till den rutin som kallar funktionen. Detta görs genom kommandot error( Message ). När detta kommando utförs skrivs meddelandet Message ut på skärmen och programmet avbryts, skriva rutiner på så sätt att uppgifterna löses så snabbt som möjligt och med minsta möjliga utnyttjande av datorns resurser som till exempel internminne.

99 10.5. MER OM PROGRAMMERING OCH FUNKTIONER 93 samtidigt som en del information som skall göra det lättare att se var felet uppstod skrivs ut i kommandofönstret. Felmeddelandet bör vara så informativt så att man genast inser vilket fel som inträffade så att det kan korrigeras. Även om informationen om var felet hände skrivs ut av ComsolScript så är det en god vana att inkludera sådan information i felmeddelandet självt. Kontrollen av att x och y har samma längd kan alltså se ut ungefär så här: if (length(x) = length(y)) error( Fel i funktion lincorr: argumenten x och y har inte samma längd ); end En liknande test bör göras före divisionen för att undvika division med noll på ett snyggt sätt. Om man vill signalera att en viss händelse inträffat, men ändå fortsätta och köra programmet kan man istället använda kommandot warning( Message ). I detta fall skrivs det ut en varning i kommandofönstret: Warning: Message in funktionsnamnet och programmet fortsätter sedan. Detta kan vara användbart om man till exempel i en anpassningsrutin vet att resultatet kan vara opålitligt om man har för få punkter. Man kan då skriva ut en varning, men låta programmet fortsätta och låta användaren bestämma hur hon skall använda resultatet. Testa funktionen När funktionen är kodad kan du testa den genom att skriva en huvudrutin som till exempel beräknar korrelationskoefficienten för tal 9.13 i Taylor: x = [ ]; y = [ ]; [r,n]=lincorr(x,y) Är det hela korrekt blir r= och N= Viktad anpassning till rät linje Nästa uppgift blir att med utgångspunkt i samma schema designa och skriva en funktion som gör en viktad anpassning till en rät linje, y=a + bx. Algoritm Parametrarna a och b, samt osäkerheten i dessa ges av: a = wi x 2 i wi y i w i x i wi x i y i och b = wi wi x i y i w i x i wi y i σ a = wi x 2 i σ b = wi där w i = 1 σ 2 i och = ( ) 2 w i wi x 2 i wi x i

100 94 KAPITEL 10. MER GRAFIK OCH PROGRAMMERING Gränssnitt och syntax Indata till funktionen är lämpligen tre vektorer, en med x-värden, en med y-värden och en med felen i y-värdena. Vilka resultat vi vill få ut ur funktionen kan variera en del. Vi kommer alltid att vilja se de anpassade värdena för parametrarna a och b, samt osäkerheten i dessa. Eventuellt vill vi också få en uppfattning om kvaliteten i anpassningen, det vill säga chikvadratsumman per frihetsgrad och antalet frihetsgrader. Eftersom det, i motsats till lincorr ovan, inte är nödvändigt att räkna ut dessa senare tal för att funktionen skall kunna köra, så lönar det sig att testa med nargout om dessa värden verkligen är efterfrågade eller inte innan de beräknas. Syntaxen för funktionen blir då: function [para, sigmaa, parb, sigmab, ChiSquared, Dof] =linfit(x, y, sigma). Felkontroll Ett möjligt fel som måste kollas är om de tre vektorerna som är argument till funktionen inte har samma längd. Vidare bör man kontrollera att inte är noll så att divisionerna ger ett odefinierat resultat. Om chi-kvadrat skall beräknas måste vi också kontrollera att det finns minst tre mätta punkter, annars kommer divisionen när chi-kvadrat per frihetsgrad beräknas att bli odefinierad, samt att inget av mätfelen felaktigt är angivet som 0, i vilket fall bidraget till chi-kvadratsumman från den punkten blir odefinierat. Testa funktionen Du kan testa den färdiga funktionen på datamängden x =[ ]; x=x*0.001; y =[ ]; dy =[ ]; Svaret skall bli: a = ( ± 1.540)10 3, b = ( ± 0.665), N = 6, χ 2 /d.o.f. = Viktad anpassning och plottning av rät linje. Här skall vi skriva en funktion som levererar en graf med data plottade med felstaplar och i samma graf den räta linjen som är ett resultat av anpassningen till en rät linje, med parametrarna för anpassningen utskrivna. Algoritm Anpassningen till en rät linje är inte något problem, vi låter bara denna funktion i sin tur anropa linfit som vi skrev i förra avsnittet. Det gäller sedan bara att få grafen att se snygg ut utan att göra några antaganden i förväg om hur data ser ut. Det kan man åstadkomma genom att först plotta data, sedan flytta ut axlarna med 10% av det värde som den automatiska skalningen ger för att se till att alla punkter ligger väl inne i grafen. Därefter drar vi den räta linjen som definieras av anpassningen. Om det anges i den kallande rutinen så skall linplot skriva ut parametrarna från anpassningen. För att skriva ut parametrarna formaterar vi med formatet %0.3g för att det skall se snyggt ut oberoende av vilket resultatet av anpassningen blir. Vi vill sedan att texten skall hamna på ett vettigt ställe och väljer därför att börja skriva 5% av grafens totala bredd in från vänsterkanten och översta raden 5% från toppen. Om riktningskoefficienten från anpassningen är negativ kommer datapunkter att ligga i det övre vänstra hörnet, vi väljer då istället att i horisontell ledd börja att skriva i mitten av grafen. (Ett alternativ till denna algoritm kan vara att lägga till extra 20% i höjdled när vi skalar om vertikalt och använda

101 10.5. MER OM PROGRAMMERING OCH FUNKTIONER 95 denna area till att placera in texten.) Vi bör däremot undvika att använda kommandon som påverkar var grafen plottas, som figure(#) och subplot, det är bättre att det kallande programmet gör sådana val, eftersom önskemålen kan vara vitt skilda för olika tillämpningar. Gränssnitt och syntax Gränssnittet för den här funktionen är detsamma som för linfit, de parametrar som skall skickas vidare till linfit, vektorerna x, y och sigma måste ges som argument i anropet till linplot. En lyx-variant av funktionen skulle kunna ha som tillval att man även ger en sträng som anger hur grafen skall plottas av plot-kommandot, som till exempel -or, men i första omgången bryr vi oss inte om det. Däremot måste vi skicka med tre textsträngar som ger textsträngar för titel, x-etikett och y-etikett. Om vi vill kunna välja om parametervärden skrivs ut i plotten eller inte så måste vi sätta in flaggor för detta i argumenten till funktionsanropen, parflag som är 1 om vi vill att parametervärdena skall skrivas in och 0 annars, chiflag styr på samma sätt om chi-kvadrat och frihetsgrader skall skrivas ut (kom ihåg att variabler inte skall ha samma namn som funktioner, vi kan alltså inte använda title och xlabel som namn på variablerna). Utdata från linplot är de samma som för linfit, alltså i första hand värdet på parametrarna och osäkerheten i dessa, samt som tillval chi-kvadratsumman och antalet frihetsgrader. Vi kan dessutom tänka oss att linplot ibland kommer att kallas utan att den kallande rutinen använder utdata alls, i de fall det intressanta bara är att få en graf. Syntaxen för funktionen blir då : function [para, sigmaa, parb, sigmab, ChiSquared, Dof] =linfit(x, y, sigma, titel, labelx, labely, parflag, chiflag) Eftersom linplot skall kalla linfit måste vi också fundera över gränssnittet mellan dessa bägge funktioner. I princip är det ju inget som hindrar linplot från att kalla linfit med alla sex utdata parametrarna i anropet. Men om linplot inte är kallad med parametrarna ChiSquared och Dof, och om chiflag är noll så behöver man ju inte beräkna chi-kvadratsumman i linfit. Att ändå kalla linfit med alla sex utdata parametrar betyder då att programmet spenderar tid på att beräkna saker som aldrig kommer att användas, vilket är slöseri. Vi måste alltså i linplot testa om så är fallet eller inte och bara anropa linfit med alla sex utdata parametrar om det är nödvändigt, annars använder vi [para, sigmaa, parb, SigmaB] Felkontroll Det fel vi behöver testa för är om vektorerna x, y och sigma har samma längd, i annat fall kraschar errorbar-kommandot. Man kan tycka att vi inte behöver testa för det i linplot eftersom linfit testar för det. Men man skall försöka att skriva varje funktion så komplett och sluten som möjligt. Det kan ju hända att vi i framtiden vill använda linplot så att den kallas av någon annan funktion än linfit, i en sådan situation kan det vara omöjligt att minnas att vi måste kolla om den nya funktionen gör den nödvändiga testen.

102 96 KAPITEL 10. MER GRAFIK OCH PROGRAMMERING Testa funktionen Om funktionen fungerar bör kodsnutten nedan clear all; x =[ ]; x=x*0.001; y =[ ]; dy =[ ]; dy=dy*10; clf disp( YYYY ) [para, sigmaa, parb, sigmab, chi, N] = linplot... (x, y, dy, Resistor 1, Ström (A), Spänning (V),1,1) skapa en graf som ser ut som: testa också att texten dyker upp på rätt ställe när riktningskoefficienten är negativ, och att vi kan slå av och på utskrift av parametervärden med flaggorna som det är tänkt.

103 10.6. ÖVNINGSUPPGIFTER Övningsuppgifter 1. Rita följande funktioner, prova med olika kombinationer av mesh, surf, surfl och shadint interp, samt testa olika färgkartor. z = x 2 + y 2 10 x 10, 10 y 10 ) z = ( x 2 + y 2 2π x 2π, 2π y 2π 2. Kronan på verket blir att skriva en funktion som med matrismetoden gör en minsta kvadratanpassning till ett polynom med godtyckligt gradtal. Indata till funktionen är en vektor med y-värden, en med x-värden och en vektor med osäkerheten i y-värdena. Dessutom måste vi vid anropet ange till vilket gradtal anpassningen skall göras. Utdata är vektorn med parametervärdena och covariansmatrisen. Den felkontroll som behöver göras är att antalet y-värden är minst lika stort som antalet parametrar som skall anpassas och att inget av felen är noll.

104 98 KAPITEL 10. MER GRAFIK OCH PROGRAMMERING

105 Kapitel 11 Svar och lösningar 11.2 Svar till kapitel 2 1. a) y=3*x.^2+4*x (y = ) b) yprim = yprim = 6*x + 4 (yprim = ) 2. y=2*x.^3 + 4*x - 3 (y = ) 3. a1 = [2;-5;2] ; a2 = [3 ; 2 ; -4]; a3 = [1 ; 0 ; 2] A = [a1 a2 a3] A2 = [a2 ; a3 ; a1 ] 4. A + B = A-B = A *B = S = [ ] V = diag(s.ˆ(-2)) 6. x = alfa*pi/180 (x = ) s = sin(x) ( s = ) c=(1-s.^2).^0.5 ( c = ) A=[alfa s c ] ( A =

106 100 KAPITEL 11. SVAR OCH LÖSNINGAR ) 7. massa = [ ]; hastighet = [ ]; T = 0.5*massa.*hastighet.^2 (T = tott = sum(t) (tott = ) 11.4 Svar till kapitel 4 1. r = ceil(6*rand(1,10)) 2. Ett förslag till lösning kan vara: function y = slumptal() % % producerar ett slumpat heltal mellan 1 och 100 % y = 1 + floor(100*rand(1,1)); 3. Ett förslag till lösning är: function tipsrad() % % genererar en slumpm\"assig tipsrad % r = 3*rand(1,13) for i = 1:13 if (r(i) < 1) disp( 1 ) elseif (r(i) < 2) disp( x ) else disp( 2 ) end end 4. Ett exempel är: function y=newton(x) % function to compute square root of x, using Newtons formula % y(k+1) = 0.5*(y(k) + x/y(k)) with y(1) = 1 % % Sten Hellman yold = 1; delta = 1;

107 11.6. SVAR TILL KAPITEL index = 0; while(delta > ) index = index + 1; ynew = 0.5* ( yold + x/yold); delta = abs(yold-ynew) yold=ynew end y = ( round(10000*ynew) / 10000) 11.6 Svar till kapitel 6 1. Felet med programmet är att variabeln x inte ändras när vi har hittat en primtalsfaktor. Varje gång vi till exempel testar om 9 är jämnt delbart med 3 så stegas AntalFaktorer upp med en enhet, men x är fortfarande 9 nästa gång vi testar. När vi hittar en primfaktor till x måste vi dividera bort den ur x innan vi fortsätter att söka fler faktorer, till exempel så här: AntalFaktorer=0; i=2; while(i<= x) kvot = x/i; rest = i*floor(kvot)-x; if(rest ==0) AntalFaktorer = AntalFaktorer + 1 Faktor(AntalFaktorer) = i x = kvot; else if(i==2) i=i+1; else i=i+2; end end end AntalFaktorer Faktor 11.8 Svar till kapitel 7 1. Graferna bör se ut ungefär så här:

108 102 KAPITEL 11. SVAR OCH LÖSNINGAR 2. Det vi ser är hur serieutvecklingen av sinusfunktionen successivt närmar sig funktionen vartefter man tar med fler och fler termer i summan. Grafen bör se ut ungefär så här: grad 1 grad 3 grad 5 grad 7 grad 9 sinus Svar till kapitel 8 1. O = ( ) Vilket fås genom att koda: >> I= [3 4 ; -2 1]; >> S = [17 19 ; ]; >> O=S*inv(I) O = Vi har A = och B = med lösningen X = 2 1 3

109 SVAR TILL KAPITEL vilket fås ur: >> clear all >> B= [22 ; -21 ; 17]; >> A = [4-5 3 ; ; 3 1 4]; >> inv(a)*b ans = Det räcker med att lägga till raderna Deltaa = sqrt(sumwx2/delta); Deltab = sqrt(sumw/delta); Svar till kapitel 9 1. Ett exempel är: % Primtal-final.m % to compute factors to arbitrary number x % Sten Hellman % % clear all; namn=input( Hej och valkommen till PRIMFAKT - \n Vad heter du?, s ); out=[ Hej namn \n Mata nu in det tal du vill soka faktorer for \n ]; x=input(out); xinitial =x; % startvrdet p x mste sparas eftersom x kan frndras senare i % programmet AntalFaktorer=0; i=2; while(i<= x) kvot = x/i; rest = i*floor(kvot)-x; if(rest ==0) AntalFaktorer = AntalFaktorer + 1; Faktor(AntalFaktorer) = i; x = kvot; else if(i==2) i=i+1;

110 104 KAPITEL 11. SVAR OCH LÖSNINGAR else i=i+2; end end end out1 = sprintf( %g har %g primfaktorer:\n,xinitial,antalfaktorer); out2 = sprintf( %g,,faktor); out3 = sprintf( \b\b ); out = [out1 out2 out3]; disp(out) 2. En möjlig lösning är: % exponent.m % computes approximation to exp(x) from serial % expansion % Sten Hellman clear all; disp( En approximation till e berknas genom serieutveckling ); Termer=input( Upp till vilken term skall summeringen g? \n ); Faktor=1; Approx = 1; % this establishes the zero-term for index=1:termer Faktor = Faktor * index; Approx = Approx + 1/Faktor; end Diff = exp(1) - Approx; out = sprintf( Efter %g termer r approximationen= %g, skillnaden r %g,index,appr disp(out) 3. Eftersom vi inte på förhand vet hur många termer som kommer att behövas så måste vi ersätta for-loopen med en while-loop. Vi justerar dessutom in/output satserna: % exponent2.m % computes approximation to exp(x) from serial % expansion % Sten Hellman clear all; disp( En approximation till e berknas genom serieutveckling ); Delta=input( Upp till vilken noggrannhet summeringen g? \n );

111 SVAR TILL KAPITEL Faktor=1; Approx = 1; Diff = exp(1) - Approx; index = 0; % this establishes the zero-term while (Diff >= Delta) index = index + 1; Faktor = Faktor * index; Approx = Approx + 1/Faktor; Diff = exp(1) - Approx; end out = sprintf( Efter %g termer r approximationen= %g, skillnaden r %g,index,ap disp(out)

112 106 KAPITEL 11. SVAR OCH LÖSNINGAR

113 107

114 108 APPENDIX A. SYNTAX FÖR FORMLER I OPENOFFICE Appendix A Syntax för formler i OpenOffice A.1 Unary and binary operators

115 A.2. RELATIONS 109 A.2 Relations

116 110 APPENDIX A. SYNTAX FÖR FORMLER I OPENOFFICE A.3 Set symbols

117 A.4. FUNCTIONS 111 A.4 Functions

118 112 APPENDIX A. SYNTAX FÖR FORMLER I OPENOFFICE A.5 Operators

119 A.6. ATRIBUTES 113 A.6 Atributes

120 114 APPENDIX A. SYNTAX FÖR FORMLER I OPENOFFICE A.7 Others

121 A.8. BRACKETS 115 A.8 Brackets

ComsolScript 1.2 i kursen experimentella metoder

ComsolScript 1.2 i kursen experimentella metoder ComsolScript 1.2 i kursen experimentella metoder av Sten Hellman Övningsuppgifter av Elin Bergeås, Sten Hellman, Max Karlovini, Teresia Månson, Jonas Strandberg & Linda Östman ii 3:e upplagan, Stockholm

Läs mer

MATLAB 7 i kursen experimentella metoder

MATLAB 7 i kursen experimentella metoder MATLAB 7 i kursen experimentella metoder av Sten Hellman med Introduktion till Microsoft Word av Jonas Strandberg Övningsuppgifter av Sten Hellman, Max Karlovini, Teresia Månson & Jonas Strandberg ii 3:a

Läs mer

MATLAB 6 i kursen experimentella metoder. Sten Hellman Fysikum Stockholms Universitet

MATLAB 6 i kursen experimentella metoder. Sten Hellman Fysikum Stockholms Universitet MATLAB 6 i kursen experimentella metoder Sten Hellman Fysikum Stockholms Universitet 2 1 INLEDNING 6 2 VAD ÄR MATLAB? 7 3 KONVENTIONER 8 4 PASS 1- KOMMA IGÅNG 9 4.1 DE FÖRSTA STEGEN HALLO WORLD 9 4.1.1

Läs mer

MATLAB 6 i kursen experimentella metoder Sten Hellman

MATLAB 6 i kursen experimentella metoder Sten Hellman Utkast 1.1 21.08 03-03-10 MATLAB 6 i kursen experimentella metoder Sten Hellman Introduktion till MicroSoft Word av Jonas Strandberg Övningsuppgifter av Max Karlovini, Teresia Månsson & Jonas Strandberg

Läs mer

Introduktion till Matlab

Introduktion till Matlab Introduktion till Matlab Inledande matematik, I1, ht10 1 Inledning Detta är en koncis beskrivning av de viktigaste delarna av Matlab. Till en början är det enkla beräkningar och grafik som intresserar

Läs mer

Laboration: Grunderna i Matlab

Laboration: Grunderna i Matlab Laboration: Grunderna i Matlab Att arbeta i kommandofönstret och enkel grafik Den här delen av laborationen handlar om hur man arbetar med kommandon direkt i Matlabs kommandofönster. Det kan liknas vid

Läs mer

Laboration: Grunderna i MATLAB

Laboration: Grunderna i MATLAB Laboration: Grunderna i MATLAB 25 augusti 2005 Grunderna i MATLAB Vad är MATLAB? MATLAB är ett interaktivt program för vetenskapliga beräkningar. Som användare ger du enkla kommandon och MATLAB levererar

Läs mer

Octave 3.2.4 i kursen experimentella metoder

Octave 3.2.4 i kursen experimentella metoder Octave 3.2.4 i kursen experimentella metoder av Sten Hellman Omarbetat av Johan Ahrens och Henrik Öberg Övningsuppgifter av Johan Ahrens, Henrik Öberg, Elin Bergeås Kuutmann, Sten Hellman, Max Karlovini,

Läs mer

namn, inklusive katalogtillhörigheten. Den andra saken vi måste förstå är något som kallas "den atlab

namn, inklusive katalogtillhörigheten. Den andra saken vi måste förstå är något som kallas den atlab 5 Pass 2 Datorer, filnam och mer beräkningar I det här passet skall vi lära oss litet allmänt om hur datorprogram fungerar och hur de hanterar data på hårddisk och i minnet. Men framför allt skall vi lära

Läs mer

Introduktion till Matlab

Introduktion till Matlab Introduktion till Matlab Analys och Linjär Algebra, del A, K1/Kf1/Bt1, ht10 1 Inledning Ni kommer använda Matlab i nästan alla kurser i utbildningen. I matematikkurserna kommer vi ha studio-övningar nästan

Läs mer

Uppgift 1 - programmet, Uppg6.m, visade jag på föreläsning 1. Luftmotståndet på ett objekt som färdas genom luft ges av formeln

Uppgift 1 - programmet, Uppg6.m, visade jag på föreläsning 1. Luftmotståndet på ett objekt som färdas genom luft ges av formeln Matlab-föreläsning (4), 10 september, 015 Innehåll m-filer (script) - fortsättning från föreläsning 1 In- och utmatning Sekvenser, vektorer och matriser Upprepning med for-slingor (inledning) Matlab-script

Läs mer

Lägg märke till skillnaden, man ser det tydligare om man ritar kurvorna.

Lägg märke till skillnaden, man ser det tydligare om man ritar kurvorna. Matlabövningar 1 Börja med att läsa igenom kapitel 2.1 2 i läroboken och lär dig att starta och avsluta Matlab. Starta sedan Matlab. Vi övar inte på de olika fönstren nu utan återkommer till det senare.

Läs mer

MATLAB 6 i kursen experimentella metoder

MATLAB 6 i kursen experimentella metoder MATLAB 6 i kursen experimentella metoder Sten Hellman Fysikum Stockholms Universitet Övningsuppgifter av Max Karlovini, Theresia Månsson & Jonas Strandberg 1 2 1 INLEDNING 7 2 VAD ÄR MATLAB? 8 3 KONVENTIONER

Läs mer

Kom igång med. Windows 8. www.datautb.se DATAUTB MORIN AB

Kom igång med. Windows 8. www.datautb.se DATAUTB MORIN AB Kom igång med Windows 8 www.datautb.se DATAUTB MORIN AB Innehållsförteckning Grunderna i Windows.... 1 Miljön i Windows 8... 2 Startskärmen... 2 Zooma... 2 Snabbknappar... 3 Sök... 4 Dela... 4 Start...

Läs mer

Datorövning 1 Calc i OpenOffice 1

Datorövning 1 Calc i OpenOffice 1 Datorövning 1 Calc i OpenOffice 1 1 OpenOffice Calc Till förmån för de som följer kursen Fysikexperiment för lärare skall vi här gå igenom några få exempel på hur OO Calc (motsvarar MS Excel) kan användas

Läs mer

Linjär algebra med tillämpningar, lab 1

Linjär algebra med tillämpningar, lab 1 Linjär algebra med tillämpningar, lab 1 Innehåll Per Jönsson Fakulteten för Teknik och Samhälle, 2013 Uppgifterna i denna laboration täcker kapitel 1-3 i läroboken. Läs igenom motsvarande kapitel. Sitt

Läs mer

MATLAB 6 i kursen experimentella metoder

MATLAB 6 i kursen experimentella metoder MATLAB 6 i kursen experimentella metoder av Sten Hellman med Introduktion till Microsoft Word av Jonas Strandberg Övningsuppgifter av Sten Hellman, Max Karlovini, Teresia Månson & Jonas Strandberg ii 2:a

Läs mer

Introduktion till Word och Excel

Introduktion till Word och Excel Introduktion till Word och Excel HT 2006 Detta dokument baseras på Introduktion till datoranvändning för ingenjörsprogrammen skrivet av Stefan Pålsson 2005. Omarbetningen av detta dokument är gjord av

Läs mer

KPP053, HT2016 MATLAB, Föreläsning 1. Introduktion till MATLAB Skript Inläsning och utskrift av variabler Ekvationssystem Anonyma funktioner

KPP053, HT2016 MATLAB, Föreläsning 1. Introduktion till MATLAB Skript Inläsning och utskrift av variabler Ekvationssystem Anonyma funktioner KPP053, HT2016 MATLAB, Föreläsning 1 Introduktion till MATLAB Skript Inläsning och utskrift av variabler Ekvationssystem Anonyma funktioner MATLAB Väletablerat Mycket omfattande program GNU OCTAVE Öppen

Läs mer

Instruktion för laboration 1

Instruktion för laboration 1 STOCKHOLMS UNIVERSITET MATEMATISKA INSTITUTIONEN Avd. för matematisk statistik MD, ANL, TB (rev. JM, OE) SANNOLIKHETSTEORI I Instruktion för laboration 1 De skriftliga laborationsrapporterna skall vara

Läs mer

Allmänt om programvaror och filer i Windows.

Allmänt om programvaror och filer i Windows. Allmänt om programvaror och filer i Windows. Vart sparade du dokumentet? I Word. Jag har fått detta svar mer än en gång när jag försökt hjälpa någon att hitta ett dokument som de tappat bort i sin dator.

Läs mer

Datorlära 3 Octave Workspace ovh mijlö Skriva text på skärmen Värdesiffror Variabler och typer Strängar Makro Vektorer

Datorlära 3 Octave Workspace ovh mijlö Skriva text på skärmen Värdesiffror Variabler och typer Strängar Makro Vektorer Datorlära 1 Introduktion till datasystemet, epost konto, afs hemkonto Introduktion till datorer och datasalar Open Office Calculator Beräkningar med Open Office Calc Diagram med OO Calc Datorlära 2 Utforma

Läs mer

Laboration 1 Introduktion till Visual Basic 6.0

Laboration 1 Introduktion till Visual Basic 6.0 Laboration 1 Introduktion till Visual Basic 6.0 Förberedelse Förbered dig genom att läsa föreläsningsanteckningar och de kapitel som gåtts igenom på föreläsningarna. Läs även igenom laborationen i förväg.

Läs mer

Innehåll. Vad är MATLAB? Grunderna i MATLAB. Informationsteknologi. Informationsteknologi.

Innehåll. Vad är MATLAB? Grunderna i MATLAB. Informationsteknologi. Informationsteknologi. Grunderna i MATLAB eva@it.uu.se Innehåll Vad är MATLAB? Användningsområden MATLAB-miljön Variabler i MATLAB Funktioner i MATLAB Eempel och smakprov: Grafik Beräkningar Bilder GUI Vad är MATLAB? Utvecklat

Läs mer

Mathematica. Utdata är Mathematicas svar på dina kommandon. Här ser vi svaret på kommandot från. , x

Mathematica. Utdata är Mathematicas svar på dina kommandon. Här ser vi svaret på kommandot från. , x Mathematica Första kapitlet kommer att handla om Mathematica det matematiska verktyg, som vi ska lära oss hantera under denna kurs. Indata När du arbetar med Mathematica ger du indata i form av kommandon

Läs mer

Lab 7, 48 steg till ett bättre liv i Unix-labbet

Lab 7, 48 steg till ett bättre liv i Unix-labbet Lab 7, 48 steg till ett bättre liv i Unix-labbet Urban Liljedahl 13 december 2002 Instruktioner Mål Krav Utveckla förmågan att söka kunskap med hjälp litteratur och andra källor. Utveckla förmågan att

Läs mer

Inledning till OpenOffice Calculator Datorlära 2 FK2005

Inledning till OpenOffice Calculator Datorlära 2 FK2005 Inledning till OpenOffice Calculator Datorlära 2 FK2005 Mål Lära sig att skapa och använda ett räkneblad med OpenOffice Calculator Beräkna medelvärde och standardavvikelsen med räknebladet Producera en

Läs mer

Kom igång. Readyonet Lathund för enkelt admin. Logga in Skriv in adressen till din webbsida följt av /login. Exempel: www.minsajt.

Kom igång. Readyonet Lathund för enkelt admin. Logga in Skriv in adressen till din webbsida följt av /login. Exempel: www.minsajt. Kom igång Logga in Skriv in adressen till din webbsida följt av /login. Exempel: www.minsajt.se/login Nu dyker en ruta upp på skärmen. Fyll i ditt användarnamn och lösenord och klicka på "logga in". Nu

Läs mer

Laboration 0. Enhetsbokstaven anges med ett kolon efter och man läser ofta ut detta, exempelvis C:(sekolon).

Laboration 0. Enhetsbokstaven anges med ett kolon efter och man läser ofta ut detta, exempelvis C:(sekolon). Laboration 0 Laborationen är till för dig som inte är familjär med att navigera i filträd på en dator. Om du är van vid detta (vilket är det vanliga nu för tiden) så kan du bara snabbt titta igenom laborationen.

Läs mer

Kort-kort om utdelade användarkonton och datormiljön på NADA

Kort-kort om utdelade användarkonton och datormiljön på NADA Kort-kort om utdelade användarkonton och datormiljön på NADA UNIX-konto, användaridentitet Namn Du har fått ett konto med ett användarnamn bestående av prefixet ip99_ och ytterligare tre bokstäver. Dessa

Läs mer

Grundkurs 1 IKT Filhantering

Grundkurs 1 IKT Filhantering Filhantering Dan Haldin Ålands lyceum I N N E H Å L L S F Ö R T E C K N I N G Innehållsförteckning... 2 Filhantering med Windows... 3 Skapa Mappar... 4 Spara rätt... 5 Öppna sparade filer... 7 Flytta och

Läs mer

DN1212, Numeriska metoder & grundläggande programmering. Laboration 1 del 1-3 (frivilliga delar) Del 1-3 (dvs upg 1.1-1.17) behöver inte redovisas

DN1212, Numeriska metoder & grundläggande programmering. Laboration 1 del 1-3 (frivilliga delar) Del 1-3 (dvs upg 1.1-1.17) behöver inte redovisas DN1212, Numeriska metoder & grundläggande programmering för P1. Laboration 1 del 1-3 (frivilliga delar) Del 1-3 (dvs upg 1.1-1.17) behöver inte redovisas Introduktion till UNIX och MATLAB Del 1: UNIX och

Läs mer

Steg 1 Minnen, mappar, filer Windows 7

Steg 1 Minnen, mappar, filer Windows 7 Steg 1 Minnen, mappar, filer Windows 7 Maj -13 Liljedalsdata.se Liljedalsdata Steg 1 Sida 1 Inledning Välkommen till denna kurs. Att jobba med datorer är ofta som att jobba med matematik. Det nya bygger

Läs mer

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och...

MATLAB. Python. Det finns flera andra program som liknar MATLAB. Sage, Octave, Maple och... Allt du behöver veta om MATLAB: Industristandard för numeriska beräkningar och simulationer. Används som ett steg i utvecklingen (rapid prototyping) Har ett syntax Ett teleskopord för «matrix laboratory»

Läs mer

E-post. A. Windows Mail. Öppna alternativ. Placera ikonen på skrivbordet.

E-post. A. Windows Mail. Öppna alternativ. Placera ikonen på skrivbordet. E-post A. Windows Mail Öppna alternativ Klicka på startknappen Startmenyn öppnas Klicka på Alla Program Leta reda på Windows Mail Dubbelklicka Windows Mail öppnas. Om ikonen ligger i Start-menyn Klicka

Läs mer

Konsolfönster i Windows Momentet ingår i kursen PDA DTR1206 Lab 1 DOS http://www.cwdata.se Konsolfönstret

Konsolfönster i Windows Momentet ingår i kursen PDA DTR1206 Lab 1 DOS http://www.cwdata.se Konsolfönstret Konsolfönster i Windows Momentet ingår i kursen PDA DTR1206 Lab 1 DOS http://www.cwdata.se Konsolfönstret Med ett kommandobaserat gränssnitt menas ett helt textbaserat gränssnitt. Istället för att klicka

Läs mer

Vanliga frågor för VoiceXpress

Vanliga frågor för VoiceXpress Vanliga frågor för VoiceXpress 1) Hur stort ordförråd (vokabulär) innehåller VoiceXpress? VoiceXpress innehåller ett mycket omfattande ordförråd, och svaret på frågan varierar en aning beroende på hur

Läs mer

Snabbguide till First Class

Snabbguide till First Class Snabbguide till First Class Guide till First Class Grundläggande funktioner Logga in i First Class För att logga in i First Class dubbelklickar du på skrivbordsikonen First Class, eller väljer First Class

Läs mer

Steg 1 Minnen, mappar, filer Windows 8

Steg 1 Minnen, mappar, filer Windows 8 Steg 1 Minnen, mappar, filer Windows 8 Feb -14 Liljedalsdata.se Liljedalsdata Steg 1 W8 Sida 1 Inledning Välkommen till denna kurs. Att jobba med datorer är ofta som att jobba med matematik. Det nya bygger

Läs mer

FrontPage Express. Ämne: Datorkunskap (Internet) Handledare: Thomas Granhäll

FrontPage Express. Ämne: Datorkunskap (Internet) Handledare: Thomas Granhäll FrontPage Express I programpaketet Internet Explorer 4.0 och 5.0 ingår också FrontPage Express som installeras vid en fullständig installation. Det är ett program som man kan använda för att skapa egna

Läs mer

Objektorienterad programmering i Java I

Objektorienterad programmering i Java I Laboration 0 Objektorienterad programmering i Java I Uppgifter: 2 Beräknad tid: ca 2 3 timmar Att läsa: sidan 45 52 Syfte: Att ladda hem och installera utvecklingsmiljön Att skriva ditt första Javaprogram

Läs mer

MMA132: Laboration 2 Matriser i MATLAB

MMA132: Laboration 2 Matriser i MATLAB MMA132: Laboration 2 Matriser i MATLAB Introduktion I den här labben skall vi lära oss hur man använder matriser och vektorer i MATLAB. Det är rekommerad att du ser till att ha laborationshandledningen

Läs mer

Internet. En enkel introduktion. Innehåll:

Internet. En enkel introduktion. Innehåll: Internet En enkel introduktion Innehåll: Datorns olika delar Starta datorn Så gör du om du kan webbadressen Så gör du om du inte kan webbadressen Kortfattad repetition Alingsås bibliotek, 2012 2 3 4 6

Läs mer

3. Hämta och infoga bilder

3. Hämta och infoga bilder Sida 1 av 8 Lektion 1: sida 4 av 4 «Sida 3 av 4 Till kursens framsida 3. Hämta och infoga bilder Nu vet vi ju hur man sätter in text i sin sida. Men hur gör man med bilder? Det är inte svårt alls! Det

Läs mer

Introduktion till MATLAB

Introduktion till MATLAB 29 augusti 2017 Introduktion till MATLAB 1 Inledning MATLAB är ett interaktivt program för numeriska beräkningar med matriser. Med enkla kommandon kan man till exempel utföra matrismultiplikation, beräkna

Läs mer

Välj bort om du vill. 96 Internet och e-post. 2. Mail-programmet finns i datorn. 1. Skriv mail i sökrutan. Windows Live Mail i Aktivitetsfältet.

Välj bort om du vill. 96 Internet och e-post. 2. Mail-programmet finns i datorn. 1. Skriv mail i sökrutan. Windows Live Mail i Aktivitetsfältet. Välj bort om du vill Om du är nöjd med att ha din e-post på nätet, kan du lugnt hoppa över detta avsnitt. Har du tid och tycker att det är roligt, kan du testa att använda e-postprogrammet Windows Live

Läs mer

Microsoft Office Excel, Grundkurs 1. Introduktion

Microsoft Office Excel, Grundkurs 1. Introduktion Dokumentation - Kursmaterial Innehåll 1. Introduktion 1.1. Programfönster 1.2. Inskrift och redigering 1.3. Cellformat 1.4. Arbeta med formler Kursövning E1.xlsx Egna Övningar E1E.xlsx - OnePRO IT, Bengt

Läs mer

Komma igång med 3L Pro 2014. Komma igång med 3L. Copyright VITEC FASTIGHETSSYSTEM AB

Komma igång med 3L Pro 2014. Komma igång med 3L. Copyright VITEC FASTIGHETSSYSTEM AB Komma igång med 3L Innehåll LOGGA IN I 3L... 3 Verktyg och kortkommandon... 6 Övriga tangenter... 9 RAPPORTUTSKRIFT I 3L... 10 Instruktioner för att skriva till fil:... 11 Logga in i 3L Ikonen för 3L Pro

Läs mer

Instruktion för laboration 1

Instruktion för laboration 1 STOCKHOLMS UNIVERSITET MATEMATISKA INSTITUTIONEN Avd. för matematisk statistik ANL/TB SANNOLIKHETSTEORI I, HT07. Instruktion för laboration 1 De skrifliga laborationsrapporterna skall vara skrivna så att

Läs mer

Win95/98 Nätverks Kompendium. av DRIFTGRUPPEN

Win95/98 Nätverks Kompendium. av DRIFTGRUPPEN Win95/98 Nätverks Kompendium av DRIFTGRUPPEN Sammanfattning Vad håller jag i handen? Detta är en lättförståelig guide till hur man lägger in och ställer in nätverket i Windows 95 och 98 Efter 6 (sex) enkla

Läs mer

DATORLÄRA 1 2013-09-02 Christophe Clément - Fysikum

DATORLÄRA 1 2013-09-02 Christophe Clément - Fysikum 1 DATORLÄRA 1 2013-09-02 Christophe Clément - Fysikum Datorlära 1 FK2002 & FK2005 ÖVERSIKT FÖR DATORLÄRA DELEN I KURSEN Datorlära 1 (alla) SU resurser, OpenOffice Writer Datorövning 2 (alla) Enkel databehandling

Läs mer

Kom igång-guide: Spara tusenlappar med Libreoffice - IDG.se

Kom igång-guide: Spara tusenlappar med Libreoffice - IDG.se 1 av 6 2013-03-10 09:03 DETTA ÄR EN UTSKRIFT FRÅN PC FÖR ALLA Artikelns webbadress: http://www.idg.se/2.1085/1.495243 /kom-igang-guide--spara-tusenlappar-med-libreoffice 2013-03-10 08:33 - PC för Alla:

Läs mer

Operativsystem - Windows 7

Operativsystem - Windows 7 Uppgift 5 B Operativsystem - Windows 7 Skapa mappar och undermappar Det finns olika sätt att skapa nya mappar på. Alternativ. Högerklicka på en tom yta. Håll muspekaren över Nytt. Klicka på Mapp Alternativ.

Läs mer

Vilken version av Dreamweaver använder du?

Vilken version av Dreamweaver använder du? Sida 1 av 7 Lektion 1: sida 1 av 4 Till kursens framsida Sida 2 av 4» Lektion 1 Då ska vi sätta igång med den här kursens första lektion! Här kommer du att få lära dig hur man skapar och förbereder webbplatser

Läs mer

APA för nybörjare. Innan du börjar. Översikt

APA för nybörjare. Innan du börjar. Översikt APA för nybörjare Den här texten är tänkt som en snabb introduktion hur du kan använda publiceringssystemet APA (Advanced Publication Application) för att redigera webbplatser. Texten kräver inga förkunskaper

Läs mer

Introduktion till Matlab

Introduktion till Matlab CTH/GU LABORATION 1 MVE011-2012/2013 Matematiska vetenskaper 1 Inledning Introduktion till Matlab Matlab är både en interaktiv matematikmiljö och ett programspråk, som används på de flesta tekniska högskolor

Läs mer

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Att förstå variabler Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata. Vad är en variabel? En variabel är en plats att lagra information. Precis

Läs mer

Datorns delar DATORLÅDA CD/DVD-SPELARE/BRÄNNARE SKÄRM. DISKETT-STATION Finns sällan i nya datorer. TANGENTBORD

Datorns delar DATORLÅDA CD/DVD-SPELARE/BRÄNNARE SKÄRM. DISKETT-STATION Finns sällan i nya datorer. TANGENTBORD Datorns delar På en skivspelare kan du spela olika sorters musik som till exempel pop, rock, jazz, och klassiskt. Utan skivor är skivspelaren inget att ha. För att du ska kunna använda en dator måste du

Läs mer

Introduktion till Matlab

Introduktion till Matlab CTH/GU STUDIO 1 LMA515b - 2016/2017 Matematiska vetenskaper 1 Inledning Introduktion till Matlab Matlab är både en interaktiv matematikmiljö och ett programspråk, som används på många tekniska högskolor

Läs mer

Gran Canaria - Arbetsbeskrivning knapplänkar (Mediator 8)

Gran Canaria - Arbetsbeskrivning knapplänkar (Mediator 8) Gran Canaria - Arbetsbeskrivning knapplänkar (Mediator 8) I detta exempel kommer du att lära dig Att skapa en ny presentation från början Att skapa en enkel knapp Att använda händelseinställningar, events

Läs mer

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php

Alla filer som bearbetar PHP script ska avslutas med ändelsen.php, exempelvis ska en indexsida till en hemsida heta index.php Introlektion PHP är ett av de enklare språken att lära sig just pga. dess dynamiska struktur. Det används för att bygga upp båda stora och mindre system. Några vanliga system som använder sig av PHP är

Läs mer

DN1240, Numeriska metoder. Laboration 0 (frivilliga delar) (dvs uppgifterna behöver inte redovisas) Introduktion till UNIX och MATLAB

DN1240, Numeriska metoder. Laboration 0 (frivilliga delar) (dvs uppgifterna behöver inte redovisas) Introduktion till UNIX och MATLAB DN1240, Numeriska metoder för O1. Laboration 0 (frivilliga delar) (dvs uppgifterna behöver inte redovisas) Introduktion till UNIX och MATLAB Del 1: UNIX och kontoadministration Uppgift 1.1 Ni bör jobba

Läs mer

Skapa mapp. * Gör så här: Det finns många sätt att skapa mappar, men det enklaste sättet brukar vara följande.

Skapa mapp. * Gör så här: Det finns många sätt att skapa mappar, men det enklaste sättet brukar vara följande. Ideell IT-förening där äldre lär äldre Skapa mapp Det finns många sätt att skapa mappar, men det enklaste sättet brukar vara följande. * Gör så här: 1. Se till att du befinner dig på den plats i datorn

Läs mer

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg Introduktion till programmering D0009E Föreläsning 1: Programmets väg 1 Vad är en dator? En maskin vars beteende styrs av de innehållet (bitmönster) som finns lagrade i datorns minne (inte helt olikt förra

Läs mer

DATORINTRODUKTION. Laboration E850-2000 ELEKTRO. UMEÅ UNIVERSITET Tillämpad fysik och elektronik Ulf Holmgren

DATORINTRODUKTION. Laboration E850-2000 ELEKTRO. UMEÅ UNIVERSITET Tillämpad fysik och elektronik Ulf Holmgren UMEÅ UNIVERSITET Tillämpad fysik och elektronik Ulf Holmgren 2000-03-17 specialversion inför kursstart Elektronik och mätteknik 2000 DATORINTRODUKTION Laboration E850-2000 ELEKTRO Personalia: Namn: Kurs:

Läs mer

Index. Vektorer och Elementvisa operationer. Summor och Medelvärden. Grafik i två eller tre dimensioner. Ytor. 20 januari 2016 Sida 1 / 26

Index. Vektorer och Elementvisa operationer. Summor och Medelvärden. Grafik i två eller tre dimensioner. Ytor. 20 januari 2016 Sida 1 / 26 TAIU07 Föreläsning 2 Index. Vektorer och Elementvisa operationer. Summor och Medelvärden. Grafik i två eller tre dimensioner. Ytor. 20 januari 2016 Sida 1 / 26 Matriselement och Index För att manipulera

Läs mer

ANVÄNDARGUIDE. ViTex

ANVÄNDARGUIDE. ViTex ANVÄNDARGUIDE ViTex ViTex snabbguide 1. Inläsning till ViTex från inskannat dokument via kopiatorn 2. Uppläsning i ViTex 3. Navigation & Zoner 4. Ändra inställningar 5. Kontakt och Support 1. Inläsning

Läs mer

Sidpanelen och gadgetar De är nya. De är smarta. Lär dig hur du använder dem.

Sidpanelen och gadgetar De är nya. De är smarta. Lär dig hur du använder dem. Kap 03.indd 444 KAPITEL TRE Sidpanelen och gadgetar De är nya. De är smarta. Lär dig hur du använder dem. Gadgetar och den nya Sidpanelen är nog mina favoriter bland de nya funktionerna i Windows Vista.

Läs mer

Lathund för BankID säkerhetsprogram

Lathund för BankID säkerhetsprogram Lathund för BankID säkerhetsprogram BankID säkerhetsprogram för Windows, version 4.10 Datum: 2009-11-23 Introduktion När du ska hämta ut och använda e-legitimationen BankID behöver du ha ett installerat

Läs mer

FIRSTCLASS. Innehåll:

FIRSTCLASS. Innehåll: FIRSTCLASS Innehåll: Hämta klient...2 Installera klient...2 Konfigurera klient...2 Koppla upp...3 Skrivbordet...3 Mailbox...3 Presentation...3 Skapa ett nytt meddelande...4 Söka mottagare för nytt meddelande...4

Läs mer

FC-kurs Röbäcks skolområde, åk 5-6

FC-kurs Röbäcks skolområde, åk 5-6 FC-kurs Röbäcks skolområde, åk 5-6 En kortfattad manual för följande funktioner: 1. Hur det ser ut i FC (repetition) 2. Hur man skickar och läser mail i FC (repetition) 3. Att skicka och ta emot en bilaga

Läs mer

IT-körkort för språklärare. Modul 9: Rätta skrivuppgifter

IT-körkort för språklärare. Modul 9: Rätta skrivuppgifter IT-körkort för språklärare Modul 9: Rätta skrivuppgifter Innehåll I. Rätta uppgifter i Word... 3 Markera fel med färger snabbt och enkelt... 3 Använd Words rättningsverktyg skriv kommentarer... 4 Gör ändringar

Läs mer

SF1900 Sannolikhetsteori och statistik, HT 2017 Laboration 1 för CINEK2

SF1900 Sannolikhetsteori och statistik, HT 2017 Laboration 1 för CINEK2 Matematisk Statistik SF1900 Sannolikhetsteori och statistik, HT 2017 Laboration 1 för CINEK2 1 Introduktion Denna laboration är inte poänggivande utan är till för den som vill bekanta sig med MATLAB. Fokusera

Läs mer

Beräkningsvetenskap och Matlab. Vad är MATLAB? Vad är MATLAB? Användningsområden. Vad är MATLAB? Grunderna i Matlab. Beräkningsvetenskap == Matlab?

Beräkningsvetenskap och Matlab. Vad är MATLAB? Vad är MATLAB? Användningsområden. Vad är MATLAB? Grunderna i Matlab. Beräkningsvetenskap == Matlab? Beräkningsvetenskap och Matlab Beräkningsvetenskap == Matlab? Grunderna i Matlab Beräkningsvetenskap I Institutionen för, Uppsala Universitet 1 november, 2011 Nej, Matlab är ett verktyg som används inom

Läs mer

Skapa mappar, spara och hämta dokument

Skapa mappar, spara och hämta dokument Skapa mappar, spara och hämta dokument Övningen görs på hårddisken i mappen Mina dokument 1a Starta programmet utforskaren 1 b Huvudgrupper i utforskaren 1c Expandera huvudgrupper, enheter och mappar Skapa

Läs mer

Steg 1 Minnen, mappar, filer Windows 10

Steg 1 Minnen, mappar, filer Windows 10 Steg 1 Minnen, mappar, filer Windows 10 Sep -18 Liljedalsdata.se Liljedalsdata Steg 1 Sida 1 Inledning Välkommen till denna kurs. Operativsystem, Program/Appar, webbsidor och instruktioner inom IT-branchen

Läs mer

Extramaterial till Matematik Y

Extramaterial till Matematik Y LIBER PROGRAMMERING OCH DIGITAL KOMPETENS Extramaterial till Matematik Y NIVÅ TVÅ Taluppfattning och tals användning ELEV Det finns många olika programmeringsspråk. I den här uppgiften ska du få bekanta

Läs mer

OBS! Snabbinsatt Matlab-intro vissa fönsterhanteringsdetaljer kan vara fel men gör gärna Matlab-uppgifterna. DN1240, Numeriska metoder för OPEN1.

OBS! Snabbinsatt Matlab-intro vissa fönsterhanteringsdetaljer kan vara fel men gör gärna Matlab-uppgifterna. DN1240, Numeriska metoder för OPEN1. OBS! Snabbinsatt Matlab-intro vissa fönsterhanteringsdetaljer kan vara fel men gör gärna Matlab-uppgifterna. DN1240, Numeriska metoder för OPEN1. Laboration 0 del 1-3 (frivilliga delar) Del 1-3 (dvs upg

Läs mer

DD1311 Programmeringsteknik för S1 Laborationer läsåret 2007-2008

DD1311 Programmeringsteknik för S1 Laborationer läsåret 2007-2008 DD1311 meringsteknik för S1 Laborationer läsåret 2007-2008 Fyll i ditt namn och personnummer med bläck eller motsvarande. Kursledare är Linda Kann, linda@nada.kth.se. Namn... Personnr... Laborationer Labb

Läs mer

SF1520, Numeriska Metoder och Grundläggande Programmering för K2 Lab1.

SF1520, Numeriska Metoder och Grundläggande Programmering för K2 Lab1. SF1520, Numeriska Metoder och Grundläggande Programmering för K2 Lab1. Denna labb är tänkt att öva datorhantering och öva inledande Matlab. Eftersom förkunskaperna varierar finns en del frivilliga uppgifter

Läs mer

Matriser och Inbyggda funktioner i Matlab

Matriser och Inbyggda funktioner i Matlab Matematiska vetenskaper 2010/2011 Matriser och Inbyggda funktioner i Matlab 1 Inledning Vi skall denna vecka se på matriser och funktioner som är inbyggda i Matlab, dels (elementära) matematiska funktioner

Läs mer

Användarhandledning Version 1.2

Användarhandledning Version 1.2 Användarhandledning Version 1.2 Innehåll Bakgrund... 2 Börja programmera i Xtat... 3 Allmänna tips... 3 Grunderna... 3 Kommentarer i språket... 4 Variabler... 4 Matematik... 5 Arrayer... 5 på skärmen...

Läs mer

2009-08-20. Manual för Typo3 version 4.2

2009-08-20. Manual för Typo3 version 4.2 2009-08-20 Manual för Typo3 version 4.2 1 2 Innehåll: 1. Allmänt 4 2. Grunderna i Typo3 5 2.1 Knappar 5 2.2 Inloggning 5 2.3 Den inledande vyn 6 2.4 Sidträdet 7 3. Sidor 8 3.1 Skapa en ny sida 8 3.1.1

Läs mer

SF1520, Numeriska Metoder och Grundläggande Programmering för K2 Lab1.

SF1520, Numeriska Metoder och Grundläggande Programmering för K2 Lab1. SF1520, Numeriska Metoder och Grundläggande Programmering för K2 Lab1. Denna labb är tänkt att öva datorhantering och öva inledande Matlab. Eftersom förkunskaperna varierar finns en del frivilliga uppgifter

Läs mer

Precis som var fallet med förra artikeln, Geogebra för de yngre i Nämnaren

Precis som var fallet med förra artikeln, Geogebra för de yngre i Nämnaren Publicerad med tillstånd av Nämnaren Thomas Lingefjärd Geogebra i gymnasieskolan En tilltalande egenskap med Geogebra är att programmet kan användas tvärs över stora delar av utbildningssystemets matematikkurser.

Läs mer

Föreläsning 2. Operativsystem och programmering

Föreläsning 2. Operativsystem och programmering Föreläsning 2 Operativsystem och programmering Behov av operativsystem En dator så som beskriven i förra föreläsningen är nästan oanvändbar. Processorn kan bara ges enkla instruktioner såsom hämta data

Läs mer

Att skriva på datorn

Att skriva på datorn Att skriva på datorn Innehåll: Inledning 1 Tangentbordet 2 Att skriva i Word 4 Att skriva på Internet 7 Övningar 8 2 Inledning Välkommen till steg 2 av Internetkursen för nybörjare! Vid detta kurstillfälle

Läs mer

Använda Internet. med hjälp av Internet Explorer. Nybörjarguide

Använda Internet. med hjälp av Internet Explorer. Nybörjarguide Använda Internet med hjälp av Internet Explorer Nybörjarguide Av Carl Ewnert 1 Innehåll: 1. Introduktion 3 2. Utseendet 4 3. Verktygsfältet 4 4. Börja Surfa. 5 5. Att söka på Internet 5 6. Spara en sida

Läs mer

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv Datorlära 6 Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv 1 Arbeta med Strängar Strängar skapas med text inom citattecken, enkla eller dubbla.!>> str=

Läs mer

Manual. till. Cantor 2000. Madison Medri

Manual. till. Cantor 2000. Madison Medri Manual till Cantor 2000 Madison Medri 2 InnehÄllsfÅrteckning Installation Inledning Pedagogisk bakgrund Anpassning fär funktionshindrade Arbeta med Cantor 2000 InstÅllningar Namn Ljud Tangentbord Resultat

Läs mer

Microsoft Word. Lathund för. Innehåll. www.bit.mah.se/support. Autokorrigering. Autotext. Format

Microsoft Word. Lathund för. Innehåll. www.bit.mah.se/support. Autokorrigering. Autotext. Format Lathund för Microsoft Word Innehåll Autokorrigering 1 2 3 4 5 6 7 8 9 4 Format På denna rullgardinsmeny väljer du om du vill skriva brödtext, rubriker osv. Mycket bra verktyg om du arbetar med formatmallar.

Läs mer

Snabbstartsguide. Verktygsfältet Snabbåtkomst Kommandona här är alltid synliga. Högerklicka på ett kommando om du vill lägga till det här.

Snabbstartsguide. Verktygsfältet Snabbåtkomst Kommandona här är alltid synliga. Högerklicka på ett kommando om du vill lägga till det här. Snabbstartsguide Microsoft Word 2013 ser annorlunda ut jämfört med tidigare versioner, så vi har skapat den här guiden så att du så snabbt som möjligt ska komma igång. Verktygsfältet Snabbåtkomst Kommandona

Läs mer

Kapitel 1 Komma igång... 3

Kapitel 1 Komma igång... 3 2014.02.21 1 Kapitel Innehåll... Sida Kapitel 1 Komma igång... 3 Välkommen... 3 Är DDS-CAD Arkitekt installerat?... 5 Operativmiljön Windows... 5 Begrepp... 5 Starta DDS-CAD Arkitekt... 6 Starta ett nytt

Läs mer

Guide till att använda Audacity för uttalsövningar

Guide till att använda Audacity för uttalsövningar Guide till att använda Audacity för uttalsövningar Victoria Johansson Humlabbet, SOL-center, Lund IT-pedagog@sol.lu.se 28 mars 2006 1 Inledning Audacity är ett program som kan användas för att spela in

Läs mer

Dagens program. Programmeringsteknik och Matlab. Administrativt. Viktiga datum. Kort introduktion till matlab. Övningsgrupp 2 (Sal Q22/E32)

Dagens program. Programmeringsteknik och Matlab. Administrativt. Viktiga datum. Kort introduktion till matlab. Övningsgrupp 2 (Sal Q22/E32) Programmeringsteknik och Matlab Övning Dagens program Övningsgrupp 2 (Sal Q22/E2) Johannes Hjorth hjorth@nada.kth.se Rum 458 på plan 5 i D-huset 08-790 69 02 Kurshemsida: http://www.nada.kth.se/kurser/kth/2d2

Läs mer

SENIORER SENIORER. Grundläggande IT för. Windows 7. Grundläggande IT för. Windows 7. Eva Ansell Marianne Ahlgren. Eva Ansell Marianne Ahlgren

SENIORER SENIORER. Grundläggande IT för. Windows 7. Grundläggande IT för. Windows 7. Eva Ansell Marianne Ahlgren. Eva Ansell Marianne Ahlgren 600 IT för seniorer Windows 7.qxp 2011-06-0 10:27 Sida 1 Eva Ansell Marianne Ahlgren Eva Ansell Marianne Ahlgren Grundläggande IT för SENIORER Windows 7 Det här är en bok för dig som behöver grundläggande

Läs mer

Övning 1. Datateknik A, Java I, 5 poäng. Att ladda hem och installera Java Att skriva ditt första Javaprogram Att kompilera och exekvera ditt program

Övning 1. Datateknik A, Java I, 5 poäng. Att ladda hem och installera Java Att skriva ditt första Javaprogram Att kompilera och exekvera ditt program Datateknik A, Syfte: Att ladda hem och installera Java Att skriva ditt första Javaprogram Att kompilera och exekvera ditt program Att läsa: Lektion 1 Antal uppgifter: 3 Inlämning: Sker via inlämningsuppgifter

Läs mer

Dokumentation av rapportmall

Dokumentation av rapportmall Dokumentation av rapportmall Utgivningsår: 2003 Författare: Eva Erbenius Samhällsmedicin Centrum för Tillämpad Näringslära Box 175 33 Wollmar Yxkullsgatan 19 118 91 Stockholm Innehåll Inledning... 3 Rapportens

Läs mer

SF1546, Numeriska Metoder för O1 Lab0 - frivillig. (dvs uppgifterna behöver inte redovisas!)

SF1546, Numeriska Metoder för O1 Lab0 - frivillig. (dvs uppgifterna behöver inte redovisas!) SF1546, Numeriska Metoder för O1 Lab0 - frivillig. (dvs uppgifterna behöver inte redovisas!) Denna labb är tänkt att öva datorhantering och öva inledande Matlab. Eftersom förkunskaperna varierar finns

Läs mer

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic

Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic Labb i Datorsystemteknik och programvaruteknik Programmering av kalkylator i Visual Basic Inledning Starta Microsoft Visual Studio 2005. Välj create Project Välj VB + Vindows Application och välj ett nytt

Läs mer