Maplehandboken - Matematikcentrum

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