Maplehandboken Carl-Gustav Werner Matematikcentrum Lunds universitet januari 2008 Figuren på omslaget är förstås gjord med Maple och föreställer en snäcka av släktet Oxystele. Matematiken bakom figuren beskrivs i ”Digital seashells” av M. B. Cortie i Computers & Graphics 17(1993):1, s. 79–84, som finns att ladda ner via ELIN på http://www.lub.lu.se/. Maplekod finns på http://www. maplesoft.com/applications/app_center_view.aspx?AID=452&CID=3&SCID= 40 (2008-01-28). Innehåll 1 Introduktion till Maple 1.1 Bakgrund . . . . . . . . . . . . . . . 1.2 Datorer och operativsystem . . . . . 1.3 Versioner av Maple . . . . . . . . . . 1.4 Att läsa vidare . . . . . . . . . . . . 1.5 Att starta Maple . . . . . . . . . . . 1.5.1 Windows . . . . . . . . . . . 1.5.2 linux (och andra UNIX:ar) . 1.6 Inmatning av matematisk uttryck . . 1.7 Aritmetiska uttryck . . . . . . . . . 1.8 Egna variabler . . . . . . . . . . . . 1.9 Manipulering av algebraiska uttryck 1.10 Egna funktioner . . . . . . . . . . . . 1.11 Gränsvärden . . . . . . . . . . . . . 1.12 Derivator . . . . . . . . . . . . . . . 1.13 Integraler och primitiva funktioner . 1.14 Summor . . . . . . . . . . . . . . . . 1.15 Ekvationer . . . . . . . . . . . . . . . 1.15.1 Allmänna ekvationer . . . . . 1.15.2 Olikheter . . . . . . . . . . . 1.15.3 Ekvationssystem . . . . . . . 1.15.4 Numerisk ekvationslösning . . 1.15.5 Heltalsekvationer . . . . . . . 1.15.6 Differentialekvationer . . . . 1.15.7 Differensekvationer . . . . . . 1.16 Serier . . . . . . . . . . . . . . . . . 1.17 Komplexa tal . . . . . . . . . . . . . 1.18 Att slippa komplexa tal . . . . . . . 1.19 Grafritning . . . . . . . . . . . . . . 1.19.1 Tvådimensionella grafer . . . 1.19.2 Tredimensionella grafer . . . 1.19.3 Andra grafer . . . . . . . . . 1.20 Hjälp . . . . . . . . . . . . . . . . . . 1.21 Fel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 5 5 6 6 6 6 6 6 7 9 10 11 12 13 14 15 16 16 17 17 17 18 18 19 19 20 21 22 22 27 27 28 29 2 Några större exempel 31 2.1 Anpassning av kurvor och lite modellering . . . . . . . . . . . . . 31 2.2 Optimering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3 INNEHÅLL 2.3 Differentialekvation . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Linjär algebra 3.1 Vektorer . . . . . . . . . . . . . . . . . . . . 3.1.1 Inmatning . . . . . . . . . . . . . . . 3.1.2 Vektorkommandon i Maple . . . . . 3.1.3 Geometriexempel . . . . . . . . . . . 3.1.4 Exempel med ortogonala vektorer . 3.1.5 Exempel med linjer i rummet . . . . 3.2 Matriser . . . . . . . . . . . . . . . . . . . . 3.2.1 Inmatning . . . . . . . . . . . . . . . 3.2.2 Matriskommandon i Maple . . . . . 3.2.3 Exempel med ortogonal matris . . . 3.2.4 Determinater . . . . . . . . . . . . . 3.2.5 Ekvationssystem . . . . . . . . . . . 3.2.6 Funktioner av matriser och vektorer 3.2.7 Lineära avbildningar . . . . . . . . . 3.2.8 Egenvärden och egenvektorer . . . . 3.2.9 Diagonalisering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 39 39 39 40 40 41 42 43 43 44 45 46 46 47 48 49 50 4 Att skriva dokument med formler 53 4.1 Inledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4.2 Dokumentläge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 4 Kapitel 1 Introduktion till Maple 1.1 Bakgrund Det finns två olika traditioner av datorprogram för matematik. Dels de som i huvudsak är inriktade på numeriska beräkningar, dels de som i huvudsak är inriktade på symboliska beräkningar. På senare tid har programmen från de olika kategorierna börjat närma sig varandra, men skillnaderna är fortfarande påtagliga. Maple tillhör den senare kategorin och är alltså bäst på symboliska beräkningar. Andra program för symboliska beräkningar är Derive, MathCAD, Reduce och Mathematica. Bland programmen för numeriska beräkningar kan nämnas Matlab och FreeMat. Förutom att räkna symboliskt kan Maple räkna numeriskt med godtyckligt många värdesiffror. Det är även möjligt att rita många olika slags figurer, både 2D och 3D. Alla funktioner är inte direkt tillgängliga i Maple, utan finns i separata tilläggspaket, t.ex. för lineär algebra, statistik eller geometri. Maple är tacksamt att arbeta interaktivt med — det fungerar i det närmaste som en avancerad räknedosa, men man kan även skriva program i Maple. Maple är duktigt på att räkna och gör säkert fel mer sällan än de flesta av oss, men naturligtvis ska man inte okritiskt utgå från att ett svar är korrekt bara för att det kommer från en dator. Det är alltid idé att kontrollera svaren på olika sätt, genom överslagsberäkningar, fysikaliska rimlighetsöverväganden, lösa problem på olika vis, sätta in svaret i urspungsproblemet, lösa specialfall numeriskt osv. 1.2 Datorer och operativsystem Maple finns tacksamt nog för de flesta av dagens datorer och operativsystem. Givetvis finns det för alla varianter av Windows, men även för MacOS och de flesta större UNIX-dialekter, däribland Linux och Solaris. När man väl har startat Maple ser det väsentligen likadant ut, oberoende av operativsystem och denna handledning bör därför gå att använda oberoende av aktuellt operativsystem. 5 KAPITEL 1. INTRODUKTION TILL MAPLE 1.3 Versioner av Maple Denna handledning är utarbetad för Maple version 9, men kan även användas för versionerna 5, 6, 7 eller 8. Den stämmer även väl överens med versionerna 10 och 11 då dessa körs i klassiskt läge (”Classic Worksheet”), och stämmer tillräckligt väl överens med dessa då de körs i ”Worksheet mode” för att vara användbar. Undantaget är kapitel 4, om dokumentskrivning. Det är utarbetat i version 11 och kräver ”Document mode” i version 10 eller 11. 1.4 Att läsa vidare På hemsidan för programmet, http://www.maplesoft.com/, finns mycket information. Tyvärr verkar det inte finnas någon aktuell och bra bok på svenska om Maple, men på engelska finns till exempel Maple by Example av Martha L. Abell och James P. Braselton, och A Short Course in Mathematical Methods with Maple av Henrik Aratyn och Constantin Rasinariu, båda från 2005. 1.5 1.5.1 Att starta Maple Windows Klicka på ikonen på skrivbordet som ser ut som ett lönnlöv och har en text som innehåller ordet ”Maple”. Finns där ingen, leta då på Start-knappen under Program och Maple. Där finns även ”Classic Worksheet”-varianten för de nyare versionerna av Maple. När fönstret kommit upp och prompten > syns, är Maple redo att börja räkna. 1.5.2 linux (och andra UNIX:ar) Eventuellt kan det finnas en ikon på skrivbordet, eller på något annat ställe där man brukar starta program. I ett terminalfönster går det emellertid alltid att starta med kommandot: > xmaple & När väl fönstret kommit upp och prompten > syns, är Maple redo att börja räkna. Observera att om man istället råkar skriva: > maple startas terminalversionen av Maple. Den kan också vara användbar, speciellt om man har för lite primärminne i datorn. Klassiskt läge startas däremot med: > maple -cw & 1.6 Inmatning av matematisk uttryck När Maple är redo att ta emot en inmatning syns en så kallad prompt längst till vänster: > Direkt efter den kan man skriva in matematiska uttryck och Maplekommandon, 6 1.7. ARITMETISKA UTTRYCK vilka ska avslutas med semikolon ”;” (eller möjligen med kolon ”:”, mer om det senare). Det är lätt att glömma, vi tar det en gång till: Alla inmatningar ska avslutas med semikolon ”;”. Ett enkelt exempel: > 3+12; 15 Notera att svaret skrivs med annat typsnitt och att det hamnar i mitten. Skriver man fel eller bara vill prova att ändra lite grand i det man har skrivit in, kan man gå tillbaka med piltangenterna eller med musen och ändra på det man skrivit. Sedan är det bara att trycka på enter/retur igen — man behöver inte ens ställa markören sist på raden. 1.7 Aritmetiska uttryck De grundläggande aritmetiska operatorerna, som plus, minus och lika med, fås självklart med sina respektive symboler så långt det är möjligt: Matematik x+y x−y xy x y xy x=y x 6= y x<y x6y x>y x>y Maple x+y x-y x*y x/y Förklaring addition subtraktion multiplikation division xˆy eller x**y x=y x<>y x<y x<=y x>y x>=y exponentiering lika med skilt från mindre än mindre än eller lika med större än större än eller lika med På samma sätt finns ett antal fördefinierade konstanter: Matematik π i ∞ Maple Pi I infinity true false Förklaring talet π =√ 3.141 . . . talet i = −1 oändlighet sant (i logiska uttryck) falskt (i logiska uttryck) Oerhört många funktioner finns definierade i Maple. Här följer de vanligaste: 7 KAPITEL 1. INTRODUKTION TILL MAPLE Matematik √ x √ n x ex ln x eller log x log10 x eller lg x sin x cos x tan x arcsin x arccos x arctan x |x| x! n k Maple sqrt(x) eller xˆ(1/2) root(x,n) eller surd(x,n)1 exp(x) ln(x) eller log(x) log10(x) sin(x) cos(x) tan(x) arcsin(x) arccos(x) arctan(x) abs(x) factorial(x) eller x! Förklaring kvadratrot n:te-rot exponentialfunktion naturlig logaritm tiologaritm sinus cosinus tangens arcus sinus arcus cosinus arcus tangens absolutbelopp fakultet binomial(n,k) binomialkoefficienter Med hjälp av dessa kan man använda Maple som en avancerad räknedosa. Några exempel: > 3*4/6; 2 > sin(Pi/2); 1 Observera att Maple om möjligt svarar med exakta uttryck: > 8/12+sqrt(2); 2 √ + 2 3 Vill man ha svaret på numerisk form kan man antingen använda kommandot evalf, eller skriva något av de ingående talen som ett decimaltal, dvs ta med en decimalpunkt: > evalf(8/12+sqrt(2)); 2.080880229 > 8/12+sqrt(2.0); 2.080880229 Maple svarar normalt med 10 värdesiffror. Vill göra en viss beräkning med t.ex. 25 siffror istället, kan man i kommandot evalf ange detta: > evalf(8/12+sqrt(2), 25); 2.080880229039761715468356 1 root 8 och surd ger inte alltid samma svar. Prova exv. att beräkna √ 3 −8. 1.8. EGNA VARIABLER 1.8 Egna variabler När man gjort en beräkning i Maple är det ganska ofta som man vill utnyttja svaret från denna i nästa beräkning. Istället för att skriva av svaret, med risk för att skriva fel, finns det två andra sätt att göra detta, som är bättre: 1. Direkt hänvisa till föregående eller förrföregående resultat med %, respektive %%: > 60*60*24; 86400 > %*365; 31536000 2. Lagra undan resultatet i en variabel: > s:=60*60*24; s := 86400 > s*365; 31536000 Ska man använda resultatet flera gånger är givetvis metoden med variabeln att föredra, men även annars är det ofta enklare att hålla reda på vad man gjort om man definierar en variabel. Observera att namnet på variabeln får innehålla både stora och små bokstäver, siffror samt understreck. I exemplet ovan hade s istället kunnat heta t.ex. SekunderPerDygn eller sekunder_per_dygn. Vill man göra flera inmatningar efter varandra kan man spara plats genom att skriva dem efter varandra, på samma rad: > a:=3; b:=6.75; c:=2.83; a := 3 b := 6.75 c := 2.83 I sådana här fall, där man inte är intresserad av resultatet av ”beräkningen”, kan det dessutom vara lämpligt att använda kolon istället för semikolon: > a:=3: b:=6.75: c:=2.83: eftersom man då helt slipper utskrifterna. Detta bör dock användas med försiktighet. Många felaktigheter upptäcks mycket lättare om man använder semikolon, så att man kan se hur Maple har tolkat inmatningen. 9 KAPITEL 1. INTRODUKTION TILL MAPLE När man definierat en variabel ligger värdet kvar tills man ändrar det eller tills man stänger Maple. Detta kan ibland ställa till problem, se vidare i avsnitt 1.21, och man kan då behöva av definiera en variabel: > s:=’s’; s := s 1.9 Manipulering av algebraiska uttryck Skriver man in ett algebraiskt uttyck som innehåller fria variabler, svarar Maple med att skriva ut samma uttryck — lite snyggare och kanske något förenklat: > 2*(x+y)*(x+y)/(x-y); 2 (x + y)2 x−y Vill man ha mer kontroll över vad Maple ska göra med uttrycket kan man använda något eller några av följande kommandon: Maple expand(u) factor(u) normal(u) simplify(u) collect(u,x) combine(u,f) Förklaring utvecklar uttrycket u faktoriserar u förenklar u förenklar u samlar ihop termer i u med avseende på variabeln x samlar ihop ingående funktioner f till en För att illustrera skillnaderna krävs ett något mer komplicerat uttryck. Eftersom samma uttryck ska användas flera gånger är det lämpligt att spara undan det i en variabel: > a:=2*(x+y)*(x+y)/(x-y)+(x+y)/(x-y)ˆ2; 2 a := 2 (x + y) x+y + 2 x−y (x − y) > simplify(a); 2 x3 + 2 x2 y − 2 xy 2 − 2 y 3 + x + y (x − y) 2 > factor(a); (x + y) 2 x2 + 1 − 2 y 2 (x − y) 10 2 1.10. EGNA FUNKTIONER > expand(a); 2 x2 xy y2 x y +4 +2 + + 2 2 x−y x−y x − y (x − y) (x − y) I vissa fall kan dessa förenklingskommandon vara användbara också för sifferuttryck: > (sqrt(5)-1)ˆ2/(sqrt(5)-3); √ 2 5−1 √ 5−3 Här kan vi passa på att använda % för att hänvisa till föregående svar: > simplify(%); √ 2 5−1 √ 5−3 Där hände inte så mycket. Istället kan vi försöka med factor. Då kan vi använda % en gång till. Egentligen var det ju svaret innan som skulle förenklas, vilket kan nås med %%, men eftersom svaren var lika går det lika bra vilket som: > factor(%); −2 Konstigt nog är factor oftast bättre än simplify på just den här typen av förenklingar. 1.10 Egna funktioner Ofta har man en given funktion som man ska undersöka och arbeta vidare med på något vis. Då kan det vara behändigt att spara den i en variabel. Detta kan göras på två olika sätt i Maple. Dels kan man lägga in själva funktionsuttrycket i en variabel, exv: > f:=x+2/(x*x+2*x); f := x + 2 x2 + 2 x men oftast har man mer glädje av att definiera den som en funktion i Maple: > g:=x->x+2/(x*x+2*x); g := x → x + 2 x2 + 2 x Lägg märke till skillnaderna i syntaxen, och att ”avbildningspilen” skrivs in som ett minustecken följt av ett större-än-tecken. 11 KAPITEL 1. INTRODUKTION TILL MAPLE De flesta saker går att göra både med uttryck och med funktioner, men vissa är betydligt enklare med funktioner. Jämför hur man beräknar uttryckets respektive funktionens värde för ett visst x-värde: > eval(f, x=1); 5 3 > g(1); 5 3 Det går att omvandla från uttryck till funktion: > unapply(f, x); x→x+ 2 x2 + 2 x och från funktion till uttryck: > g(x); x+ x2 2 + 2x Observera dock att det inte går att skriva så här om man vill definiera en funktion: > h(x):=x+2/(x*x+2*x); h(x) := x + 2 x2 + 2 x Tyvärr ger Maple inget felmeddelande, men ”h” blir i alla fall inte definierad som en funktion. 1.11 Gränsvärden Gränsvärden för uttryck i en variabel hanteras i Maple av ett kommando som helt logiskt heter limit. Det kan hantera både egentliga och oegentliga gränsvärden. Nedan beräknas i tur och ordning: lim x→0 sin x , x lim ex och lim x→∞ > limit(sin(x)/x, x=0); 1 12 x→0 1 x 1.12. DERIVATOR > limit(exp(x), x=infinity); ∞ > limit(1/x, x=0); undefined I det sista exemplet ovan är gränsvärdet odefinierat därför att höger- och vänstergränsvärdena är olika. Genom att istället be om bara ett av dem kan Maple svara: > limit(1/x, x=0, left); −∞ På motsvarande sätt anger man väljaren right, om man vill ha högergränsvärdet. Tyvärr saknar Maple kommando för gränsvärdesberäkningar av uttryck i flera variabler. 1.12 Derivator Derivatan av uttrycket x5 − x + 2 beräknas så här: > diff(xˆ5-x+2, x); 5 x4 − 1 Man kan beräkna derivator av högre ordning genom att fylla på med argument vid anropet av diff. För att derivera tre gånger med avseende på x skriver man > diff(xˆ5-x+2, x, x, x); 60 x2 eller > diff(xˆ5-x+2, x$3); 60 x2 (Skrivsättet x$3 betyder att en lista med 3 element ska genereras och att varje element ska vara x.) Uttryck i flera variabler kan man också derivera med avseende på flera variabler. Här beräknar vi en partiell andraderivata genom att derivera först med avseende på x och sedan med avseende på y: > diff(xˆ2*yˆ3-2*x, x, y); 6 x y2 13 KAPITEL 1. INTRODUKTION TILL MAPLE Om man istället för uttrycket ovan, x5 − x + 2, vill derivera motsvarande funktion, f = x → x5 − x + 2, gör man på följande vis: > D(x->xˆ5-x+2); x → 5 x4 − 1 eller, om man först definierar f som funktionen: > f:=x->xˆ5-x+2; f := x → x5 − x + 2 > D(f); x → 5 x4 − 1 För att derivera tre gånger kan man göra antingen så här: > D(D(D(f))); x → 60 x2 eller använda följande märkliga skrivsätt: > (D@@3)(f); x → 60 x2 Eftersom man i de här fallen (när man använder D) får en funktion som resultat, kan man direkt beräkna derivatans värde för ett visst x-värde. T ex fås f 0 (7) med: > D(f)(7); 12004 1.13 Integraler och primitiva funktioner Primitiva funktioner beräknas med kommandot int. En primitiv funktion till R 2x + sin x, eller med andra ord, den obestämda integralen (2x + sin x) dx blir alltså: > int(2*x+sin(x), x); x2 − cos(x) Notera att konstanten C som brukar finnas med i tabeller och som ska finnas med i svaren på eventuella tentamensuppgifter inte kommer med här. 14 1.14. SUMMOR Man kan kontrollera svaret genom att derivera och se om det ursprungliga funktionsuttrycket kommer tillbaka: > diff(%, x); 2 x + sin(x) Observera att int i likhet med diff arbetar med uttryck. Det finns inget kommando för att beräkna primitiva funktioner som i likhet med D arbetar med funktioner. Bestämda integraler, Rdvs integraler som beräknas över ett intervall, beräk2 nas också med int. T ex 0 x2 dx: > int(xˆ2, x=0..2); 8 3 Gränserna fårR lov att vara oändligheten, vilken ju skrivs som infinity. En klas2 ∞ sisk integral, −∞ e−x dx, som inte är helt enkel att beräkna för hand, får tjäna som exempel: > int(exp(-xˆ2), x=-infinity..infinity); √ π 1.14 Summor För beräkning av summor finns ett kommando sum, som fungerar heltP analogt 3 med int för integraler. Summan 1 + 2 + 3 kan med summatecken skrivas k=1 k, vilket i Maple blir: > sum(k, k=1..3); 6 Variabeln, här k, är givetvis helt godtycklig. Ett något mer avancerat exempel, 1 + 21 + 14 + 18 + · · · kan skrivas så här med summatecken: ∞ X 1 2i i=0 och beräknas i Maple: > sum(1/2ˆi, i=0..infinity); 2 15 KAPITEL 1. INTRODUKTION TILL MAPLE 1.15 Ekvationer Maple kan lösa många typer av ekvationer och det finns några olika kommandon att hålla reda på för de olika typerna: Maple solve fsolve isolve dsolve rsolve 1.15.1 Förklaring löser allmänna ekvationer löser ekvationer numeriskt löser heltalsekvationer löser differentialekvationer löser differensekvationer Allmänna ekvationer En enkel andragradsekvation blir bra att börja med, x2 − 4x + 3 = 0. Det fullständiga sättet att skriva in den på är: > solve(xˆ2-4*x+3=0, x); 1, 3 varvid Maple hittar de två rötterna 1 och 3. Om högerledet är lika med 0 behöver man emellertid inte ange detta: > solve(xˆ2-4*x+3, x); 1, 3 I de fall ekvationen dessutom bara innehåller en variabel (i det här fallet x) behöver man inte ange den heller (vilket man däremot måste när det gäller t.ex. kommandot diff): > solve(xˆ2-4*x+3); 1, 3 Ibland vill man kanske att svaret ska skrivas lite tydligare, vad är det som är 1, 3 egentligen? Då kan man sätta x inom mängdklammer: > solve(xˆ2-4*x+3=0, {x}); {x = 1} , {x = 3} Har man flera variabler måste man ange vilken variabel man vill lösa ut. Säg att vi vill lösa ut x ur yx + xy = 5: > solve(y*x+x/y=5, x); 5 16 y2 y +1 1.15. EKVATIONER 1.15.2 Olikheter Har man en olikhet fungerar solve precis likadant för det: > solve(xˆ2-4*x+3<0); RealRange(Open(1), Open(3)) Svaret kanske ser konstigt ut, men det betyder helt enkelt ”reellt intervall från 1 till 3, och som är öppet i båda ändar”. Man hade ju hellre velat ha svaret som 1 < x < 3 eller som ]1..3[. Lite bättre blir det med mängdklamrar kring x:et: > solve(xˆ2-4*x+3<0, {x}); {x < 3, 1 < x} 1.15.3 Ekvationssystem Har man två (eller fler) ekvationer klarar solve det också. Ekvationerna: 3x + 2y = 16 2x − y = −1 löses så här (notera att ekvationerna måste skrivas inom mängdklamrar): > solve({3*x+2*y=16, 2*x-y=-1}); {y = 5, x = 2} På motsvarande sätt som för ekvationer kan man ha system av olikheter. 1.15.4 Numerisk ekvationslösning De flesta ekvationer går inte att lösa exakt, och då svarar Maple antingen ingenting alls, eller med en ganska meningslös omskrivning av ursprungsekvationen: > solve(3*sin(x)=log(x)); RootOf(_Z − e3 sin(_Z) ) Istället kan man då försöka lösa ekvationen numeriskt, med fsolve: > fsolve(3*sin(x)=log(x)); 2.792247796 Oftast nöjer sig fsolve med att skriva ut den första lösningen den hittar. Här kan man väl misstänka att det borde finnas någon lösning för lite större x-värden också. Då kan man låta fsolve leta i t ex intervallet 3 < x < 10: > fsolve(3*sin(x)=log(x), x=3..10); 6.988241068 17 KAPITEL 1. INTRODUKTION TILL MAPLE Titta, en till lösning! Men det kan finnas ännu fler. Att säkert avgöra om man har hittat alla lösningar är i det generella fallet ett mycket svårt problem, både för människor och för datorprogram. I praktiken kan man dock ganska enkelt hitta de flesta lösningar till de flesta envariabelekvationer genom att rita deras graf, se vidare i avsnitt 1.19.1. 1.15.5 Heltalsekvationer Heltalsekvationer eller Diofantiska ekvationer löses med isolve. Hitta t ex heltalslösningar till x2 + y 2 = 8: > isolve(xˆ2+yˆ2=8); {y = 2, x = 2} , {x = −2, y = −2} , {x = −2, y = 2} , {y = −2, x = 2} Vi kan också ta en som saknar lösning: > isolve(2*x+2*y=5); Då skriver alltså Maple inte ut något alls! Med en liten ändring får den istället oändligt många lösningar: > isolve(2*x+2*y=6); {x = 3 − _Z1 , y = _Z1 } Svaret ser konstigare ut än vad det är. Eftersom ekvationen har oändligt många lösningar är det enklast att uttrycka dessa med hjälp av en parameter. Här har Maple använt en parameter med det märkliga namnet _Z1. Vill man att den ska heta t ex k istället går emellertid det också bra: > isolve(2*x+2*y=6, k); {x = 3 − k, y = k} 1.15.6 Differentialekvationer Differentialekvationer och system av sådana löses med dsolve. En enkel, av första ordningen, y 0 + 2y = 5, utan begynnelsevärden: > dsolve(D(y)(x)+2*y(x)=5); y(x) = 5/2 + e−2 x _C1 Istället för D(y)(x) kan man skriva diff(y(x),x) för att uttrycka y 0 . Den obestämda konstanten som brukar heta C och hamna framför ex heter här _C1, och har dessutom hamnat sist. Man kan givetvis lägga in begynnelsevärden, säg y(1) = 3. Tyvärr blir syntaxen lite krångligare då; då måste man ange vilken funktion man vill lösa ut (y(x) i det här fallet) även om man bara har en: > dsolve({D(y)(x)+2*y(x)=5, y(1)=3}, y(x)); y(x) = 18 5 1 e−2 x + 2 2 e−2 1.16. SERIER 1.15.7 Differensekvationer Differensekvationer eller rekursionsekvationer kan Maple också lösa. Kommandot heter rsolve och syntaxen är snarlik den för dsolve. Nedan visas hur en sluten formel för fibonaccitalen räknas fram. Fibonaccitalen (1, 1, 2, 3, 5, 8, 13, 21, . . .) kan definieras av följande samband: F (k) = F (k − 1) + F (k − 2), F (0) = 1, F (1) = 1 Begynnelsevärdena skrivs tillsammans med differensekvationen inom klammerparenteser: > rsolve({F(k)=F(k-1)+F(k-2), F(0)=1, F(1)=1}, F(k)); k k √ 2√ 1 1 √ 5 2 5 −2 √ 2 5 −1 + 5+1 √ 5 √ + 5 −1 + 5 5+1 Svaret kan tyvärr inte förenklas i någon väsentlig omfattning. 1.16 Serier Taylor- (och Maclaurin-) utvecklingar görs i Maple med kommandot taylor. För att t.ex. serieutveckla ex kring origo med en restterm av ordningen 5 skriver man: > taylor(exp(x), x, 5); 1 1 1 1 + x + x2 + x3 + x4 + O x5 2 6 24 Anger man ingen storlek på resttermen blir den 6. Ska funktionsuttrycket utvecklas kring en annan punkt än origo, anger man det i det andra argumentet, se exemplet som följer. Här utvecklas funktionen f (x) = ln x arctan(2x − 2) − 2(x − 1)2 kring punkten x = 1, med restterm av ordningen 6: > f:=x->ln(x)*arctan(2*x-2)-2*(x-1)ˆ2: > taylor(f(x), x=1); 3 4 − (x − 1) − 2 (x − 1) + 5 5 6 (x − 1) + O (x − 1) 6 Resttermen som står på slutet gör att man inte direkt kan använda resultatet för att utföra någon beräkning. På något vis måste man plocka bort den först; enklast görs det på följande vis (fortsättning på förregående beräkning): > convert(%, polynom); 3 4 − (x − 1) − 2 (x − 1) + 5 5 (x − 1) 6 19 KAPITEL 1. INTRODUKTION TILL MAPLE Vilket sedan t.ex. kan omvandlas till en funktion på vanligt vis: > g:=unapply(%, x); 3 4 g := x → − (x − 1) − 2 (x − 1) + 5 5 (x − 1) 6 Istället för kommandot taylor kan man använda kommandot series. Finns det en Taylorutveckling ger de samma resultat, men series är generellare och kan även utveckla funktioner som saknar Taylorserier (i s.k. Laurentserier). 1.17 Komplexa tal Enklare uttryck med komplexa tal räknar Maple med på samma sätt som vanliga tal. Det gäller bara att komma ihåg att den imaginära enheten betecknas med stora I, istället för lilla i. Exempel: > (3+5*I)*(1+I); −2 + 8I De speciella operatorer som vanligen används på komplexa tal, finns förstås i Maple: Matematik <z eller Rez =z eller Imz |z| arg z z Maple Re(z) Im(z) abs(z) argument(z) conjugate(z) polar(z) polar(r, t) Förklaring realdel imaginärdel belopp argument konjugat omvandla till polärform ange på polär form De flesta ”vanliga” reella funktioner kan även utvidgas till att vara definierade på de komplexa talen. Maple räknar med detta också, men visar inte alltid svaren på komplex form. Vill man beräkna ett uttryck som innehåller funktioner av komplexa tal måste man ibland använda evalc (jämför evalf): > sqrt(1+I); √ 1+I > evalc(%); 1 2 q 2+2 √ 2+ 1 I 2 q −2 + 2 √ 2 Med kommandot polar kan man skriva komplexa tal på polär form: > polar(1+I); polar 20 √ 2, π 4 1.18. ATT SLIPPA KOMPLEXA TAL Och då framgår ju tydligare vad som hände i förra exemplet (att argumentet halveras och roten dras ur beloppet): > simplify(polar(sqrt(1+I))); ! 1 π polar 2 4 , 8 Har man talet på polär form kan man beräkna dess kartesiska motsvarighet med hjälp av evalc: > polar(1, 3*Pi/4); 3 polar 1, π 4 > evalc(%); − 1.18 1 √ 1√ 2+ I 2 2 2 Att slippa komplexa tal Som nämnts i förra kapitlet görs alla beräkningar i Maple normalt över de komplexa talen. Det gör att man i vissa fall får ut svar på beräkningar som man kanske tycker saknar lösning. Exempel: > solve(sin(x)+3=0); − arcsin(3) Här syns det inte att svaret är komplext, men det får man fram med evalc: > evalc(%); √ 1 − ∗ π + I ∗ ln(3 + 2 ∗ 2) 2 Eller får man kanske komplexa lösningar där bara man är intresserad av de reella: > solve(xˆ4-18+7*xˆ2+xˆ3+9*x=0, {x}); {x = 1}, {x = −2}, {x = 3 ∗ I}, {x = −3 ∗ I} För att slippa alla komplex svar kan man istället låta Maple göra beräkningar över de reella talen. Det finns ett tilläggspaket, RealDomain, där de vanligaste funktionerna i Maple definieras om till att bara räkna med reella tal: > with(RealDomain); 21 KAPITEL 1. INTRODUKTION TILL MAPLE [=, <, `ˆ`, arccos, arccosh, arccot, arccoth, arccsc, arccsch, arcsec, arcsech, arcsin, arcsinh, arctan, arctanh, cos, cosh, cot, coth, csc, csch, eval, exp, expand, limit, ln, log, sec, sech, signum, simplif y, sin, sinh, solve, sqrt, surd, tan, tanh] Fast normalt skriver man kanske hellre > with(RealDomain): med kolon istället för semikolon, så slipper man listan på omdefinierade kommandon. Med RealDomain inläst blir de tidigare beräkningarna istället: > solve(sin(x)+3=0); dvs. inget svar alls (jämför exemplet på s. 17). Medan fjärdegradsekvationen ger väntat resultat: > solve(xˆ4-18+7*xˆ2+xˆ3+9*x=0, {x}); {x = 1}, {x = −2} dvs. de reella rötterna. 1.19 1.19.1 Grafritning Tvådimensionella grafer Det viktigaste kommandot när det gäller grafritning heter plot. Ett enkelt exempel: > plot(sin(x), x); 1 0.5 –10 –8 –6 –4 –2 0 2 4 x 6 8 10 –0.5 –1 Man måste ange vilken variabel som ska variera (här x). Om man inte anger något intervall för grafen blir det -10..10. Oftast vill man nog själv ange ett — vilket görs med den vanliga syntaxen för intervall: > plot(sin(x), x=0..2*Pi); 22 1.19. GRAFRITNING 1 0.5 0 1 2 3 x 4 5 6 –0.5 –1 Maple väljer själv ett lämpligt intervall för y-axeln. Blir man inte nöjd med det, kan man själv specificera även detta: > plot(sin(x), x=1..2.1, y=0.9..1.01); 1 0.98 0.96 y 0.94 0.92 0.9 1 1.2 1.4 x1.6 1.8 2 Vill man rita flera grafer i samma figur skriver man de olika funktionsuttrycken inom hakparenteser, med kommatecken mellan dem: > plot([sin(x), cos(x)], x=0..2*Pi); 1 0.5 0 1 2 3 x 4 5 6 –0.5 –1 Om grafen inte är sammanhängande ritar oftast Maple dit en linje i alla fall: > plot(1/(1-x), x=-3..5, y=-4..4); 23 KAPITEL 1. INTRODUKTION TILL MAPLE 4 3 y2 1 –3 –2 –1 0 1 2 x 3 4 5 –1 –2 –3 –4 Det är alltså inte asymptoten som har markerats i figuren ovan. Den extra linjen kan man slippa om man talar om att Maple ska leta efter diskontinuiteter: > plot(1/(1-x), x=-3..5, y=-4..4, discont=true); 4 3 y2 1 –3 –2 –1 0 1 2 x 3 4 5 –1 –2 –3 –4 Ska man skriva ut grafen på papper i svart tryck, blir det oftast snyggare om man ritar grafen i svart från början: > plot(sin(x), x=0..2*Pi, color=black); 1 0.5 0 1 2 3 x 4 5 6 –0.5 –1 När Maple ska rita grafen till en kurva beräknas funktionens värde i ett antal punkter, lämpligt valda, varefter räta linjesegment dras mellan de beräknade punkterna. Istället för att rita dessa linjer, kan man låta Maple markera bara de beräknade punkterna: 24 1.19. GRAFRITNING > plot(sin(x), x=0..2*Pi, color=black, style=point); 1 0.5 0 1 2 3 x 4 5 6 –0.5 –1 Detta är annars mest lämpligt att använda om man istället för en kontinuerlig funktion har diskreta datapunkter. Här kommer därför lite autentiska mätdata2 : dag mätarställning 19 842.97 25 845.66 47 853.28 63 858.94 75 862.96 Dessa kan ritas upp med följande kommando: > plot([[19, 842.97], [25, 845.66], [47, 853.28], [63, 858.94], > [75, 862.96]], dag=10..80, mätarställning=840..870, style=point, > symbol=circle, color=black); 870 865 860 g 855 850 845 840 10 20 30 40 dag 50 60 70 80 Notera att punkerna här markeras med små cirklar genom att symbol=circle anges, samt att åäö inte alltid fungerar. Mätdata i en graf är som gjorda för att anpassa en kurva till. Här ser det väl ut som en linje y = 0.3x + 840 skulle passa ganska bra till punkterna. För att rita punkterna och linjen i samma graf anger man både punktmängden och uttrycket för linjen inom hakparenteser, samt anger style=[point, line] (eller style=[line, point], beroende på vilken ordning de kommer i). Med så mycket att hålla reda på blir det lätt lite stökigt; det blir lättare om man lägger in mätadata i en variabel först: > data:=[[19, 842.97], [25, 845.66], [47, 853.28], [63, 858.94],[75, 862.96]]; 2 Några avläsningar av författarens vattenmätare för början av år 1995. 25 KAPITEL 1. INTRODUKTION TILL MAPLE data := [[19, 842.97], [25, 845.66], [47, 853.28], [63, 858.94], [75, 862.96]] > plot([data,0.3*dag+840], dag=10..80, mätarställning=840..870, > style=[point,line], symbol=circle, color=black); 870 865 860 g 855 850 845 840 10 20 30 40 dag 50 60 70 80 Har man flera kurvor och ritar alla i svart kan det vara svårt att hålla isär dem. Då kan man välja att rita någon av dem prickad eller streckad genom att använda väljaren linestyle, och sätta den lika med SOLID, DOT, DASH eller DASHDOT (OBS, stora bokstäver). Man kan dessutom skriva en förklarande text i figuren till varje kurva med väljaren legend. Exempel: > plot([sin(x), cos(x)], x=0..2*Pi, color=black, linestyle=[SOLID, DOT], > legend=[¨f=sin(x)¨, ¨f’=cos(x)¨]); 1 0.5 0 1 2 3 x 4 5 6 –0.5 –1 Legend f=sin(x) f’=cos(x) Förutom de ovan använda: discont, color, style, symbol, linestyle och legend, finns många fler så kallade väljare (eng. options)3 till plot-kommandot. Mer om detta kan man hitta i den inbyggda hjälpen, se vidare i avsnitt 1.20. Dessutom kan man välja bland många olika inställningar genom att klicka i figuren med höger musknapp. 3 Konstig översättning av ”options”? Det är i alla fall den som Svenska datatermgruppen rekomenderar, se http://www.nada.kth.se/dataterm/rek.htm. 26 1.19. GRAFRITNING 1.19.2 Tredimensionella grafer Kommandot plot kan användas för många olika typer av grafer, men om man vill rita upp en funktionsyta i rummet måste man istället använda plot3d. Följande kod ritar upp en enkel sadelyta: > plot3d(xˆ2-yˆ2, x=-2..2, y=-2..2); Bilden ovan är dock ritad med följande kommando, för att det ska snyggare ut i svart/vitt tryck: > plot3d(xˆ2-yˆ2, x=-2..2, y=-2..2, style=hidden, > color=black, orientation=[65,65]); Observera att man kan vrida på figuren genom att klicka och dra med musen. Liksom för 2D-grafer kan man klicka med högerknappen i figuren och välja bland en mängd olika inställningar som påverkar grafens utseende. 1.19.3 Andra grafer Maple har många andra kommandon för att rita olika typer av grafer. Ett till ska visas här. Om man har komplexa tal och vill rita ut dem i det komplexa talplanet kan man använda complexplot. Det är inte direkt tillgängligt, utan man måste först läsa in paketet plots genom att skriva: > with(plots): Om man avslutar med semikolon istället för med kolon som ovan, får man ut en lång lista på plotkommandon som nu är tillgängliga. För att få några komplexa tal att rita ut kan man t.ex. lösa ekvationen z 7 = 1 och lägga in de sju rötterna i en lista: > zz:=[solve(zˆ7=1)]; [1, cos(2/7 π) + I sin(2/7 π), − cos(3/7 π) + I sin(3/7 π), − cos(1/7 π) + I sin(1/7 π), − cos(1/7 π) + −I sin(1/7 π), − cos(3/7 π) + −I sin(3/7 π), cos(2/7 π) + −I sin(2/7 π)] vilka sedan kan ritas ut: > complexplot(zz, x=-1..1, color=black, style=point, > symbol=circle, scaling=constrained); 27 KAPITEL 1. INTRODUKTION TILL MAPLE 1 0.5 –1–0.8 –0.4 0.2 0.4 0.6 0.8 1 x –0.5 –1 Väljaren scaling=constrained anger att skalan på x- respektive y-axeln ska vara lika, vilket är synnerligen lämpligt att ha i det här fallet. 1.20 Hjälp Det här häftet beskriver bara grunderna i Maple. Behöver man veta mer måste man antingen leta upp någon utförlig bok eller manual, eller använda sig av den inbyggda hjälpen. Här följer därför några tips om hur man kan använda den inbyggda hjälpen. Säg att man använder sig av ett visst kommando, t ex plot, och att man vill veta lite mer om hur det fungerar, t ex om det går att lägga in en titel i figuren. Då är det enklast att skriva som ett kommando: > help(plot); varvid ett nytt fönster dyker upp inuti Maple-fönstret med en massa information om plot-kommandot. Oftast är början, där parametrarna listas, och slutet, där exemplen står, av störst intresse. Här hittar vi dock inget om att sätta ut en titel i figuren. Faktiskt beskrivs inga alls av väljarna, men en bit ner står: Remaining arguments are interpreted as options which are specified as equations of the form option = value. In particular, the style option allows one to plot the points as points only, or to interpolate them using line mode. See plot[options] for more information. Genom att klicka på ”plot[options]” kommer man vidare till ett hjälpfönster där det bl a finns en beskrivning av väljaren ”title”. För att gå tillbaka till fönstret med arbetsbladet i, klicka på menyn Windows och välj det fönster som heter Unnamed(1) (eller möjligen Unnamed(2)). Alternativt kan man stänga hjälpfönstret, så kommer fönstret med arbetsbladet i fram. Om man inte vet vad kommandot heter som man ska använda är det lättare att klicka på menyn Help och välja Topic Search. . . 28 1.21. FEL 1.21 Fel Ibland begriper inte Maple vad man har skrivit. Då får man mer eller mindre svårbegripliga felmeddelanden, eller inget alls. Några exempel: > solve(3xˆ2+5*x=3, x); Error, missing operator or ‘;‘ Dessutom blinkar markören mellan 3:an och x:et. ”Missing operator” betyder att en operator saknas, i det här fallet multiplikationstecknet. Alltså skriver man bara in ett sådant — markören står ju på rätt plats — och trycker på return/enter. > solve(3*(x+2=0, x); Error, ‘;‘ unexpected Här tycker Maple att semikolonet kommer oväntat. Den inte helt självklara orsaken är att det saknas en högerparentes någonstans, i det här fallet rimligen mellan 2:an och =-tecknet. Antag att variabeln x först har fått ett värde någonstans: > x:=3; x := 3 Längre ner, när man har glömt att x har ett värde, kanske man vill derivera lite: > diff(x*x, x); Error, wrong number (or type) of parameters in function diff Men som synes går det inte särskilt bra. Då har man tre saker att välja på. 1. Avdefiniera x: > x:=’x’; x := x > diff(x*x, x); 2x 2. Använda en annan variabel: > diff(y*y, y); 2y 29 KAPITEL 1. INTRODUKTION TILL MAPLE 3. Skriva x:et inom apostrofer: > diff(’x’*’x’, ’x’); 2x Även många andra operationer, förutom derivering, kan ge märkliga felmeddelanden eller konstiga resultat när en variabel har blivit tilldelad ett värde. Jämför nedanstående med exemplet i avsnitt 1.8: > s=60*60*24; s = 86400 > s*365; 365s Inga felmeddelanden, och svaret stämmer i och för sig, men varför har inte s*365 beräknats? Felet är att det står = istället för := på raden där s skulle tilldelats sitt värde. Det vanligaste felet många gör är förstås att glömma semikolonet på slutet — men det behöver väl knappast ett eget exempel. 30 Kapitel 2 Några större exempel 2.1 Anpassning av kurvor och lite modellering Scenario: en fysiklaboration där fritt fall studeras. En stålkula släpps intill en lång linjal med tydlig gradering. Uppställningen belyses av ett stroboskop som blinkar 20 gånger per sekund. Fallet fotograferas och kulans läge kan avläsas vid några tidpunkter. Precis i början kommer bilderna av kulan väldigt tätt, varför inga tydliga avläsningar kan göras förrän en bit ner. Den första tydliga avläsningen anses då ha inträffat vid t = 0. Följande mätdata har erhållits: tid [s] läge [m] 0.0 0.13 0.05 0.15 0.10 0.20 0.15 0.27 0.20 0.38 0.25 0.49 0.30 0.65 Med dessa mätvärden kan man göra mycket. T.ex. anpassa en kurva till dem, rita upp mätpunkterna, rita upp den anpassade kurvan och dessutom få ut ett värde på tyngdkraftsaccelerationen, g. För att förenkla hanteringen är det lämpligt att först lägga in alla data i en variabel: > data:=[[ 0.0, 0.13], [ 0.050, 0.15], [ 0.10, 0.20], [ 0.15, 0.27], > [ 0.20, 0.37], [ 0.25, 0.49], [ 0.30, 0.64]]: För att se hur det ser ut kan man börja med att rita upp mätdata: > plot(data, style=point, symbol=circle, color=black); 0.6 0.5 0.4 0.3 0.2 0 0.05 0.1 0.15 0.2 0.25 0.3 31 KAPITEL 2. NÅGRA STÖRRE EXEMPEL Formeln för fritt fall bör vara bekant, oftast skrivs den som s= gt2 2 där s är den tillryggalagda sträckan i [m], g är tyngdaccelerationen i [m/s2 ] och t är tiden i [s]. För att anpass en kurva till mätdata med hjälp av Maple kan man göra på flera olika sätt. Dels kan man själv justera parametrar, rita, justera, rita osv, dels kan man låta Maple hitta det bästa valet av paramentervärden för den givna kurvan. I det senare fallet kan man antingen själv explicit ställa upp uttryck som Maple optimerar, eller enklast använda kommandot fit. Fördelen med att prova sig fram är att man kan göra det med godtyckliga uttryck för kurvan; kommandot fit kräver däremot att uttrycket är linjärt i de obekanta parametrarna. I övriga avseenden är det givetvis enklare och snabbare att använda kommandot fit, vilket visas i exemplet nedan. Kommandot fit ligger i statistikpaketet, varför man först måste skriva: > with(stats): Syntaxen för fit är ganska omständlig, varför man gärna bör läsa mer om det i den inbyggda hjälpen. Bland annat vill fit ha mätdata ”på andra hållet”, inte parvis, utan första koordinaten (här t) för sig och andra koordinaten (här s) för sig. I det aktuella exemplet är det inte mer data än att man kan skriva om det för hand, men man kan också låta Maple sköta omflyttningen: > fitdata:=[[data[i][1]$i=1..7], [data[i][2]$i=1..7]]; f itdata := [[0.0, 0.05000000000, 0.1000000000, 0.1500000000, 0.2000000000, 0.2500000000, 0.3000000000], [0.1300000000, 0.1500000000, 0.2000000000, 0.2700000000, 0.3700000000, 0.4900000000, 0.6400000000]] Nu kan en kurva anpassas till mätdata. > fit[leastsquare[[t, s], s=g*tˆ2/2]](fitdata); s = 7.840000000 ∗ t2 För att kunna ritas upp, behöver svaret omvandlas till en Maple-funktion: > sf1:=unapply(rhs(%), t); sf 1 := t → 7.840000000 ∗ t2 (Kommandot rhs plockar ut högerledet av en ekvation, ”right hand side”. Det finns även lhs.) Nu kan man rita både den anpassade kurvan och mätdata i samma figur: > plot([sf1(t),data],t=-0.1..0.3,style=[line,point],symbol=circle,color=black); 32 2.1. ANPASSNING AV KURVOR OCH LITE MODELLERING 0.7 0.6 0.5 0.4 0.3 0.2 0.1 –0.1 0 0.1 t 0.2 0.3 Det ser emellertid väldigt dåligt ut. Läs nu inte vidare meddetsamma, utan tänk först efter: vad kan orsaken vara och vad kan man göra åt problemet? Felet är att den använda formeln förutsätter att vid tidpunkten 0 ska både hastigheten och sträckan också vara 0, vilket de ju inte var i det här fallet. Man kan i princip rädda den använda modellen genom att förskjuta alla sträckorna och alla tiderna i mätdatatabellen, så att de blir vad de skulle varit om linjalen kunde hållits så att läget var 0 där kulan släpptes och tiden var 0 när kulan släpptes. Det går, men att göra det genom att prova sig fram är svårt. Enklare och bättre är att låta modellen ta hand om det hela genom att ersätta t och s med t − t0 respektive s − s0 , där t0 och s0 är tiden respektive avståndet från kulans verkliga startpunkt till nollpunkten i mätdata: s − s0 = g(t − t0 )2 2 Eller så kan man använda den mer generella formeln för fritt fall, som förhoppningsvis är bekant den också: s = s0 + v0 t + gt2 2 där s0 är läget i [m] vid tiden 0 och v0 är hastighten i [m/s] vid tiden 0. Här använder vi den generella formeln. Lägg märke till att ekvationen fortfarande är linjär i de alla de obekanta parametrarna, och att alltså fit fortfarande kan användas. > fit[leastsquare[[t, s], s=s0+v0*t+g*tˆ2/2]](fitdata1); s = .1259523810 + .3428571429 ∗ t + 4.476190476 ∗ t2 På samma sätt som första gången är det lämpligt att omvandla svaret till en Maple-funktion: > sf2:=unapply(rhs(%), t); sf 2 := t → .1259523810 + .3428571429 ∗ t + 4.476190476 ∗ t2 Vilken kan ritas upp tillsammans med mätdata: > plot([sf2(t),data1],t=-0.1..0.3,style=[line,point],symbol=circle,color=black); 33 KAPITEL 2. NÅGRA STÖRRE EXEMPEL 0.6 0.5 0.4 0.3 0.2 –0.1 0 0.1 t 0.2 0.3 Detta ser betydligt bättre ut. Man kan nu enkelt få ut ett numeriskt värde på tyngdaccelerationen, g. Egentligen är det bara att plocka ut siffrorna framför t2 , identifiera dem med g/2 och alltså g = 2 × 4.476190476. Lite snyggare är det kanske att utnyttja att funktionen sf 2 beskriver läget som funktion av tiden. Då fås accelerationen som andraderivatan: > (D@@2)(sf2); 8.952380952 Att det inte stämmer bättre överens med det vanliga värdet, g = 9, 81 kan förstås inte skyllas på Maple. 2.2 Optimering Tre meter framför en hög mur står ett 2 meter högt plank. Hur lång måste en stege vara för att nå från marken, över planket och fram till muren? Marken antas vara vågrät; muren och planket antas vara lodräta.1 En figur är nödvändig för att få överblick över problemet. Den går tyvär inte så bra att göra i Maple. l y 2 3 x Med beteckningar enligt figuren är då stegens längd p l = x2 + y 2 1 Övning 34 4.29,Övningar till Analys i en variabel, Lund, 1994 2.2. OPTIMERING Likformiga trianglar ger dessutom x−3 x = 2 y Det är stegens längd som är det viktiga. Den definierar vi som en variabel: > l:=sqrt(xˆ2+yˆ2); l := p x2 + y 2 Från det andra sambandet kan man sedan antingen lösa ut x eller y. Eftersom det bara förekommer ett y men två x kan man gissa att det blir ett enklare uttryck om man löser ut y: > (x-3)/2=x/y; x x−3 = 2 y > solve(%, y); 2 x x−3 Detta sätter vi in i l istället för y, och lagrar resultatet i en ny variabel, som kan få heta lx: > lx:=eval(l, y=%); s lx := x2 + 4x2 (x − 3)2 Sedan kan man minimera lx genom att derivera uttrycket för lx, sätta derivatan lika med noll och lösa ekvationen, antingen en sak i taget, eller som här, allt på en gång: > solve(diff(lx, x)=0); 1 12 3 ! 1 1 + 3, − 12 3 2 ! 1 1 √ + I 3 12 3 2 ! 1 1 + 3, − 12 3 2 ! 1 1 √ − I 3 12 3 2 ! +3 Som synes har ekvationen ett reellt och två komplexa nollställen. De senare kan man bortse ifrån här (stegen kan bara ha en reell längd). Det är enkelt att plocka ut den första av de tre lösningarna, men man kan istället lösa ekvationen i ”RealDomain” (se s.21) och helt slippa de komplexa lösningarna: > RealDomain[solve](diff(lx, x)=0); 1 12 3 ! +3 Av den ursprungliga formuleringen av problemet framgår att det finns något 35 KAPITEL 2. NÅGRA STÖRRE EXEMPEL minimum och att det inte finns några ändpunkter på intervallet som kan ställa till det (när x går mot 3 eller y går mot 2 går stegens längd mot ∞ — se figuren). Minimum antas alltså säkert i derivatans enda reella nollställe. Slutligen kan man se hur lång stegen måste vara: > eval(lx, x=%); v 2 2 u ! ! ! 1 1 1 u u u 12 3 + 3 + 1 12 3 + 3 12 3 t 3 Vilket kan förenklas lite grand: > simplify(%); s 2 3 12 3 ! 1 + 9 12 3 ! + 13 Observera att Maple inte skriver ut multiplikationstecknen i svaret, inte ens 2 mellan siffror. Första termen under rottecknet ovan betyder alltså 3 · 12 3 . Det kan ju även vara intressant att få svaret på decimalform: > evalf(%); 7.023482378 2.3 Differentialekvation Det är vinter, −10◦ C utomhus, inomhus är det behagliga 20◦ C. Men så stannar värmepannan! Efter 2 timmar har temperaturen inomhus sjunkit till 15◦ C. Hur kallt är det inomhus ett dygn efter att pannan stannade om utomhustemperaturen ligger kvar på −10◦ C hela tiden? Det är rimligt att anta att temperatursänkningen per tidsenhet är proportionell mot skillnaden mellan inom- och utomhustemperaturen. Uttryckt i formler blir ovanstående: dT = k(−10 − T (t)) dt T (0) = 20 T (2) = 15 T (24) = ? Differentialekvationer löses i Maple med dsolve. Förutom själva ekvationen kan man även ange begynnelsevärden. Då skulle man alltså i det här fallet vilja skriva: > dsolve({diff(T(t), t)=k*(-10-T(t)), T(0)=20, T(2)=15}, T(t)); 36 2.3. DIFFERENTIALEKVATION Tyvärr går inte det. Maple hittar inga lösningar. Till en första ordningens differentialekvation kan man bara ha ett begynnelsevärde. Det andra villkoret som behövs för att bestämma konstanten k får man ta hand om separat. Vilket av villkoren, T (0) = 20 eller T (2) = 15 man väljer att ta med som begynnelsevärde spelar givetvis ingen roll för svaret, men T (0) = 20 känns väl naturligast: > dsolve({diff(T(t), t)=k*(-10-T(t)), T(0)=20}, T(t)); T(t) = −10 + 30e(−kt) Lägg märke till att T inte har definierats som funktionen ovan. Detta kan emellertid vara lämpligt att göra: > T:=unapply(rhs(%), t); T := t → −10 + 30e(−kt) Nu kan man bestämma k genom att ställa upp ekvationen T (2) = 15 och lösa den med avseende på k: > k:=solve(T(2)=15, k); 1 k := − ln 2 5 6 När alla konstanter är bestämda kan man beräkna temperaturen efter ett dygn, dvs vid t = 24, exakt och numeriskt: > T(24), evalf(T(24)); − 2407267435 , 362797056 −6.635300356 Observera att om man gör på det här viset, definierar både k och T , ser det väldigt snyggt ut — så länge man gör rätt från början. Går man emellertid tillbaka och löser differentialekvationen igen (eventuellt efter att ha ändrat lite i den) kommer Maple att protestera: > dsolve({diff(T(t), t)=k*(-10-T(t)), T(0)=20}, T(t)); Error, (in sdsolve/info) required an indication of the dependent variables in the given system Vilket i princip betyder att eftersom T redan har ett värde är det inte någon differentialekvation som står som argument till dsolve. Vill man experimentera mer måste man istället antingen avdefiniera (se avsnitt 1.8) k och T för varje gång eller använda olika variabler i de olika momenten. För att få överblick av vad man har gjort är det sedan aldrig fel att rita en snygg figur: > plot([T(t), -10, [[0, T(0)], [2, T(2)], [24, T(24)]]], t=0..25, T=-12..20, > style=[line, line, point], symbol=circle, color=black, > labels=["t [timmar]", "T [grader C]"]); 37 KAPITEL 2. NÅGRA STÖRRE EXEMPEL 20 15 T [grader C] 10 5 0 –5 –10 38 5 10 15 t [timmar] 20 25 Kapitel 3 Linjär algebra Maple har endast få funktioner för att arbeta med matriser och vektorer som är direkt tillgängliga. Däremot finns två olika tilläggspaket som innehåller desto mer. Dels ett äldre linalg och dels ett nyare LinearAlgebra. Här kommer bara LinearAlgebra-paketet att beskrivas. Det är bättre i de flesta avseenden; framför allt är det mera logiskt att använda. För att alla kommandona som beskrivs nedan ska fungera krävs alltså att man först har gjort > with(LinearAlgebra): Istället för kolon kan man skriva ett semikolon på slutet, varvid den långa listan med alla kommandon som blir tillgängliga skrivs ut. 3.1 3.1.1 Vektorer Inmatning Vektorer skapas med kommandot Vector. Nedan visas exempel på de grundläggande sätten att använda det, vilka egentligen är fullt tillräckliga. Tittar man däremot i Maples inbyggda hjälp hittar man väldigt många fler sätt som man kan använda det på; en del kan vara praktiska i vissa fall, men det är lätt att röra till det med dem. Så här kan man skapa en vektor med 3 element, alla 1:or och lagra den i variabeln v1: > v1:=Vector(3, 1); 1 v1 := 1 1 Observera att vektorn ”står upp”, det blir en kolonnvektor. Vill man istället ha en radvektor går det också. Här görs en radvektor med 5 element, alla 2:or: > v2:=Vector[row](5, 2); 39 KAPITEL 3. LINJÄR ALGEBRA v2 := [2, 2, 2, 2, 2] Om inte alla elementen ska vara lika räknar man upp dem inom hakparenteser: > v3:=Vector[row]([2, 3, 5, 7, 11]); v3 := [2, 3, 5, 7, 11] När väl vektorn är definierad kan man komma åt delar av den genom att ange index för elementen man vill åt: > v4:=v3[2]*v3[3..5]; v4 := [15, 21, 33] 3.1.2 Vektorkommandon i Maple De operatorer som vanligen används på vektorer, finns förstås i Maple: Matematik u+v u−v sv u · v eller (u | v) u×v |v| vt Maple u+v; u-v; s*v; DotProduct(u,v); CrossProduct(u,v); Norm(v,2); Transpose(v); map(f,v); Förklaring addition subtraktion multiplikation med skalär1 skalärprodukt vektorprodukt längd av vektor transponat (omvandlar mellan rad- och kolonnvektor) Applicera funktionen f på alla elementen i vektorn v. Operatorerna + och − är givetvis bara definierade om de båda vektorerna har lika många element, men de måste även vara ”på samma håll”; dvs antingen måste båda vara radvektorer eller måste båda vara kolonnvektorer. 3.1.3 Geometriexempel Bestäm avståndet mellan linjerna L1 och L2 i ett positivt orienterat ON-system. L1 går genom punkterna (1, 1, 1) och (4, 5, 3), medan L2 går genom punkterna (−1, −10, −1) och (8, 2, 2) 2 . Börja med att definiera v1 och v2 som riktningsvektorer för respektive linjer: > v1:=Vector[row]([4, 5, 3] - [1, 1, 1]); v1 := [3, 4, 2] 1 Om skalären, s, är en fri variabel utför inte Maple multiplikationen. Då måste man istället använda kommandot ScalarMultiply(v,s); 2 Exempel 4, kapitel 4, Lineär algebra, K. G. Andersson, 2000 40 3.1. VEKTORER > v2:=Vector[row]([8, 2, 2] - [-1, -10, -1]); v2 := [9, 12, 3] Beräkna en vektor som är ortogonal mot dessa: > ort:=CrossProduct(v1, v2); ort := [−12, 9, 0] Bilda en normaliserad vektor, e, av denna3 : > e:=1/Norm(ort, 2)*ort; 4 3 e := − , , 0 5 5 Bilda en vektor P Q från en godycklig punkt P på linjen L1 till en godtycklig punkt Q på linjen L2 : > PQ:=Vector[row]([8, 2, 2] - [1, 1, 1]); P Q := [7, 1, 1] Avståndet blir då lika med absolutbeloppet av skalärprodukten mellan e och P Q: > abs(DotProduct(PQ, e)); 5 3.1.4 Exempel med ortogonala vektorer Låt e1 = (2, 1, 0, 1), e2 = (0, 2, 1, −2) och w = (1, 2, 1, 2). Visa att e1 och e2 är ortogonala och bestäm sedan talen s1 och s2 så att vektorn s1 e1 + s2 e2 + w blir ortogonal mot både e1 och e2 4 . Börja med att definiera vektorerna: > e1:=Vector[row]([2, 1, 0, 1]); e1 := [2, 1, 0, 1] > e2:=Vector[row]([0, 2, 1, -2]); e2 := [0, 2, 1, −2] 3 Det finns även ett kommando Normalize just för att normalisera vektorer, med vars hjälp man istället kunde skrivit raden i exemplet som e:=Normalize(ort, Euclidean); 4 Exempel 4, kapitel 7, Lineär algebra, K. G. Andersson, 2000 41 KAPITEL 3. LINJÄR ALGEBRA > w:=Vector[row]([1, 2, 1, 2]); w := [1, 2, 1, 2] Om e1 och e2 är ortogonala är deras skalärprodukt noll: > DotProduct(e1, e2); 0 De är alltså ortogonala. Sätt nu u = s1 e1 + s2 e2 + w: > u:=ScalarMultiply(e1,s1)+ScalarMultiply(e2,s2)+w; u := [2 s1 + 1, s1 + 2 s2 + 2, s2 + 1, s1 − 2 s2 + 2] Observera att ScalarMultiply(e1,s1) används istället för bara s1*e1 eftersom Maple inte vet om att s1 är en skalär. Nu kan man ställa upp ekvationssystemet med de två skalärprodukterna och låta Maple lösa det: > solve({DotProduct(u, e1)=0, DotProduct(u, e2)=0}); 1 s2 = − , s1 = −1 9 3.1.5 Exempel med linjer i rummet Skär linjerna x = −2 + 3t L1 : y = 5 − t z = 3 − 5t x = 11 − t L2 : y = −2 + t z = −4 − 2t varandra? Och i så fall, i vilken punkt? I Maple hanterar man linjer på parameterform enkelt genom att låta högerleden utgöra elementen i en Vector: > L1:=Vector([-2+3*t,5-t,3-5*t]); −2 + 3t L1 := 5 − t 3 − 5t > L2:=Vector([11-s,-2+s,-4-2*s]); 11 − s L2 := −2 + s −4 − 2s 42 3.2. MATRISER Observera att parametern måste ha olika namn i de två linjerna. Att linjerna skär varandra är ekvivalent med att det överbestämda ekvationssystemet L1 = L2 har en lösning. I Maple visar det sig dock vara enklare att skriva ekvationerna som L1 − L2 = 0 där högerledet kan utelämnas (jämför avsnitt 1.15.1): > L1-L2; −13 + 3t + s 7−t−s 7 − 5t + 2s Då kommandot solve kräver att ekvationerna ska utgöra en mängd (eng. set), kan man inte lösa ekvationerna direkt, utan man måste först konvertera dem till en mängd: > convert(%, set); {−13 + 3t + s, 7 − t − s, 7 − 5t + 2s} varefter man kan lösa ekvationssystemet (med det underförstådda högerledet som är lika med noll): > solve(%); {t = 3, s = 4} Skärningspunkten kan sedan bestämmas genom att sätta t = 3 i L1 , eller s = 4 i L2 ; detta kan enkelt göras med eval (jämför beräkning av uttrycks värde på sidan 12): > eval(L1, %); 7 2 −12 3.2 3.2.1 Matriser Inmatning Matriser skapas med kommandot Matrix. Syntaxen är snarlik motsvarande för Vector. En kvadratisk 3 × 3 nollmatris åstadkoms enklast så här: > Matrix(3); 0 0 0 0 0 0 0 0 0 43 KAPITEL 3. LINJÄR ALGEBRA En 2 × 3 matris full med 8:or görs så här: > Matrix(2, 3, 8); " 8 8 8 8 8 8 # Det mer användbara fallet, när man själv anger alla värdena blir som följer. Notera de dubbla hakparenteserna: > A:=Matrix([[1, 2], [3, 4]]); " A := 1 2 3 4 # När väl matrisen är definierad kan man på samma sätt som för vektorer komma åt delar av den genom att ange index för elementen i fråga: > A[2, 2]*A[2, 1..2]; [12, 16] 3.2.2 Matriskommandon i Maple Liksom för vektorer finns de operatorer som vanligen används på matriser definierade i Maple: Matematik A+B A−B sA AB At A−1 I eller E det A eller D(A) trA Maple A+B; A-B; s*A; A.B; Transpose(A); Aˆ(-1); IdentityMatrix(n); NullSpace(A); Rank(A); LinearSolve(A, b); QRDecomposition(A); Determinant(A); Trace(A); Eigenvalues(A); Eigenvectors(A); map(f, A); Förklaring addition subtraktion multiplikation med skalär5 matrisprodukt transponat matrisinvers enhetsmatris (av ordningen n) nollrum rang lös matrisekvationen Ax = b QR-faktorisering determinant spår egenvärden egenvektorer och egenvärden Applicera funktionen f på alla elementen i matrisen A. Det finns väldigt många fler funktioner och operatorer på matriser i Maple. Leta i den inbyggda hjälpen på LinearAlgebra för att få reda på mer. 5 Om skalären, s, är en fri variabel utför inte Maple multiplikationen. Då måste man istället använda kommandot ScalarMultiply(A,s); 44 3.2. MATRISER 3.2.3 Exempel med ortogonal matris Bestäm talen a, b och c så att matrisen 2 6 1 3 2 7 6 a b c 2 blir ortogonal6 . Börja med att definiera matrisen: > Q:=1/7*Matrix([[2, 6, b], [3, 2, c], [6, a, 2]]); 2 6 1 b 7 7 7 3 2 1 Q := c 7 7 7 6 1 2 a 7 7 7 Det enklaste sättet att formulera kravet på att en matris Q är ortogonal är att likheten Q t Q = E (eller QQ t = E ) ska vara uppfylld. Så kan man skriva den i Maple också, men det visar sig att det blir mycket enklare om man gör på samma sätt som i avsnitt 3.1.5, dvs ser till att högerledet blir noll, så att det inte behöver anges: > Q.Transpose(Q)-IdentityMatrix(3); 9 1 2 18 1 − + b + bc 49 49 49 49 18 1 36 1 2 + bc − + c 49 49 49 49 12 6 2 18 2 2 + a+ b + a+ c 49 49 49 49 49 49 12 6 2 + a+ b 49 49 49 18 2 2 + a+ c 49 49 49 9 1 2 − + a 49 49 Även fortsättningen görs på samma sätt som i avsnitt 3.1.5: > convert(%, set); 1 12 6 2 18 2 2 9 1 2 36 1 2 9 1 2 18 + bc, + a+ b, + a+ c, − + b ,− + c ,− + a 49 49 49 49 49 49 49 49 49 49 49 49 49 49 > solve(%); {a = −3, c = −6, b = 3} > eval(Q, %); 6 Övning 7, kapitel 7, Lineär algebra, K. G. Andersson, 2000 45 KAPITEL 3. LINJÄR ALGEBRA 2 7 3 7 6 6 7 −6 7 2 7 2 7 −3 7 7 3.2.4 3 7 Determinater Determinanter beräknas med kommandot Determinant. Genom att definiera två matriser: > A:=Matrix([[1, 2], [3, 4]]); " A := 1 2 3 4 2 4 6 8 # > B:=Matrix([[2, 4], [6, 8]]); " B := # och beräkna några determinanter kan man troliggöra (inte bevisa) en känd räknelag: > Determinant(A); Determinant(B); Determinant(A.B); −2 −8 16 3.2.5 Ekvationssystem Ekvationssystem av typen Ax = b kan man lösa genom att bilda A−1 b. (Matrisen A står kvar från exemplet ovan.): > b:=Vector([5, 7]); b := " # 5 7 > Aˆ(-1).b; " −3 4 46 # 3.2. MATRISER Man kan även använda ett av Maples speciella kommandon (det finns flera) för att lösa ekvationssystem: > LinearSolve(A, b); " −3 # 4 I enkla fall som här spelar det ingen roll vilken metod man använder. LinearSolve är emellertid snabbare, vilket kan ha betydelse för stora matriser, men framför allt klarar det en del specialfall som inte går att lösa med matrisinvers (vad händer när det A = 0 ?). 3.2.6 Funktioner av matriser och vektorer Vissa kommandon och funktioner för reella tal är även definierade för matriser och vektorer. T.ex. evalf: > C:=Pi*Matrix([[-1/2, 5/6], [5/6, -1/2]]); 1 5 π − π 6 2 5 1 π − π 6 2 > evalf(C); −1.570796327 2.617993878 2.617993878 −1.570796327 Om man däremot vill ta t.ex. sinus av alla elementen i en matris eller vektor måste man använda kommandot map: > map(sin, C); 1 2 −1 −1 1 2 Dessutom finns kommandon för att beräkna ”riktiga” matrisfunktioner: Matematik eA Ax f (A) Maple MatrixExponential(A); MatrixPower(A, x); MatrixFunction(A, f(x), x); Förklaring exponentialmatris matrisupphöjning allmän matrisfunktion Med samma matris C som ovan kan exempelvis sin C beräknas (för att spara plats är det lika bra att förenkla den direkt): > simplify(MatrixFunction(C, sin(x), x)); √ 1 3 0 2 1√ 0 3 2 47 KAPITEL 3. LINJÄR ALGEBRA 3.2.7 Lineära avbildningar Med hjälp av Maple kan man illustrera vad som händer vid lineära avbildningar. För att det ska synas vad avbildningen gör är det lämpligt att arbeta med ett enkelt, men osymetriskt objekt. Här kommer ett ”L” med hörn i punkten (1, 1) och ändpunkter i (1, 3) respektive (2, 1) att användas. För att det ska gå lätt att multiplicera med avbildningsmatriser läggs punkternas koordinater som kolonnerna i en matris: > L:=Matrix([[1, 1, 2], [3, 1, 1]]); 1 1 L := 3 1 2 1 Kommandot plot kräver däremot att koordinaterna ligger i en lista av listor, varför matrisen först måste omvandlas till en sådan: > l:=convert(Transpose(L), listlist); l := [[1, 3], [1, 1], [2, 1]] innan det går att rita upp ”L”-et: > plot(l, x=-4..4, y=-4..4, scaling=constrained, color=black); 4 3 y2 1 –4 –3 –2 –1 0 –1 1 2 x 3 4 –2 –3 –4 En lämplig avbildning att illustrera är rotation kring origo. Istället för att direkt bilda en rotationsmatris för en viss vinkel, kan det vara enklare att först definiera en allmän rotationsmatris i form av en funktion: > Rot:=v->Matrix([[cos(v), -sin(v)], [sin(v), cos(v)]]); Rot := v− > M atrix([[cos(v), −sin(v)], [sin(v), cos(v)]]) varefter det är enkelt att bilda en rotationsmatris för en viss vinkel: > R:=Rot(Pi/6); 48 3.2. MATRISER 1√ 2 R := 1 2 3 1 2 1√ 3 2 − Nu kan själva avbildningen utföras genom att multiplicera rotationsmatrisen med punktkoordinatmatrisen: Lr:=R.L; 1√ 3− 3 2 2 Lr := 1 3√ + 3 2 2 1√ 1 3− 2 2 1 2 1√ 1+ 3 2 √ 1 1√ + 3 2 2 3− Slutligen kan resultatet omvandlas till listform och ritas upp: lr:=convert(Transpose(Lr), listlist); √ 3 1 3√ 1√ 1 1 1√ 1 1√ 1√ 3− , + 3 , 3− , + 3 , 3 − ,1 + 3 lr := 2 2 2 2 2 2 2 2 2 2 > plot(lr, x=-4..4, y=-4..4, scaling=constrained, color=black); 4 3 y2 1 –4 –3 –2 –1 0 –1 1 2 x 3 4 –2 –3 –4 3.2.8 Egenvärden och egenvektorer > A:=Matrix([[3, -1, 0], [-1, 2, -1], [0, -1, 3]]); 3 −1 0 −1 2 −1 0 −1 3 49 KAPITEL 3. LINJÄR ALGEBRA Egenvärdeskommandot gör vad man förväntar sig: > Eigenvalues(A); 3 1 4 Egenvektorkommandot ger däremot både egenvärdena och egenvektorerna. För att kunna arbeta vidare med dem är det därför lämpligt att lägga in egenvektorerna och egenvärdena i två olika variabler, λ respektive T : > (lambda, T):=Eigenvectors(A); 1 3 λ, T := 1 , 0 −1 4 1 1 2 −1 1 1 Observera att egenvektorerna hamnar som kolonnerna i matrisen. Enligt definitionen på egenvärden och egenvektorer ska ju λe = Ae. Det kan enkelt kontrolleras; här för första egenvärdet och motsvarande egenvektor: > e1:=T[1..3, 1]; 1 0 e1 := −1 > lambda[1]*e1; 3 0 −3 > A.e1; 3 0 −3 3.2.9 Diagonalisering För en matris A som kan diagonaliseras består ju den diagonaliserande matrisen T s kolonner av egenvektorerna till A, vilket ju precis är vad Maples kommando 50 3.2. MATRISER för egenvektorsberäkning returnerar. Med A och T enligt exemplet ovan diagonaliseras A enligt: > R:=Tˆ(-1).A.T; 3 R := 0 0 0 0 0 4 1 0 där som synes egenvärdena hamnar som diagonalelement. (Den diagonala matrisen kan inte heta D i Maple; D betyder derivationsoperatorn.) Den diagonaliserade matrisen kan utnyttjas t.ex. för att beräkna mer avancerade funktioner av matriser. Som exempel beräknas nedan en matris B som √ uppfyller B 2 = A (dvs i någon mening A). Inför först en matris S som uppfyller S 2 = R. Den beräknas enkelt genom att dra roten ur diagonalelementen i matrisen R: > S:=map(sqrt, R); √ S := 3 0 0 1 0 0 0 0 2 Eftersom det är enklast så beräknas här roten ur alla elementen, istället för bara av diagonalelementen. Om man istället har en funktion där f (0) 6= 0 eller som inte är definierad för 0, måste man se till att funktionen bara appliceras på just diagonalelementen. Matrisen B fås sedan som B = T ST −1 : > B:=T.S.Tˆ(-1); B := 1√ 5 3+ 2 6 − − 1 3 1√ 5 3+ 2 6 − 1 3 4 3 − 1 3 5 1√ 3+ 2 6 1 − 3 1√ 5 3+ 2 6 − Genom att bilda B 2 kan man kontrollera att det stämmer: > Bˆ2; 2 2 5 5 1√ 1 1√ 3 + 3 + + + − 2 6 9 2 6 −1 1√ 5 1√ 5 1 2 3+ − 3+ + 2 6 2 6 9 −1 2 5 1√ 3+ 2 6 2 −1 −1 5 1√ 1 3+ − + 2 6 9 1√ 5 3+ 2 6 2 2 1 1√ 5 + + − 3+ 9 2 6 51 KAPITEL 3. LINJÄR ALGEBRA Detta ser kanske inte riktigt ut som matrisen A, men om man förenklar7 : > simplify(%); 3 −1 −1 0 2 −1 0 −1 3 ser man att B 2 = A. Man kan givetvis också jämföra med vad MatrixPower eller MatrixFunction ger för resultat: > simplify(MatrixPower(A, 1/2)); 1√ 5 1 2 3 + 6 −3 1 4 − 3 3 5 1√ 1 − 3 − 6 2 3 5 1√ 3 − 6 2 1 − 3 √ 1 5 3+ 2 6 7 I äldre versioner av Maple kan man behöva ange elementvis förenkling genom att skriva map(simplify,%); istället. 52 Kapitel 4 Att skriva dokument med formler 4.1 Inledning En inte oväsentlig del av arbetet när man arbetar mer seriöst med matematik kommer när man ska renskriva sina resultat. Det görs med fördel på dator, och traditionellt har man använt ordbehandlare som även gått att skriva matematik med. I Microsoft Word finns ett litet inbyggt tilläggsprogram som heter Microsoft Equation där man kan klicka fram formler. På motsvarande sätt finns ett tilläggsprogram i OpenOffice Writer. Vid många matematikinstitutioner används istället LATEX, som är ett kraftfullare men ålderdomligare system, där man skriver styrkoder istället för att klicka sig fram. Från och med version 10 av Maple kan man emellertid även använda Maple för att skriva dokument med matematisk text. Att kombinera olika funktioner i samma program är inte enbart positivt; risken finns att man tvingas kompromissa så att programmet inte blir bra på någon av funktionerna. Maples dokumentläge är dock fullt användbart både för beräkning och åtminstone för enklare rapportskrivning. 4.2 Dokumentläge När man startar Maple får man kanske en fråga om man vill starta i ”Worksheet Mode” eller ”Dokument Mode”. Får man inte det kan man istället klicka på menyn File och först välja New och sedan Dokument mode. Liksom i ”Worksheet Mode” har man ett stort vitt fält att arbeta i. När man skriver kan man dels skriva i textläge (”Text mode”) och dels i matematikläge (”Math mode”). Markören visar vilket läge som gäller genom att vara lutande ”/” i matematikläge och rak ”|” i textläge. Man växlar mellan text- och matematikläge genom att klicka på knappen F5 på tangentbordet, eller genom att klicka på Text respektive Math i Maple. Textläget fungerar som en enkel ordbehandlare, man kan välja typsnitt, textstorlek, höger- och vänsterjustera m.m. Det är ganska enkelt att använda och kommer inte att beskrivas mer här. Matematikläget kan dels fungera som bara ett formelskrivningsprogram, som 53 KAPITEL 4. ATT SKRIVA DOKUMENT MED FORMLER Microsoft Equation, dels kan man utföra beräkningar i Maple. När man ska skriva formler kan man dels skriva in dem som R man är van från Maple, dels klicka sig fram. Om man till exempel vill skriva xdx kan man i matematikläget skriva int(x,x) och sedan markera formeln med musen och klicka på den högerknappen, välja 2-D Math längs ner på menyn, och sedan Convert To och till sist 2-D Math. Alternativt kan man leta fram integraltecknet under Expession-menyn i vänsterkanten och klicka på det. Om man inte nöjer sig med att skriva formler, utan även vill låta Maple räkna på dem, finns det återigen två olika sätt att göra det på. Man placerar markören i formeln och sedan trycker man antingen på enter/retur eller på Ctrl=.1 I det första fallet kommer resultatet mitt på en egen rad (som i vanliga Maple), i det andra fallet kommer resultatet direkt efter formeln, på samma rad, med ett =-tecken emellan. Om inte Ctrl-= fungerar kan man istället klicka på Edit-menyn och välja Evaluate and Display Inline. Ibland vill man inte skriva ut exakt hela beräkningen, utan uttrycka vissa R saker med ord. Istället för xdx = 12 x2 kanske man vill skriva ”integralen av x är 21 x2 plus en konstant”. Detta går också att göra. Skriv in x i matematikläge, klicka med högerknappen på x:et och välj Integrate och sedan x. Då står det integrate w.r.t. x x −−−−−−−−−−−→ 21 x2 . Pilen med text över kan man ta bort och ersätta med ”är”; sedan kan man fylla på med resten av texten före och efter formlerna. Som synes finns det ganska mycket att välja på när man klickar med högerknappen på en formel. 1 På ett svenskt tangentbord innebär det alltså att man först trycker ned den nere, sedan 54 , och håller den också nere, och till sist . , och håller 4.2. DOKUMENTLÄGE Observera att om man ändrar i formeln man skrivit in ändras inte Maples beräkning av den automatiskt. Det finns emellertid flera sätt att få Maple att göra om beräkningen; ett sätt är att markera formeln (formlerna) och lite text före och efter själva formeln med musen, klicka med höger musknapp på det markerade och välja Execute och sedan Selection. Väljer man istället Worksheet räknas alla formler om i hela arbetsbladet. 55