PDF-format
PDF-format
PDF-format
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
Indhold<br />
Noter om Maple<br />
KVL, Databehandling forår 2005<br />
Morten Larsen<br />
1 Indledning 1<br />
2 Arbejdsark 2<br />
3 Maples hjælpefunktion 3<br />
4 Indtastning af udtryk 3<br />
5 Forklarende tekster 4<br />
6 Pakker 4<br />
7 Regning med Maple 5<br />
8 Symbolsk beregning, differentiering og integration 7<br />
9 Grænseovergange 8<br />
10 Tildelinger - bundne og ubundne navne 9<br />
11 Funktioner 11<br />
12 Sekvenser, lister og mængder 12<br />
13 Tabeller 15<br />
14 Simplifikation og manipulation af udtryk 16<br />
15 Løsning af ligninger 19<br />
16 Løsning af differentialligninger 22<br />
17 Lidt lineær algebra 23<br />
18 Grafer for funktioner 28<br />
19 Lidt om at arbejde med data 35<br />
20 Oversigt over Maple til husbehov 39<br />
1 Indledning<br />
Disse noter er en indføring i brug af programmet Maple, nærmere bestemt Maple version 9. Noterne introducerer dels<br />
de grundlæggende begreber i Maple og giver anvisning på den basale brug af systemet og dels omhandler de hvordan<br />
man kan bruge Maple til at løse forskellige problemer af matematisk karakter, for eksempel løsning af ligninger,<br />
forsimpling af matematiske udtryk samt tegning af grafer for matematiske funktioner. Det berøres også kortfattet<br />
hvordan man kan benytte Maple til at importere og analysere numeriske data.<br />
1
2<br />
Maple er et computer algebra system, dvs. et system der kan lave algebraisk manipulation. Maple er også et system<br />
til symbolsk beregning, dvs. at det kan regne symbolsk frem for numerisk. Hvad dette faktisk betyder vil fremgå af<br />
det følgende, men først er det nødvendigt med en introduktion til den helt grundlæggende brug af Maple.<br />
2 Arbejdsark<br />
Man udfører sit arbejde i Maple i et arbejdsark (worksheet). I et arbejdsark kan man interaktivt indtaste udtryk og<br />
kommandoer og se resultater og grafer beregnet og tegnet af Maple. Man kan også indføje forklarende tekst enten<br />
som kommentarer til sig selv eller for at forklare andre hvad man gør. Disse noter er således skrevet som et Maple<br />
arbejdsark og kan læses og udføres i Maple.<br />
Når man først starter Maple får man et tomt arbejdsark der kun indeholder en prompt:<br />
><br />
Prompten markerer starten af en indtastningslinie. Her kan man så indtaste matematiske udtryk og kommandoer<br />
og få Maple til at reagere på det. Når man taster retur (linieskift) på en indtastningslinie behandles linien af en Maple<br />
“kerne” som så udfører hvad man har bedt om, et eventuelt resultat vises derefter under indtastningslinien og Maple<br />
flytter markøren til næste indtastningslinie. Man kan gå tilbage og rette i game indtastningslinier (med piletasterne),<br />
men før man taster retur igen på linien vil den ikke blive behandlet og det gamle resultat vil fortsat stå under indtastningslinien.<br />
At indtastninger behandles af en “kerne” (i ældre versioner af Maple kaldet “server”) betyder ikke at<br />
den bliver sendt til en anden maskine et eller andet sted. Kernen er blot en del af Maple-programmet, men der er god<br />
grund til at skelne mellem “kernen”, der behandler indstatninger, og arbejdsarket, hvor man foretager indtastninger<br />
og får resultater vist. Det der står i arbejdsarket er nemlig ikke nødvendigvis konsistent med tilstanden af kernen,<br />
specielt ikke hvis man henter et eksisterende arbejdsark ind fra en fil - her står alle indtastningslinier tilsyneladende<br />
med resultater som om de har været behandlet af kernen, men det har de ikke! I modsætning til et regneark bliver<br />
arbejdsarkets resultater ikke automatisk opdateret når forudsætningerne for dem ændres. Hvis man således skriver et<br />
udtryk indeholdende x på en indtastningslinie og derefter omdefinerer x vil resultatet af den gamle indtastning ikke<br />
automatisk blive omberegnet og vist; hvis man ønsker en omberegning ud fra den nye værdi af x må man selv flytte<br />
markøren tilbage på indtastningslinien og taste retur. Sekvensen af indtastningslinier og resultater i arbejdsarket er en<br />
“historie” om en konversation med Maple. Med mindre hver indtastningslinie bliver “sendt” til kernen (i den rigtige<br />
rækkefølge) ved for eksempel at taste retur på hver eneste af dem, så er den kun læseren af arbejdsarket, der kender<br />
historien, Maple gør det ikke.<br />
Det er muligt at arbejde med flere arbejdsark samtidig. Man skal her være opmærksom på om arbejdsarkene<br />
benytter den samme underlæggende Maple kerne (hvilket var standard i tidligere versioner af Maple) eller har hver sin<br />
kerne (hvilket er standard fra Maple 9). Tideligere versioner af Maple skal eksplicit startes i “parallel server mode”<br />
(ved at vælge den rigtige start-ikon) for at køre som Maple 9, ellers kører alle ens åbne arbejdsark på samme “server”<br />
(dvs. kerne) og er ikke uafhængige af hinanden. Det vil sige at når man for eksempel definerer x til at være 3 i et af<br />
arkene er x pludselig 3 i alle ark, hvilket kan give en del forvirring hvis man ikke er opmærksom på det. På den anden<br />
side kan det være meget nyttigt hvis man lige vil lave nogle ekstra check-beregninger eller grafer som ikke skal indgå<br />
i ens færdige arbejde. For at få den “gamle” opførsel i Maple 9 skal man gå ind i menuen under “Tools -> Options” og<br />
i det fremkomne vindue vælge fanebaldet “General” og der i kassen “Kernel Mode” vælge “Shared” (hvilket betyder<br />
at arbedsarkene deler den samme Maple kerne).<br />
Et arbejdsark er delt ind i execution groups hvilket vel nærmest må oversættes til “udførelselsgrupper” men som jeg<br />
i det følgende vil betegne beregningsgrupper. Opdelingen i beregningsgrupper er markeret helt til venstre i arbejdsarket<br />
med en firkantet klamme “[”. Normalt vil Maple starte en ny beregningsgruppe for hver ny indtastningslinie. Man kan<br />
samle og dele beregningsgrupper med F4 henholdsvis F3. Alle indtastningslinier i en beregningsgruppe behandles (i<br />
rækkefølge) af Maple serveren når man taster retur på en af dem. Man kan indsætte en ny beregningsgruppe efter<br />
markøren ved at taste Ctrl-J eller før markøren ved at taste Ctrl-K, eller man kan benytte “Insert” menuen for oven og<br />
heruder vælge “Execution group” og hvor den skal indsættes.<br />
Man kan gemme arbejdsark i en fil og hente dem ind igen ved hjælp af “File” menuen. Men husk at når man<br />
henter et arbejdsark ind er der ingen af indtastningslinierne i det der endnu er behandlet af Maple. Man kan få udført<br />
alle indtastningslinierne i et arbejdsark fra en ende af ved at vælge “Edit” menuen for oven og herefter “Execute”<br />
og “Worksheet”. Hvis man gør dette med disse noter får man genopfrisket alle resultaterne men man får også et
hjælpevindue frem på grund af indtastningslinierne i afsnittet om Maples hjælpefunktion neden for, og man får skrevet<br />
en fil “nyfil.txt” på harddisken (hvis man har lov) på grund af en indtastningslinie i afsnittet om at arbejde med data.<br />
Kommandoen restart under dette afsnit står der for at resultaterne vil blive genopfrisket korrekt når man udfører hele<br />
dette arbejdsark i rækkefølge. Hvorfor dette er nødvendigt kan du læse om senere i afnittet om tildelinger.<br />
> restart;<br />
Man kan udskrive et arbejdsark eller eksportere det til HTML til brug på en webside. Disse operationer foretager<br />
man lettest ved at bruge “File” menuen for oven - den ligner noget man er vant til fra alle mulige andre programmer.<br />
3 Maples hjælpefunktion<br />
Maple har en omfattende hjælpefunktion. Faktisk er den elektroniske hjælp den officielle referencemanual for programmet,<br />
der findes ingen trykt manual. Man kan aktivere hjælpefunktionen fra “Help” menuen øverst til højre. Her<br />
har man forskellige muligheder for at komme ind i hjælpesystemet, enten via indholdsfortegnelsen (“Contents”), ved<br />
søgning på emne eller kommando (“Topic”) eller ved fuldtekstsøgning i hjæpen (“Search”). Man har også mulighed<br />
for at springe direkte til hjælp om det ord, markøren står på.<br />
Det er imidlertid også muligt at starte hjælpefunktionen fra en indtastningslinie. For blot at aktivere hjælpefunktionen<br />
så man kan bladre rundt kan man skrive et spørgsmålstegn og taste retur:<br />
> ?<br />
For at få hjælp om et bestemt emne eller en bestemt kommando skriver man navnet efter spørgsmålstegnet. For<br />
eksempel for at få noget at vide om sinusfunktionen:<br />
> ?sin<br />
Under hjælpefunktionen er også guidede “ture” rundt i Maple at finde under punktet “New Users”.<br />
4 Indtastning af udtryk<br />
Der er to måder at indtaste udtryk på i Maple: Standard Math Mode og Maple Notation Mode (i det følgende vil det<br />
engelske “mode” blive oversat til “tilstand”). I standard math tilstand opbygger man udtrykket ved hjælp af “paletter”<br />
hvorfra man kan vælge symboler og underudtryk med musen, samt med indtastning af tal og variabelnavne fra<br />
tastaturet. Efterhånden som udtrykket opbygges vil det have en grafisk form lig den man ville skrive udtrykket med i<br />
hånden. Al denne museklikken er imidlertid langsommelig og en sikker opskrift på at få sig en museskade, så det er<br />
bedre at bruge den anden mulighed når man overhovedet kan: Maple notation. I Maple notation skriver man udtryk<br />
ved hjælp af tastaturet og anvender specielle reserverede ord for at få de matematiske funktioner og symboler man<br />
har brug for. Hvis man så en gang i mellem ikke kan huske hvordan man skriver en given operation kan man ty til<br />
standard math tilstand og paletterne for at opbygge udtrykket og så skifte tilbage til Maple notation for at se hvordan<br />
man skal skrive det (ved at højre-klikke på en indtastningslinie får man en lille menu hvor man blandt andet kan slå<br />
“standard math” til og fra for den linie). Det vil føre for vidt her at beskrive nøjagtig hvordan man opbygger udtryk<br />
i standard math tilstand da det er en interaktiv proces, men det er beskrevet i Maples hjælpefunktion under delemnet<br />
worksheet,expressions,entering (hvis du læser dette i Maple kan du klikke på foregående tekst for at se hjælpen). Det<br />
skal dog nævnes at man under indtastning i standard math tilstand kan skrive Maple notation i indtastningsfeltet for<br />
oven og således få hele deludtryk, som man ved hvordan skal skrives, indsat i det udtryk man er ved at opbygge. Disse<br />
noter benytter kun Maple notation (men hvis du læser dem i Maple står det dig selvfølgelig frit for at skifte frem og<br />
tilbage).<br />
Hvis den prompt man får til at starte med indeholder et spørgsmålstegn så er man i standard math tilstand. Spørgsmålstegnet<br />
er en “pladsholder” der markerer hvor man i øjeblikket er ved at bygge på udtrykket, hvis det er fremhævet,<br />
eller hvor der mangler noget af udtrykket, hvis det ikke er fremhævet. For at skifte fremtidige prompter til Maple notation<br />
skal man gå ind under “Tools -> Options” i menuen for oven og i det fremkomne vindue vælge “I/O display -><br />
Input display” og herunder “Maple notation”.<br />
3
4<br />
5 Forklarende tekster<br />
Ud over udtryk og kommandoer som skal behandles af Maple er det muligt at skrive forklarende tekster. Disse noter<br />
er for eksempel skrevet som et arbejdsark hvor tekst og indtastningslinier er blandet. Det kan ikke anbefales at skrive<br />
hele afhandlinger i Maple da der mangler en hel del funktionalitet som man finder i et rigtigt tekstbehandlingsprogram<br />
(og Maple 9 iøvrigt bliver meget langsom når der er meget tekst at holde styr på), men det er heller ikke meningen<br />
at man skal skrive lange tekster. Muligheden for at skrive tekst er der for at man kan tilføje kommentarer som gør<br />
det nemmere for en selv og andre at forstå hvilket problem man er i færd med at løse i Maple. En anvendelse kunne<br />
for eksempel være at skrive “Besvarelse til øvelser fra ugeseddel 11” samt sit navn for oven og så “Opgave xx” som<br />
overskrift på hver opgavebesvarelse...<br />
For at skifte fra en indtastningslinie og til tekst taster man Ctrl-T på indtastningslinien. Prompten forsvinder og<br />
værktøjslinien for oven ændres. Man kan nu indtaste en vilkårlig tekst. Der er mulighed for ved hjælp af værktøjslinien<br />
(eller tastaturgenveje) at skifte skrifttype og -størrelse samt for at markere linier som værende for eksempel overskrifter.<br />
Man kan også højre/venstrestille eller centrere tekst. Taster man retur starter man et nyt afsnit men man forbliver i<br />
samme beregningsgruppe (uden beregninger).<br />
Det er faktisk muligt at blande indtastningslinier og tekst nogenlunde frit (i samme beregningsgruppe) men det<br />
giver hurtigt noget rod så denne noteforfatter vil gerne anbefale at man holder tekst for sig og beregninger for sig.<br />
Hvis man gerne vil gruppere tekst sammen med beregninger kan man anvende den facilitet der hedder “sektioner”<br />
(sections) som disse noter benytter sig af. Det fører for vidt her at forklare hvordan man gør men man kan se det i<br />
hjælpen under emnet worksheet,documenting,structuring2.<br />
Det er (selvfølgelig) muligt at få matematiske udtryk som x 2 + y 2 med i sin tekst (uden at få dem behandlet af<br />
Maple - altså blot som tekst). Man skifter til matematikindtastning ved at taste Ctrl-M og skifter tilbage med Ctrl-T.<br />
Indtastning af matematiske udtryk i tekst foregår som på indtastningslinier men starter altid i standard math tilstand.<br />
Man kan for at undgå paletterne indtaste Maple notation i indtastningsfeltet for oven eller skifte til Maple notation ved<br />
at højreklikke på spørgsmålstegnet og slå “Standard Math” fra (man skal dog så slå det til igen når man er færdig for<br />
at indtastningen ikke skal blive stående i Maple notation).<br />
6 Pakker<br />
Maple har et bibliotek af pakker som tilføjer ekstra funktionalitet til programmet (hovedsagelig i form af nye funktioner).<br />
Hver pakke indeholder funktioner inden for et bestemt område, for eksempel grafer, forsimpling af udtryk eller<br />
lineær algebra. Man kan indlæse alle funktioner fra en pakke ved at indtaste kommandoen with som følger:<br />
> with(plots):<br />
\QTR{_cstyle10}{Warning, the name changecoords has been redefined}\QTR{_cstyle10}{<br />
}<br />
Dette indlæser funktionerne fra pakken “plots”. Hvis man angiver et semikolon i stedet for et kolon i slutningen<br />
af linien får man en liste over alle de funktionsnavne, der bliver defineret; ellers får man som her kun eventuelle<br />
advarsler.<br />
Man kan bruge en enkelt funktion fra en pakke uden at læse pakken ind ved at skrive funktionens “fulde navn”,<br />
for eksempel for at anvende funktionen ZeroMatrix fra pakken LinearAlgebra:<br />
> LinearAlgebra[ZeroMatrix](2,2); 0 0<br />
0 0<br />
Indlæste pakker forsvinder når man bruger kommandoen restart (se også afnittet om tildelinger)<br />
> restart;
7 Regning med Maple<br />
Maple kan bruges som en regnemaskine hvis man skulle have brug for det. Man indtaster et regneudtryk afsluttet<br />
med semikolon (;) og taster retur hvorpå Maple spytter resultatet ud. Maple kan selvfølgelig klare de fire almindelige<br />
regnearter:<br />
> 12+6;<br />
> 12-6;<br />
> 12*6;<br />
> 12/6;<br />
Man kan også nemt potensopløfte:<br />
> 2^3;<br />
18<br />
6<br />
72<br />
2<br />
8<br />
I modsætning til for eksempel Excel foretrækker Maple at regne eksakt. Det vil for eksempel sige at dividerer man<br />
1 med 3 får man 1 3 og ikke en unøjagtig decimal-repræsentation som for eksempel 0.33333333. Tilsvarende: hvis<br />
man tager eksponentialfuktionen af 1 får man e, symbolet for den naturlige logaritmes grundtal, og ikke for eksempel<br />
2.7182818:<br />
> 1/3;<br />
> exp(1);<br />
1<br />
3<br />
e<br />
I virkeligheden regner Maple ikke på udtryk, Maple forsimpler udtryk. Hvis ens udtryk som de foregående udelukkende<br />
indeholder (eksakte) tal, simple regneoperationer og kendte funktioner så består forsimplingen blot i at samle<br />
talkonstanten i udtrykket til en simplere (men stadig eksakt) talkonstant, eventuelt ved at udføre regneoperationerne<br />
og tage funktionsværdierne hvis det kan gøres eksakt. Hvis en konstant ikke kan forsimples yderligere lader Maple<br />
den være:<br />
> sin(Pi/4);<br />
> sin(Pi/4)^2;<br />
> sin(1+Pi/4);<br />
1 √<br />
2<br />
2<br />
1<br />
2<br />
sin(1 + 1<br />
4 π)<br />
At Maple rent faktisk forsimpler et udtryk som 1/3 og giver den simpleste nøjagtige repræsentation kan man<br />
forsikre sig om ved for eksempel at indtaste (5-2)/(2+7):<br />
> (5-2)/(2+7);<br />
1<br />
3<br />
Her kan man iøvrigt også se at man kan bruge parenteser som man forventer i et udtryk til at afgrænse underudtryk<br />
og få den korrekte evalueringsrækkefølge. Ovenstående uden parenteser evalueres efter de sædvanlige regler for<br />
regneudtryk:<br />
> 5-2/2+7;<br />
11<br />
Hvis man regner med decimaltal i Maple går programmet ud fra at man per definition regner med “unøjagtige”<br />
værdier og så begynder programmet rent faktisk at regne. Et enkelt decimaltal i et udtryk “forurener” udtrykket og<br />
bevirker at Maple regner den del af udtrykket med decimaltal. For eksempel:<br />
> 1.0/3;<br />
5
6<br />
> 1.0/3*3;<br />
> exp(1.0);<br />
0.3333333333<br />
0.9999999999<br />
2.718281828<br />
At “forureningen” nogen gange ikke breder sig til hele udtrykket kan der også gives et eksempel på:<br />
> Pi/4.0;<br />
0.2500000000 π<br />
Man kan tvinge Maple til at give et decimaltal som resultat ved at benytte funktionen evalf:<br />
> evalf(1/3);<br />
> evalf(exp(1));<br />
> evalf(Pi/4.0);<br />
0.3333333333<br />
2.718281828<br />
0.7853981635<br />
Man kan give evalf besked på at udregne resultatet med mere end de 10 betydende cifre som er standard, for<br />
eksempel 200 cifre:<br />
> evalf(exp(1),200);<br />
2.7182818284590452353602874713526624977572470936999595749669676277\<br />
24076630353547594571382178525166427427466391932003059921817\<br />
41359662904357290033429526059563073813232862794349076323382\<br />
98807531952510190<br />
Det er faktisk kun maskinens hukommelse og ens egen tålmodighed der sætter grænser for hvor mange cifre man<br />
kan få resultatet med og 500000 decimaler er ikke urealistisk for en moderne PC.<br />
Lige som man i Maple kan regne med vilkårligt mange decimaler kan man også regne med vilkårligt store heltal:<br />
> 37^45;<br />
37074694665532807170105663883978228276095096806613832327136970789\<br />
759157<br />
(for at få at vide hvor mange cifre der er i dette resultat kan man bruge funktionen length:)<br />
> length(37^45);<br />
71<br />
De vilkårligt mange betydende cifre i numeriske resultater samt de vilkårligt store heltal er noget der adskiller<br />
Maple fra programpakker til rent numerisk matematik som for eksempel Matlab, og naturligvis også fra gængse<br />
kontorprogrammer som for eksempel Excel.<br />
Man kan også have brug for at referere til resutatet af den foregående beregning. I Maple betyder et procent-tegn<br />
(%) der indgår i et udtryk at her skal resultatet af forrige beregning indsættes:<br />
> 1/3;<br />
> 1+%;<br />
> %+1/%;<br />
1<br />
3<br />
4<br />
3<br />
25<br />
12<br />
Man kan tilsvarende bruge dobbelt procent-tegn (%%) for at få fat i resultatet af beregningen før den foregående<br />
og tredobbelt procenttegn (%%%) for at få fat i det tredieseneste resultat (men så kan man heller ikke komme længere<br />
tilbage):<br />
> %%-%%%;
1<br />
Man skal dog være varsom når man bruger procent-tegnene idet ’%’ refererer til den senest udregnede resultat,<br />
hvilket ikke nødvendigvis er det samme som det resultat der står umiddelbat oven for den aktuelle indtastningslinie.<br />
Den seneste beregning er den der stammer fra den seneste indtastningslinie, der blev sendt til Maple “kernen”, altså<br />
den seneste indtastningslinie, man tastede retur på. Det giver anledning til forvirring når man går tilbage og retter i<br />
tidligere indtastede linier i arbejdsarket idet procent-tegn i disse linier ikke refererer til det, man tror.<br />
Hvis du læser disse noter i Maple kan du taste retur på nedenstående indtastningslinie nogle gange i træk og se<br />
hvorledes resultatet ændrer sig:<br />
> %+%;<br />
2<br />
8 Symbolsk beregning, differentiering og integration<br />
Nu er det de færreste der blot benytter Maple som simpel regnemaskine. Styrken ved Maple er at man kan foretage<br />
symbolsk beregning eller måske rettere kan få Maple til at foretage algebraisk manipulation af symbolske udtryk. Et<br />
simpelt eksempel:<br />
> 3*(x+1)-x;<br />
2 x + 3<br />
Her formår Maple altså at forsimple udtrykket indeholdende den ukendte størrelse x. Maple kan også finde ud af<br />
at integrere og differentiere:<br />
> int(2*x+3,x);<br />
x 2 + 3 x<br />
Til int funktionen angiver man først udtrykket, der skal integreres, og derefter den variabel man integrerer over.<br />
Tilsvarende for diff funktionen, der foretager differentiering:<br />
> diff(%,x);<br />
2 x + 3<br />
Husk at procent-tegnet “%” betyder “resultatet af sidst udregnede udtryk”, i dette tilfælde x 2 + 3 x, så ovenfor<br />
kontrollerer vi at differentiering ophæver integration.<br />
Maple kender naturligvis de almindelige regler for integrations- og differentieringsregler og kan finde ud af at<br />
differentiere og integrere kendte funktioner:<br />
> int(1/x,x);<br />
> diff(sin(x),x);<br />
ln(x)<br />
cos(x)<br />
Man kan også få differentieret og integreret ukendte funktioner, men så er det selvfølgelig nødt til at være rent<br />
symbolsk:<br />
> diff(f(x),x);<br />
> int(f(x),x);<br />
> diff(%,x);<br />
d<br />
dx f(x)<br />
<br />
f(x) dx<br />
f(x)<br />
Man kan også explicit bede om en rent symbolsk differentiering eller integration for at forhindre at Maple anvender<br />
sine indbyggede regler. For at gøre dette skriver man Int og Diff med stort begyndelsesbogstav:<br />
> Int(1/x,x);<br />
1<br />
x dx<br />
> Diff(sin(x),x);<br />
7
8<br />
d<br />
dx sin(x)<br />
Man kan bruge funktionen value for at bede Maple om at udregne (forsimple) et sådant udtryk:<br />
> value(%);<br />
cos(x)<br />
Nu kan vi kontrollere om vi fra vores matematik kan huske regler for differentiering af produktet af to funktioner,<br />
forholdet mellem to funktioner eller sammensætningen af to funktioner:<br />
> diff(f(x)*g(x),x);<br />
> diff(f(x)/g(x),x);<br />
> diff(f(g(x)),x);<br />
( d<br />
d<br />
dx f(x)) g(x) + f(x) ( dx g(x))<br />
d<br />
dx f(x)<br />
g(x)<br />
− f(x) ( d<br />
dx g(x))<br />
g(x) 2<br />
D( f )(g(x)) ( d<br />
dx g(x))<br />
Bemærk i dette resultat at “D” er differential-operatoren, så D(f) betyder “f differentieret”. Funktionssammensætningen<br />
f(g(x)) kunne også have været skrevet (f@g)(x):<br />
> (f@g)(x);<br />
9 Grænseovergange<br />
f(g(x))<br />
Med Maple kan man tage grænseværdier med funktionen limit:<br />
> limit((1-x^2)/(1-x),x=1);<br />
2<br />
> limit(sin(x)/x,x=0);<br />
1<br />
For grænseovergange hvor værdien afhænger af om man går mod grænsen fra venstre eller fra højre skal man<br />
specificere hvilken vej man vil lave overgangen ved at give et ekstra argument til limit. Det ekstra argument skal være<br />
et af ordene “left” eller “right”. Først et eksempel på hvad maple gør hvis man glemmer at specificere om man tager<br />
grænseværdien fra højre eller venstre:<br />
> limit(tan(x),x=Pi/2);<br />
undefined<br />
Og her så den rigtige måde at gøre det på:<br />
> limit(tan(x),x=Pi/2,left);<br />
∞<br />
> limit(tan(x),x=Pi/2,right);<br />
−∞<br />
Med limit kan man også tage grænser i ∞ eller −∞:<br />
> limit(exp(-x),x=infinity);<br />
> limit(x^2,x=-infinity);<br />
∞<br />
Der findes en rent symbolsk (“forsinket”) version af limit som hedder Limit (analogt med Diff og Int).<br />
> Limit(1/x,x=infinity);<br />
> value(%);<br />
0<br />
1<br />
lim<br />
x→∞ x<br />
0<br />
Maple kan selv finde ud af at tage grænseværdier når man integrerer mod ∞ for eksempel i følgende uegentlige<br />
integral:
Int(exp(-x^2),x=-infinity..infinity);<br />
> value(%);<br />
∞<br />
e (−x2 ) dx<br />
−∞<br />
√ π<br />
10 Tildelinger - bundne og ubundne navne<br />
Som det fremgår af ovenstående to afsnit kan Maple regne symbolsk med ukendte størrelser som x, f, og g. Man kan<br />
imidlertid tildele en værdi til et navn, eller binde et navn til en værdi. Et ubundet navn står blot for sig selv og indgår<br />
i beregninger som en ukendt størrelse. Oven for regnede vi med ubundne navne og Maple lavede derfor algebraiske<br />
manipulationer på selve navnene. Hvis vi derimod binder et navn til en værdi vil Maple erstatte navnet med dets værdi<br />
hvor det indgår i senere udtryk. For eksempel:<br />
> x:=3;<br />
Dette tildeler værdien 3 til x (eller binder x til 3).<br />
> x;<br />
> 3*(x+1)-x;<br />
x := 3<br />
3<br />
9<br />
Vi kan binde et navn ikke bare til en simpel (tal)værdi men til et udtryk (3 er jo også et udtryk). Vi kan for eksempel<br />
lave en ny binding for x:<br />
> x:=y+2;<br />
> 3*(x+1)-x;<br />
x := y + 2<br />
2 y + 7<br />
Hvis vi nu tildeler y en værdi ændres værdien af x også:<br />
> y:=5*z;<br />
> x;<br />
y := 5 z<br />
5 z + 2<br />
Det vil sige, egentlig er værdien af x ikke ændret, den er fortsat y + 2, men når x optræder i et udtryk erstattes det<br />
med y + 2 og y erstattes derefter med sin værdi. Man kan verificere dette ved at tildele en ny værdi til y:<br />
> y:=7;<br />
> x;<br />
y := 7<br />
9<br />
For at ophæve bindingen for x og gøre navnet ubundet igen kan man skrive følgende “tildeling”:<br />
> x:=’x’;<br />
x := x<br />
Man tildeler her navnet x sig selv som værdi. Man skriver ’x’ på højresiden for at angive at der er tale om selve<br />
navnet x og ikke dets aktuelle værdi (tildelingen x:=x ville blot tildele x den aktuelle værdi af x dvs. værdien af y + 2<br />
og x ville dermed med den nuværende binding af y så få værdien 9). Når man omslutter et udtryk med apostroffer,<br />
altså skriver ’udtryk’, beder man Maple om at lade være med at evaluere udtrykket (det eneste Maple gør er at fjerne<br />
apostrofferne og eventuelt forsimple udtrykket).<br />
Vi kan verificere at x igen er ubundet:<br />
> x;<br />
x<br />
I stedet for at skrive den noget kryptiske tildeling x:=’x’ kan man bruge kommandoen unassign:<br />
9
10<br />
> x:=3;<br />
> x;<br />
> unassign(’x’);<br />
> x;<br />
x := 3<br />
3<br />
x<br />
Endelig kan man få Maple til at glemme alle bindinger og gå tilbage til en tilstand der ligner den hvor man lige<br />
har startet programmet. Dette gøres med kommandoen restart.<br />
> x:=3;<br />
x := 3<br />
> x;<br />
3<br />
> restart;<br />
> x;<br />
x<br />
Kommandoen restart vil forekomme flere gange i det følgende i slutningen af et afsnit for at fjerne alle bindinger<br />
der laves i afsnittet (noterne kan jo udføres som et arbejdsark i Maple). Kommandoen står også som noget af det første<br />
i starten af noterne. Dette er dels for at man kan læse afsnittene uafhængigt af hinanden uden at skulle gå ud fra at der<br />
kan være foretaget bindinger og dels for at man kan udføre hele dette arbejdsark med “Edit -> Execute -> Worksheet”<br />
menupunktet og få de samme resultater hver gang. Hvis du ikke læser disse noter i Maple er dette ikke relevant for<br />
dig, men nu ved du i det mindste hvorfor der står restart rundt omkring.<br />
Det er i det hele taget en god ide altid at starte sine arbejdsark med en restart kommando da man så kan læse<br />
arbejdsarket ind og udføre det uden at eventuelle bindinger man tidligere har lavet under samme kørsel af Maple<br />
forstyrrer resultatet.<br />
Man skal vare sig for at komme til at lave en rekursiv tildeling som for eksempel x:=x+1 eller det mere subtile<br />
x:=y sammen med y:=’x’. En sådan tildeling får Maple til at gå i uendelig løkke når man prøver at evaluere udtryk<br />
med de rekursivt bundne navne.<br />
Da man kan binde navne til hele udtryk kan man med fordel navngive de udtryk man regner med at bruge igen.<br />
For eksempel:<br />
> udtryk:=2*x+3;<br />
> 2*udtryk;<br />
> intudtryk:=int(udtryk,x);<br />
> diff(intudtryk,x);<br />
> x:=3;<br />
> udtryk;<br />
> restart;<br />
udtryk := 2 x + 3<br />
4 x + 6<br />
intudtryk := x 2 + 3 x<br />
2 x + 3<br />
x := 3<br />
Navne kan man vælge forholdsvis frit. De skal bare:<br />
1) starte med et bogstav,<br />
2) kun indeholde bogstaver, cifre og ’_’ samt<br />
3) ikke være reserverede ord (som for eksempel sin, cos og diff).<br />
9
11 Funktioner<br />
Det er muligt at evaluere et udtryk indeholdende ukendte størrelser som x for givne værdier af de ukendte ved hjælp<br />
af funktionen eval:<br />
> udtryk:=sin(x)^2;<br />
> eval(udtryk,x=0);<br />
> eval(udtryk,x=Pi/4);<br />
udtryk := sin(x) 2<br />
0<br />
1<br />
2<br />
Men ofte har man brug for at definere en (navngiven) funktion. En navngiven funktion defineres med notationen<br />
navn := parametre -> funktionsudtryk<br />
Man kan så tage værdier af funktionem med den sædvanlige notation navn(parameterværdier).<br />
> f:=x->sin(x)^2;<br />
> f(Pi/4);<br />
Man kan differentiere og integrere:<br />
> diff(f(x),x);<br />
Og funktionssammensætte:<br />
> g:=x->2*x;<br />
> (f@g)(x);<br />
> (g@f)(y);<br />
> (g@f)(Pi/4);<br />
Man kan også definere funktioner af flere variable:<br />
> d:=(x,y)->sqrt(x^2+y^2);<br />
> d(3,4);<br />
f := x → sin(x) 2<br />
1<br />
2<br />
2 sin(x) cos(x)<br />
g := x → 2 x<br />
sin(2 x) 2<br />
2 sin(y) 2<br />
1<br />
d := (x, y) → x 2 + y 2<br />
5<br />
Ofte har man brug for at konvertere et udtryk til en funktion. Den helt naive måde at gøre dette på går ikke i<br />
Maple:.<br />
> udtryk;<br />
> h:=x->udtryk;<br />
sin(x) 2<br />
h := x → udtryk<br />
Dette er forkert! Det ser måske umiddelbart meget tilforladeligt ud, men man bliver skuffet hvis man forsøger at<br />
anvende h:<br />
> h(Pi/4);<br />
sin(x) 2<br />
Problemet er at Maple ikke ekspanderer navnet udtryk når funktionen defineres og dermed bliver h en funktion der<br />
for alle x giver navnet udtryk, der ved evaluering erstattes af den værdi, udtryk er bundet til. At denne værdi indeholder<br />
11
12<br />
et x spiller ingen rolle, for det er det ubundne navn x og ikke funktionsparameteren x. Sagt på en anden måde forbindes<br />
det x der står for funktionens parameter aldrig med det x der forekommer “inde i” udtryk.<br />
For korrekt at definere en funktion ud fra et udtryk skal man bruge funktionen unapply:<br />
> h:=unapply(udtryk,x);<br />
> h(Pi/4);<br />
h := x → sin(x) 2<br />
1<br />
2<br />
Parametrene til unapply er dels det udtryk der skal være funktionsudtryk og dels navnet på den ukendte i udtrykket<br />
der skal være parameter i funktionen (eller flere navne hvis der skal være flere parametre).<br />
> restart;<br />
12 Sekvenser, lister og mængder<br />
En vigtig struktur i Maple er sekvenser af udtryk. En sekvens fremkommer for eksempel som det vil blive vist senere<br />
når man beder Maple om at løse en ligning der har flere løsninger; Maple giver løsningerne som en sekvens. En liste<br />
er en anden vigtig struktur i Maple. Lister bruges mange steder, for eksempel hvor det er nødvendigt at give flere<br />
værdier på en enkelt værdis plads i en af Maples indbyggede kommandoer (som for eksempel array kommandoen der<br />
bruges i afsnittet om tabeller). En tredie vigtig struktur i Maple er en mængde, der svarer nogenlunde til en mændge<br />
i matematik men også ofte anvendes i stedet for lister til at slå flere værdier sammen på en enkelt værdis plads i en<br />
kommando. De tre strukturer er beslægtede og gennemgås derfor her samlet.<br />
Man skriver en sekvens som en række udtryk adskilt af kommaer. Man kan skrive en sekvens på højre side af en<br />
tildeling:<br />
> sekvens:=x,1,2*x+3,diff(h(x),x),x;<br />
sekvens := x, 1, 2 x + 3, d<br />
dx h(x), x<br />
Som det ses kan en sekvens indeholde alle mulige slags udtryk. Rækkefølgen af udtrykkene i sekvensen bevares<br />
og det er muligt for det samme udtryk at indgå flere gange (gentagelser bevares).<br />
En liste skrives som en sekvens omsluttet af kantede parenteser:<br />
> liste1:=[a,b,c,d];<br />
liste1 := [a, b, c, d]<br />
> liste2:=[sekvens];<br />
liste2 := [x, 1, 2 x + 3, d<br />
dx h(x), x]<br />
Ligesom sekvenser bevarer lister rækkefølgen af elementerne samt eventuelle gentagelser.<br />
En mængde skrives som en sekvens omsluttet af krøllede parenteser (mængdeparenteser):<br />
> mængde1:={a,b,1,2};<br />
> mængde2:={sekvens};<br />
mængde1 := {1, 2, a, b}<br />
mængde2 := {1, 2 x + 3, x, d<br />
dx h(x)}<br />
Elementernes rækkefølge bevares ikke nødvendigvis og som det fremgår fjernes gentagelser. Dette svarer til mængdebegrebet<br />
i matematik (hvor et element enten er med eller ikke, og hvor der ikke er nogen specificeret rækkefølge af<br />
elementerne). Maples sekvenser og lister ikke har nogen direkte pendant i matematikken.<br />
Man kan tage et enkelt element ud af en sekvens med indeks-operatoren sekvens[indeks]:<br />
> sekvens[2];<br />
1<br />
Hvis man angiver et interval som indeks får man den tilsvarende delsekvens:<br />
> sekvens[2..4];
1, 2 x + 3, d<br />
dx h(x)<br />
Tilsvarende er det muligt i en liste at indeksere sig frem til enkelte elementer eller dellister:<br />
> liste1[3];<br />
> liste1[1..2];<br />
c<br />
[a, b]<br />
Indeksering kan også anvendes på mængder, men da rækkefølgen af elementer ikke bevares har elementerne altså<br />
ikke nødvendigvis den samme plads som da man tastede mængden ind:<br />
> mængde1[2];<br />
> mængde1[3..4];<br />
2<br />
{a, b}<br />
Man kan få antallet af elementer i en liste eller mængde med funktionen nops samt få en sekvens af elementerne<br />
med funktionen op:<br />
> nops(liste1);<br />
> nops(mængde2);<br />
> op(liste1);<br />
> op(mængde2);<br />
4<br />
4<br />
a, b, c, d<br />
1, 2 x + 3, x, d<br />
dx h(x)<br />
Ved at angive et indeks (enkelt eller interval) som første argument til op kan man nøjes med at udtage et enkelt<br />
element eller en delsekvens:<br />
> op(2..3,liste1);<br />
b, c<br />
De to funktioners navne kræver en forklaring. Navnet nops står for “number of operands” og navnet op står for<br />
“operand(s)”. Det er fordi de to funktioner faktisk opererer på alle slags udtryk og anvendes af Maple til at tælle<br />
henholdsvis uddrage deludtryk med. For eksempel:<br />
> udtryk:=3*x^2-10*x+1;<br />
> nops(udtryk);<br />
> op(udtryk);<br />
> op(2,udtryk);<br />
udtryk := 3 x 2 − 10 x + 1<br />
3<br />
3 x 2 , −10 x, 1<br />
−10 x<br />
Operanderne i et liste- eller mængdeudtryk er simpelt hen listens eller mængdens elementer, så derfor kan de to<br />
funktioner bruges med lister til at tælle og udtage elementer (det sidste kan man nu også gøre med et indeks). Bortset<br />
fra anvendelse med lister og mængder kan man altså bruge de to funktioner til at udtage deludtryk til videre beregning,<br />
for eksempel hvis man ønsker at forsimple et enkelt led i et større udtryk. Ud over dette har man nok kun brug for de<br />
to funktioner hvis man ligefrem programmerer i Maple.<br />
Man kan anvende de sædvanlige operationer på mængder så som foreningsmængde (union), fællesmængde (intersection)<br />
og mængdedifferens:<br />
> {1,2,3} union {3,4,5};<br />
{1, 2, 3, 4, 5}<br />
> {1,2,3} intersect {3,4,5};<br />
{3}<br />
13
14<br />
> {1,2,3} minus {3,4,5};<br />
{1, 2}<br />
Det er muligt at undersøge om et givent element er med i en mængde eller en liste med member funktionen:<br />
> member(2,mængde1);<br />
true<br />
> member(3,mængde1);<br />
> member(2*x+3,liste2);<br />
false<br />
true<br />
Operatoren in er den sædvanlige “er element i” operator:<br />
> 2 in mængde1;<br />
2 in {1, 2, a, b}<br />
For rent faktisk at evaluere dette til sandt eller falsk (som med member) skal man bruge funktionen evalb (“evaluate<br />
boolean”):<br />
> evalb(%);<br />
true<br />
Med mængder kan man iøvrigt se at heltal og decimaltal er to forskellige ting for Maple. Således kan både 2 og<br />
2.0 være indeholdt i samme mængde mens en mængde der indeholder 3 ikke af den grund indeholder 3.0:<br />
> mængde3 := {1,2,3,2.0};<br />
> member(2.0,mængde3);<br />
> member(3.0,mængde3);<br />
mængde3 := {1, 2, 3, 2.0}<br />
true<br />
false<br />
Man kan få genereret en sekvens med funktionen seq. For eksempel kan dannes en sekvens af x 2 for værdier a x<br />
mellem 5 og 20 således:<br />
> seq(x^2,x=5..20);<br />
25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400<br />
På denne måde kan man danne sekvenser af udtryk på basis af heltallene i et givet interval (og ved at angive kantede<br />
eller krøllede parenteser uden om kaldet af seq kan man lave det til en liste henholdsvis en mængde). I stedet for et<br />
interval kan man angive en liste, mængde eller sekvens som så vil blive anvendt elementvis til at danne sekvensen:<br />
> seq(x^2,x=mængde1);<br />
1, 4, a 2 , b 2<br />
Denne anvendelse af seq kan ligne det man kan gøre med funktionen map beskrevet i det følgende, de væsentligste<br />
forskelle er at seq altid danner en sekvens mens map danner en mængde hvis anvendt på en mængde og en liste hvis<br />
anvendt på en liste, samt at seq danner værdier ved at bruge et givent udtryk som skabelon mens map danner værdier<br />
ved at anvende en funktion.<br />
Med fuktionen map kan man få anvendt en vilkårlig funktion elementvis på alle elementerne i en mængde (eller i<br />
en liste, tabel eller anden Maple datastruktur der indeholder flere elementer):<br />
> map(sqrt,{1,2,3,4,5});<br />
{1, 2, √ 2, √ 3, √ 5}<br />
Man behøver ikke at anvende en indbygget funktion som sqrt, man kan bruge en funktion man selv har defineret:<br />
> f:=x->x+1;<br />
f := x → x + 1<br />
> map(f,{1,2,3,4,5});<br />
{2, 3, 4, 5, 6}<br />
Faktisk kan man definere den funktion der skal anvendes direkte i kaldet af map:<br />
> map(x->1/x,{1,2,3,4,5});
{1, 1<br />
2<br />
, 1<br />
3<br />
1 1<br />
, ,<br />
4 5 }<br />
En anden nyttig funktion er select, der udvælger elementer fra en liste eller mængde ud fra en funktion der anvendt<br />
på et element giver sandt (elementet medtages) eller falsk (elementet medtages ikke), altså en funktion hvis krop er et<br />
logisk udtryk. For eksempel:<br />
> select(x->x>2 and x select(x->123 mod x = 0,[seq(n,n=2..122)]);<br />
[3, 41]<br />
Bemærk at sekvensen dannet med seq laves om til en liste simpelt hen ved at pakke den ind i kantede parenteser.<br />
Moduludoperatoren a mod b giver resten ved division af a med b (altså resten af 123 delt med x i dette tilfælde, og når<br />
den er nul går x op i 123).<br />
Såvel map som select anvender eventuelle argumenter ud over de to første som ektra argumenter til den funktion<br />
der skal evalueres (hvis den tager mere end et enkelt argument):<br />
> map((x,y)->y^x,{1,2,3,4},10);<br />
{10, 100, 1000, 10000}<br />
> restart;<br />
13 Tabeller<br />
En fjerde vigtig struktur er tabeller (arrays). Tabeller er en slags udvidelse af lister til flere dimensioner og med<br />
vilkårlige heltalsintervaller som indekser. Man kan tænke på en liste som en en-dimensionel tabel med indeks gående<br />
fra 1 til antallet af elementer (dog kan man ikke ændre det enkelte element i en liste hvilket man kan med en tabel).<br />
En tabel konstrueres med array funktionen. De(t) første argument(er) til array er de(t) interval(ler), man vil benytte<br />
som indeks og det sidste argument er en liste af de elementer der skal gemmes i tabellen fra start (den kan udelades).<br />
> tabel1:=array(1..4,[a,b,c,d]);<br />
tabel1 := [a, b, c, d]<br />
> tabel1[2];<br />
b<br />
I modsætning til hvad man kan med lister kan man ikke udtage en deltabel ved at indeksere en tabel med et interval.<br />
Til gengæld kan man ændre det enkelte element i en tabel:<br />
> tabel1[3]:=f;<br />
tabel13 := f<br />
For at se indholdet af en tabel er man nødt til at anvende funktionen print da Maple ikke automatisk ekspanderer<br />
tabeller når de indgår i udtryk (dette er meget praktisk hvis man arbejder med store tabeller).<br />
> tabel1;<br />
> print(tabel1);<br />
tabel1<br />
[a, b, f, d]<br />
Man kan som sagt definere tabeller i flere dinemsioner:<br />
> tabel2:=array(1..3,1..3,[[1,2,3],[4,5,6],[7,8,9]]);<br />
> tabel2[2,3];<br />
⎡<br />
tabel2 := ⎣<br />
6<br />
1 2 3<br />
4 5 6<br />
7 8 9<br />
⎤<br />
⎦<br />
15
16<br />
Bemærk hvordan tabellens elementer blev givet som en liste af lister, hvor den yderste liste svarer til første dimension/indeks<br />
(her rækker), det næste niveau af lister til anden dimension/indeks (her søjler), og så videre hvis der havde<br />
været flere dimensioner. Det er igen muligt at ændre det enkelte element:<br />
> tabel2[1,1]:=100;<br />
> print(tabel2);<br />
tabel21, 1 := 100<br />
⎡<br />
100<br />
⎣ 4<br />
2<br />
5<br />
⎤<br />
3<br />
6 ⎦<br />
7 8 9<br />
Todimensionelle tabeller anvendes i Maples linalg pakke til at repræsentere matricer men anvendes ikke i .LinearAlgebra<br />
pakken som er den, der beskrives i afsnittet om lineær algebra<br />
Maple understøtter en anden slags tabel, nemlig en associativt indekseret tabel (som i Maple kaldes “table” hvor<br />
den almindelige tabel kaldes “array”). Forskellen til den almindelige tabel er at indeks ikke længere behøver at være<br />
et heltal, det kan være et hvilket som helst objekt. Det kan være nyttigt når man skal knytte egenskaber til en samling<br />
af objekter. Her blot et lege-eksempel (der igen illustrerer at heltal og decimaltal er forskellige i Maple):<br />
> assoc:=table([12=heltal,12.0=decimaltal,x=navn,2*x+3=udtryk]);<br />
> assoc[12];<br />
> assoc[12.0];<br />
> assoc[2*x+3];<br />
> restart;<br />
assoc := table([12 = heltal, 12.0 = decimaltal, 2 x + 3 = udtryk, x = navn])<br />
heltal<br />
decimaltal<br />
udtryk<br />
14 Simplifikation og manipulation af udtryk<br />
Det er ikke alle simplifikationer af et indtastet udtryk som Maple foretager automatisk. For eksempel:<br />
> x*((x+2)^2-17)+x^2+7;<br />
x ((x + 2) 2 − 17) + x 2 + 7<br />
Her ville man jo nok synes at udtrykket kunne forsimples ved at gange ind i parenteserne og samle led med samme<br />
potens af x. Man kan imidlertid bede Maple om at forsøge at forsimple et udtryk med funktionen simplify:<br />
> simplify(%);<br />
x 3 + 5 x 2 − 13 x + 7<br />
Dette synes man jo nok er en simplere form. Med simplify kan man forsimple en lang række udtryk, men da det<br />
ikke er veldefineret hvad der er den “simpleste form” af et matematisk udtryk kommer man ofte ud for at et udtryk<br />
man synes kunne have en simplere form ikke ændres af simplify. Så er der en række funktioner der giver en mulighed<br />
for mere explicit at specificere hvordan man vil have udtrykket ændret. Det kunne for eksempel være at ovenstående<br />
polynomium ville være simplere i faktoriseret form, det vil sige som et produkt af polynomier af mindst mulig grad.<br />
Kommandoen factor forsøger at faktorisere et udtryk til et produkt af simplere udtryk:<br />
> factor(%);<br />
(x + 7) (x − 1) 2<br />
Dette synes også at være en simpel form, og simplify gør da helle ikke noget ved dette udtryk<br />
> simplify(%);<br />
(x + 7) (x − 1) 2<br />
Her har vi altså et eksempel på et udtryk der har to former som simplify så at sige synes lige godt om.<br />
Det modsatte af at faktorisere et udtryk er at ekspandere det ved at gange alle parenteser ud. Dette gør man med<br />
funktionen expand:
expand(%);<br />
x 3 + 5 x 2 − 13 x + 7<br />
Vi kunne også have brugt expand direkte på det oprindelige udtryk hvis vi vidste at det var denne form af polynomiet<br />
vi foretrak:<br />
> expand(x*((x+2)^2-17)+x^2+7);<br />
x 3 + 5 x 2 − 13 x + 7<br />
... og tilsvarende kunne vi have brugt factor direkte på det oprindelige udtryk:<br />
> factor(x*((x+2)^2-17)+x^2+7);<br />
(x + 7) (x − 1) 2<br />
Kommandoerne expand og factor kan også anvendes på andet end simple polynomier og ofte virker de modsat af<br />
hinanden:<br />
> (x+1)/(x-2);<br />
> expand(%);<br />
> factor(%);<br />
x + 1<br />
x − 2<br />
x 1<br />
+<br />
x − 2 x − 2<br />
x + 1<br />
x − 2<br />
Med expand kan man også få expanderet udtryk med trigonometriske funktioner efter diverse kendte trans<strong>format</strong>ioner:<br />
> sin(2*x);<br />
> expand(%);<br />
sin(2 x)<br />
2 sin(x) cos(x)<br />
Her kan man ikke bruge factor for at komme tilbage:<br />
> factor(%);<br />
2 sin(x) cos(x)<br />
Man skal i stedet bruge funktionen combine som ofte gør det modsatte af expand for specielle funktioner:<br />
> combine(%);<br />
> expand(sin(x+y));<br />
> combine(%);<br />
> Int(x+x^2,x);<br />
> expand(%);<br />
> combine(%);<br />
sin(2 x)<br />
sin(x) cos(y) + cos(x) sin(y)<br />
<br />
<br />
sin(x + y)<br />
x + x 2 dx<br />
<br />
x dx +<br />
<br />
x + x 2 dx<br />
Man kan bede expand om at ikke at ekspandere et bestemt underudtryk. Ved sædvanlig brug af expand ekspanderes<br />
alle underudtryk:<br />
> expand((x+1)*(y+z));<br />
x 2 dx<br />
x y + x z + y + z<br />
17
18<br />
Men hvis man som ekstra argument til funktionen angiver et underudtryk vil dette ikke blive ekspanderet:<br />
> expand((x+1)*(y+z),x+1);<br />
(x + 1) y + (x + 1) z<br />
Med funktionen Combine fra pakken SolveTools kan man forsimple udtryk med logaritmer, eksponentialfunktioner<br />
og potenser som den normale combine ikke klarer:<br />
> combine(ln(a)+ln(b));<br />
ln(a) + ln(b)<br />
> SolveTools[Combine](ln(a)+ln(b));<br />
ln(a b)<br />
I polynomier i flere variable (eller i det hele taget i blandede udtryk med flere variable) er det ofte nyttigt at samle<br />
koefficienterne for en bestemt variabel. Betragt for eksempel følgende blandede polynomium i x, y, og z:<br />
> x+3*x+5*x*y+y+x*z;<br />
4 x + 5 x y + y + x z<br />
Med funktionen collect kan vi få samlet for eksempel y’erne:<br />
> collect(%,y);<br />
Vi kunne også samle x’erne:<br />
> collect(%,x);<br />
(5 x + 1) y + 4 x + x z<br />
(5 y + 4 + z) x + y<br />
Hvis man i stedet for navnet på en enkelt variabel angiver en liste af variabelnavne vil collect først samle koefficienterne<br />
for den første variabel og derefter inden for hver koefficient samle koefficienter for den anden variabel, og så<br />
videre:<br />
> collect(%,[y,x]);<br />
(5 x + 1) y + (4 + z) x<br />
Med collect kan man også samle koefficienterne distribueret, det vil sige samle koefficienter for produkter af de<br />
angivne variable i stedet for at samle for en enkel variabel af gangen. Dette opnår man ved at give ordet “distributed”<br />
som et tredie argument til funktionen (og så kan man angive variabelnavnene som en mængde fordi rækkefølgen ikke<br />
længere har nogen betydning):<br />
> collect(%,{x,y},distributed);<br />
(4 + z) x + 5 x y + y<br />
Maple sorterer ikke automatisk leddene i et polynomium efter potensernes størrelse. Faktisk beholder Maple den<br />
rækkefølge man taster polynomiet ind i:<br />
> x^2+4*x^3-2+10*x;<br />
x 2 + 4 x 3 − 2 + 10 x<br />
For at få et polynomium ordnet efter potenserne (som i sædvanlig notation) skal man bruge funktionen sort:<br />
> sort(%);<br />
4 x 3 + x 2 + 10 x − 2<br />
Sortering af et polynomium er “destruktiv” på den måde at den huskes af Maple og næste gang det samme polynomium<br />
forekommer vil det have den nye orden af leddene. Hvis for eksempel polynomiet fra før indtastes i samme<br />
rækkefølge som oven for får man det altså nu i den sorterede version:<br />
> x^2+4*x^3-2+10*x;<br />
4 x 3 + x 2 + 10 x − 2<br />
For blandede polynomier kan man angive hvilke variable der skal sorteres på:<br />
> y^3+y^2*x^2+x^3;<br />
> sort(%,[x,y]);<br />
y 3 + y 2 x 2 + x 3<br />
x 2 y 2 + x 3 + y 3
Hvis man som tredie argument til sort angiver det specielle ord “plex” får man polynomiet sorteret i ren leksikografisk<br />
orden efter variablene (i den rækkefølge man angiver dem) således leddene sorteres først efter potensen af<br />
den først angivne variabel, dernæst efter potensen af den næste angivne variabel og så videre. Hvis man ikke angiver<br />
“plex” får man leddene sorteret efter den totale potens af de variable som oven for.<br />
> sort(%,[x,y],plex);<br />
x 3 + x 2 y 2 + y 3<br />
En sidste funktion til manipulation af udtryk som skal nævnes her er normal. Den konverterer et rationelt udtryk<br />
til faktoriseret normal form hvilket betyder at udtrykket er en brøk hvor tæller og nævner er polynomier der ikke er<br />
delelige med hinanden.<br />
> 1/x+x/(x+1);<br />
> normal(%);<br />
1 x<br />
+<br />
x x + 1<br />
x + 1 + x 2<br />
x (x + 1)<br />
Som standard ekspanderes tælleren mens nævneren er faktoriseret. Man kan angive at både tæller og nævner skal<br />
ekspanderes ved at give det specielle ord “expanded” som andet argument.<br />
> normal(%,expanded);<br />
15 Løsning af ligninger<br />
x + 1 + x 2<br />
x + x 2<br />
En ligning i Maple er simpelt hen et udtryk hvor der forekommer et lighedtegn (“=”, ikke at forveksle med en tildeling<br />
som skrives “:=”).<br />
> 2*x=4;<br />
2 x = 4<br />
Maple kan løse ligninger algebraisk med funktionen solve. Man angiver en ligning og den variabel man ønsker at<br />
løse for:<br />
x:<br />
> solve(%,x);<br />
> solve(y=a*x,x);<br />
y<br />
a<br />
Hvis man angiver variablen der skal løses for i en mængde får man løsningen ud på en lidt anden måde:<br />
> solve(y=a*x,{x});<br />
2<br />
{x = y<br />
a }<br />
Denne form af løsningen er velegnet hvis man vil bruge den i en funktion som eval til at substituere en værdi for<br />
> eval(x^2,%);<br />
y 2<br />
a 2<br />
Hvis en ligning har mere end én løsning forsøger Maple at finde dem alle. Resultatet af solve bliver da en sekvens<br />
af løsninger. For eksempel for den generelle andengradsligning a x 2 + b x + c = 0:<br />
> solve(a*x^2+b*x+c=0,{x});<br />
{x = 1 −b +<br />
2<br />
√ b2 − 4 a c<br />
}, {x =<br />
a<br />
1 −b −<br />
2<br />
√ b2 − 4 a c<br />
}<br />
a<br />
Disse løsninger turde være velkendte... Vi gemmer løsningerne ved at binde dem til navnet løs (for løsning(er)):<br />
> løs:=%;<br />
19
20<br />
løs := {x = 1 −b +<br />
2<br />
√ b2 − 4 a c<br />
}, {x =<br />
a<br />
1 −b −<br />
2<br />
√ b2 − 4 a c<br />
}<br />
a<br />
For at få en enkelt løsning ud af en sekvens af løsninger må vi indeksere i sekvensen:<br />
> løs[1];<br />
> løs[2];<br />
{x = 1<br />
2<br />
−b + √ b2 − 4 a c<br />
}<br />
a<br />
{x = 1 −b −<br />
2<br />
√ b2 − 4 a c<br />
}<br />
a<br />
Med vores generelle løsning på andengradsligingen kan vi nu bruge eval til at få løsninger til forskellige andengradsligninger:<br />
> eval(løs,{a=2,b=-3,c=1});<br />
> eval(løs,{a=2,b=4,c=2});<br />
{x = 1}, {x = 1<br />
2 }<br />
{x = −1}, {x = −1}<br />
Vi kunne selvfølgerlig også får løsningerne til denne andengradsligning ved at bruge solve direkte:<br />
> solve(2*x^2+4*x+2=0,{x});<br />
{x = −1}, {x = −1}<br />
For ligninger af mere end fjerde grad findes der ikke nogen generel løsning og Maple vil derfor ofte give løsninger<br />
i form af RootOf funktionen. Det betyder “løsningerne du leder efter er rødder i polynomiet inde i RootOf”. Maple<br />
indfører selv en hjælpevariabel i polynomiet, den vil som regel hedde _Z, _Z1 eller lignende (alle variable som Maple<br />
indfører starter med et understregningstegn “_”).<br />
Følgende sjettegradsligning har dels en løsning som Maple finder algebraisk og dels fem løsninger som er rødder<br />
i et femtegradspolynomium:<br />
> løs:=solve({4*x^6-12*x^5+2*x^2-9*x+9=0},{x});<br />
løs := {x = 3}, {x = RootOf(4 _Z 5 + 2 _Z − 3, index = 1)},<br />
{x = RootOf(4 _Z 5 + 2 _Z − 3, index = 2)},<br />
{x = RootOf(4 _Z 5 + 2 _Z − 3, index = 3)},<br />
{x = RootOf(4 _Z 5 + 2 _Z − 3, index = 4)},<br />
{x = RootOf(4 _Z 5 + 2 _Z − 3, index = 5)}<br />
For at få numeriske løsninger ud skal vi så bruge evalf:<br />
> evalf(løs);<br />
{x = 3.}, {x = 0.8086092632}, {x = 0.3993814688 + 0.8387514991 I},<br />
{x = −0.8036861004 + 0.6548567008 I}, {x = −0.8036861004 − 0.6548567008 I},<br />
{x = 0.3993814688 − 0.8387514991 I}<br />
Her fik vi atså fire imaginære rødder og en enkelt reel rod ud over roden x=3 som solve fandt algebraisk.<br />
Man bør altid checke sine løsninger ved at substituere tilbage ind i den oprindelige ligning. Dette kan man gøre<br />
med eval.<br />
> lign:=3*x-4=0;<br />
> løs:=solve(lign,{x});<br />
> eval(lign,løs);<br />
lign := 3 x − 4 = 0<br />
løs := {x = 4<br />
3 }<br />
0 = 0<br />
Med solve kan man også løse ligningssystemer. Man angiver et ligningssystem som en mængde af ligninger:
lign:={u+v+w=1, 3*u+v=3, u-2*v-w=0};<br />
lign := {u + v + w = 1, 3 u + v = 3, u − 2 v − w = 0}<br />
> løs:=solve(lign,{u,v,w});<br />
løs := {v = 3 −2 4<br />
, w = , u =<br />
5 5 5 }<br />
Vi kan igen bruge eval til at checke vores løsning:<br />
> eval(lign,løs);<br />
{0 = 0, 3 = 3, 1 = 1}<br />
Man kan også med fordel bruge eval til at få en enkelt variabel “pakket ud” ud af løsningsmængden:<br />
> eval(u,løs);<br />
Man kan også bruge solve til at løse uligheder:<br />
4<br />
5<br />
> solve(x^2+4>8,x);<br />
RealRange(−∞, Open(−2)), RealRange(Open(2), ∞)<br />
Ovenstående er Maples måde at skrive de to intervaller [ −∞,-2[ og ]2, ∞] på. Hvis vi beder om at få løsningen på<br />
den alternative form ved at pakke x ind i en mængde får vi løsningen som to uligheder hvilket er noget mere læseligt:<br />
> solve(x^2+4>8,{x});<br />
{x < −2}, {2 < x}<br />
Maple kan også løse systemer der indeholder uligheder. Løsningerne som solve finder opfylder alle ligninger og<br />
uligheder i det system man angiver:<br />
> solve({x^2-9=0,x>0},{x});<br />
{x = 3}<br />
Hvis Maple ikke kan finde en løsning får man ikke noget resultat.<br />
> solve({x4},{x});<br />
Hvor Maple ikke kan løse ligningen algebraisk giver solve en RootOf løsning :<br />
> solve(x^3=cos(10*x),x);<br />
1<br />
10 RootOf(−1000 cos(_Z) + _Z3 , label = _L2)<br />
Vi kan igen få en konkrete løsning ud af RootOf løsningen med evalf:<br />
> evalf(%);<br />
0.1566948942<br />
Men med evalf får vi kun en enkelt løsning ud, selv om der måtte være flere (i dette tilfælde er der syv, hvilket<br />
man kan forvisse sig om ved at tegne graferne for de to funktioner med plot, se afnittet om grafer for funktioner).<br />
Maple kan løse visse ligninger med periodiske funktioner hvor perioderne er indbyrdes lineære:<br />
> solve(sin(x)=cos(3*x),x);<br />
− 1 3<br />
π,<br />
4 4<br />
> solve(sin(x)=cos(1+x),x);<br />
1<br />
5<br />
π, π, −7 π, −3 π,<br />
8 8 8 8 π<br />
cos(1)<br />
arctan(<br />
1 + sin(1) )<br />
Nogle gange må Maple imidlertid helt give op og i disse tilfælde giver solve ikke nogen løsning, selv om der skulle<br />
være en:<br />
> solve(sin(x)=cos(x^2),x);<br />
Når man ikke kan finde løsninger algebraisk med solve kan man forsøge at finde dem numerisk med fsolve:<br />
> fsolve(sin(x)=cos(x^2),x);<br />
0.8493688624<br />
21
22<br />
Maple forsøger med fsolve at finde alle reelle løsninger hvis ligningen er et polynomium. Tag for eksempel sjettegradsligningen<br />
fra før:<br />
> fsolve({4*x^6-12*x^5+2*x^2-9*x+9=0},{x});<br />
{x = 0.8086092632}, {x = 3.}<br />
Her findes de to reelle løsninger. Man kan bede fsolve om også at lede efter imaginære løsninger:<br />
> fsolve({4*x^6-12*x^5+2*x^2-9*x+9=0},{x},complex);<br />
{x = −0.8036861004 − 0.6548567008 I}, {x = −0.8036861004 + 0.6548567008 I},<br />
{x = 0.3993814688 − 0.8387514991 I}, {x = 0.3993814688 + 0.8387514991 I},<br />
{x = 0.8086092632}, {x = 3.}<br />
For ligninger der ikke er polynomier finder fsolve kun en enkelt løsning, selv når der er flere:<br />
> fsolve(cos(x)=0,x);<br />
1.570796327<br />
Man kan bede fsolve om at lede efter løsningen i et bestemt interval:<br />
> fsolve(cos(x)=0,x=Pi..2*Pi);<br />
4.712388980<br />
Man kan også bede fsolve om at undgå visse værdier:<br />
> fsolve(cos(x)=0,x,avoid={x=Pi/2,x=3*Pi/2});<br />
−1.570796327<br />
Endelig kan man benytte et trick hvor man dividerer den oprindelige ligning med de(n) løsning(er) man allerede<br />
har fundet. Dette giver singulariteter i ligningen som fsolve så undgår:<br />
> x1:=fsolve(cos(x)=0,x);<br />
x1 := 1.570796327<br />
> x2:=fsolve(cos(x)/(x-x1)=0,x);<br />
x2 := −1.570796327<br />
> fsolve(cos(x)/(x-x1)/(x-x2)=0,x);<br />
−266650.5305<br />
Som det kan ses giver det dog ikke nødvendigvis nogen særlig god kontrol af hvor den næste løsning findes.<br />
Det samme trick med at dividere med kendte løsninger kan man ikke bruge med solve:<br />
> solve(cos(x)=0,x);<br />
> solve(cos(x)/(x-Pi/2)=0,x);<br />
(Dette giver ingen løsninger.)<br />
1<br />
2 π<br />
En sidste speciel form for løsning af ligninger skal nævnes. Det hænder at man ønsker at finde konstanter der får<br />
en ligning til at være sand for alle værdier af den variable. Man kan bruge solve sammen med den specielle funktion<br />
identity til at løse problemer af denne type:<br />
> solve(identity(sin(x)=cos(a*x+b),x),{a,b});<br />
{b = − 1<br />
1<br />
π, a = 1}, {b = π, a = −1}<br />
2 2<br />
Her finder vi de værdier af a og b som gør ligningen sin(x) = cos(a x + b) sand for alle værdier af x.<br />
> restart;<br />
16 Løsning af differentialligninger<br />
Maple kan løse såvel ordinære som partielle differentialligninger samt systemer af differentialligninger. Her vil kun<br />
løsning af ordinære differentialligninger blive kortfattet gennemgået, hvis man har brug for at løse partielle differentialligninger<br />
med Maple kan man se hvordan det gøres i online-hjælpen (funktionen hedder pdsolve).
Vi kan løse en differentialligning med begyndelsesbetingelse og få en partikulær løsning. Ligning og begyndelsesbetingelser<br />
skal gives som en mængde til funktionen dsolve og vi pakker dem derfor ind i mænder med det samme.<br />
Først selve ligningen:<br />
> lign:={diff(y(t),t,t)+5*diff(y(t),t)+6*y(t)=0};<br />
Så begyndelsesbetingelserne:<br />
> bb:={y(0)=0,D(y)(0)=1};<br />
lign := {( d2<br />
dt 2 y(t)) + 5 ( d dt y(t)) + 6 y(t) = 0}<br />
bb := {y(0) = 0, D(y)(0) = 1}<br />
Bemærk at vi her bruger differential-operatoren D til at angive differentieringen af y. Det er for besværligt at bruge<br />
diff fordi vi så også er nødt til at bruge unapply for at lave resultatet om til en funktion som vi kan tage værdien af i 0.<br />
Med differential-operatoren får vi direkte lavet en funktion af én variabel om til dens afledte funktion.<br />
Vi bruger fællesmængde-operatoren union til at slå de to mængder sammen i kaldet af dsolve:<br />
> løs:=dsolve(lign union bb,y(t));<br />
løs := y(t) = e (−2 t) − e (−3 t)<br />
Bemærk at dsolve skal have de(n) funktion(er) vi søger en løsning for som andet argument.<br />
For at få løsningen lavet om til en funktion vi kan tage værdier af pakker vi den først ud af løsningsmængden med<br />
eval.<br />
> eval(y(t),løs);<br />
e (−2 t) − e (−3 t)<br />
I dette tilfælde hvor løs blot er en enkelt ligning kan man også udtage højresiden med funktionen rhs (“right hand<br />
side”, tilsvarende findes en lhs), men at bruge eval er mere generelt.<br />
> rhs(løs);<br />
e (−2 t) − e (−3 t)<br />
Derefter laver vi udtrykket om til en funktion af t med unapply:<br />
> y1:=unapply(%,t);<br />
y1 := t → e (−2 t) − e (−3 t)<br />
Nu kan vi verificere at vores fundne løsning, funktionen y1, virkelig er en løsning til ligningen:<br />
> eval(lign,y=y1);<br />
{0 = 0}<br />
Tilsvarende kan vi kontrollere at ligningen opfylder begyndelsesbetingelserne:<br />
> eval(bb,y=y1);<br />
{0 = 0, 1 = 1}<br />
I stedet for en partikulær løsning kan vi få den fuldstændige løsning ved at udelade begyndelsesbetingelserne:<br />
> løs:=dsolve(lign,y(t));<br />
løs := {y(t) = _C1 e (−2 t) + _C2 e (−3 t) }<br />
Maple genererer automatisk de nødvendige konstanter (her _C1 og _C2) som hører til den fuldstændige løsning.<br />
Vi kan igen bruge eval til at verificere den fundne løsning:<br />
> eval(lign,løs);<br />
> restart;<br />
17 Lidt lineær algebra<br />
{0 = 0}<br />
I dette afsnit vil nogle af Maples faciliteter inden for lineær algebra blive gennemgået. Der mange flere funktioner i<br />
Maple til at løse problemer inden for lineær algebra end der er mulighed for at gennemgå her, brug online-hjælpen for<br />
at finde ud af mere.<br />
23
24<br />
Der er i Maple to forskellige pakker til lineær algebra: Den ene hedder linalg og den anden hedder LinearAlgebra.<br />
De to pakker er alternativer til hinanden og indeholder for en stor del funktioner, der gør det samme men hedder noget<br />
forskelligt. LinearAlgebra er den nyeste af de to og generelt den mest behagelige at bruge, så det er den der vil blive<br />
anvendt i det følgende. Hvis man vil lave abstrakt lineær algebra kan man dog overveje at bruge linalg i stedet.<br />
Så først indlæser vi altså pakken LinearAlgebra:<br />
> with(LinearAlgebra):<br />
Nu er der en række funktioner til rådighed til at danne matricer og vektorer og til at regne med dem. Men først og<br />
fremmest kan man skrive små matricer og vektorer direkte med en speciel notation som følger:<br />
> A:=;<br />
> b:=;<br />
A :=<br />
1 2<br />
1 3<br />
<br />
1<br />
b :=<br />
−2<br />
I denne notation skrives søjler adskilt af lodrette streger og rækker adskilt af kommaer . Det er ikke altid den<br />
lodrette streg er markeret på et dansk PC-tastatur, man får fat i den ved at holde “Alt Gr” tasten nede og trykke på den<br />
apostrof-tast, der sidder to pladser til højre for tasten med tallet 0 (skråt til højre over “Å”).<br />
Man kan selv vælge om man vil skrive matricer i søjleorden eller rækkeorden:<br />
> ;<br />
> ;<br />
1 2<br />
3 4<br />
<br />
1 3<br />
2 4<br />
Vi så søjlevektoren b defineret oven for, og som man måske kan regne ud kan man skrive en rækkevektor som<br />
følger:<br />
> ;<br />
Man kan også anvende funktionerne Matrix og Vector:<br />
> B:=Matrix([[1,1],[-2,1]]);<br />
> Vector([1,2]);<br />
<br />
B :=<br />
[1, 2]<br />
<br />
1 1<br />
−2 1<br />
<br />
1<br />
2<br />
Her angives elementerne som (lister af) lister. Det er specielt nyttigt hvis man indlæser data fra en fil med funktionen<br />
readdata, se afsnittet om at arbejde med (importerede) data.<br />
Der er talrige andre måder at lave matricer på med Matrix, her er blot nogle få eksempler (se i hjælpen under<br />
“Matrix”). Først og fremmest kan man angive dimensionerne af matricen og så en funktion fra søjle- og rækkenummer<br />
til værdi:<br />
> Matrix(2,2,(r,s)->r/s);<br />
⎡<br />
⎣ 1<br />
1<br />
2<br />
⎤<br />
⎦<br />
2 1<br />
Man kan også bare angive dimensionerne og en værdi der skal stå på alle pladser:<br />
> Matrix(2,2,7);
Man kan angiver en diagonalmatrix:<br />
7 7<br />
7 7<br />
> Matrix([1,2],scan=diagonal);<br />
<br />
1<br />
<br />
0<br />
0 2<br />
> Matrix(2,x->x^2,shape=diagonal);<br />
<br />
1<br />
<br />
0<br />
0 4<br />
> Matrix(2,shape=identity);<br />
En enhedsmatrix kan man også få med:<br />
> IdentityMatrix(2);<br />
1 0<br />
0 1<br />
1 0<br />
0 1<br />
Hvis en matrix eller vektor er for stor til at blive vist på skærmen får man i stedet en pladsholder som beskriver<br />
hvad der burde stå som resultat:<br />
> Matrix(100,x->x,shape=diagonal);<br />
100 x 100 Matrix Data Type : anything Storage : diagonal Shape : diagonal Order : Fortran_order <br />
Man kan så dobbeltklikke på pladsholderen for at åbne et vindue hvor man kan inspicere og/eller rette i matricens<br />
elementer (man kan selvfølgelig gøre det samme for matricer der er små nok til at blive vist). Man har i browseren<br />
mulighed for at se en farvekodet oversigt over for eksempel tætheden i matricen og for at zoom’e ind og ud; det fører<br />
for vidt her at beskrive alle mulighederne.<br />
Addition og subtraktion af matricer fungerer som forventet:<br />
> A+B;<br />
> A-B;<br />
<br />
2 3<br />
−1 4<br />
0 1<br />
3 2<br />
Matrixmultiplikation skrives med et punktum i stedet for det sædvanlige multiplikationstegn:<br />
> A.B;<br />
> A.b;<br />
Potensopløftning fungerer som forventet:<br />
> A^2;<br />
Man kan også multiplicere med en skalar:<br />
> 7*A;<br />
−3 3<br />
−5 4<br />
−3<br />
−5<br />
<br />
3 8<br />
4 11<br />
7 14<br />
7 21<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
25
26<br />
Hvis man adderer eller subtraherer en skalar svarer det til at addere eller subtrahere med en enhedsmatrix multipliceret<br />
med skalaren, det vil sige at skalaren bliver lagt til alle diagonalelementerne:<br />
> 7+A;<br />
<br />
8 2<br />
1 10<br />
Hvis man adderer en matrix med et ubundet navn gør Maple umiddelbart ikke noget (og hvordan skulle Maple<br />
egentlig vide om navnet står for en skalar eller noget andet?):<br />
> x+A;<br />
<br />
1 2<br />
x +<br />
1 3<br />
I mondsænign hertil, hvis man multiplicerer en matrix med et ubundet navn får man det multipliceret ind i matricen<br />
elementvis:<br />
> x*A;<br />
<br />
x 2 x<br />
<br />
x 3 x<br />
Hvis man gerne vil gennemtvinge den elementvise addition eller multiplikation kan man bruge funktionerne Add<br />
eller Multiply:<br />
> Add(x,A);<br />
> Multiply(x,A);<br />
Man kan invertere på to måder:<br />
> 1/A;<br />
> MatrixInverse(A);<br />
Man kan finde determinanten:<br />
> Determinant(A);<br />
1 + x 2<br />
1 3 + x<br />
<br />
<br />
x 2 x<br />
x 3 x<br />
3 −2<br />
−1 1<br />
3 −2<br />
−1 1<br />
Funktionen map kan bruges til at få anvendt en funktion på alle elementer i en matrix:<br />
> map(sqrt,A);<br />
1<br />
√<br />
1 2<br />
1 √ <br />
3<br />
Man behøver som vi så i afsnittet om sekvenser, lister og mængder ikke at anvende en indbygget funktion som<br />
sqrt, man kan anvende en funktion man selv har defineret.<br />
Man kan udtage enkelte elementer eller delmatricer:<br />
> A[2,2];<br />
> A[2,1..2];<br />
3<br />
[1, 3]<br />
Vi kan bruge funktionen LinearSolve til at løse matrixligninger. For at løse ligningen A x = b for en matrix A og<br />
vektorer x og b bruger man LinearSolve som følger:<br />
> LinearSolve(A,b);
7<br />
−3<br />
Man kunne også have løst ligningen direkte ved at premultiplicere b med A inverteret:<br />
> (1/A).b;<br />
<br />
7<br />
−3<br />
Vi kan benytte LinearSolve til at løse matrixligningen A X = B for matricer A, X, og B:<br />
> LinearSolve(A,B);<br />
<br />
7<br />
<br />
1<br />
−3 0<br />
Også her kunne vi have løst ligningen direkte:<br />
> (1/A).B;<br />
<br />
7<br />
<br />
1<br />
−3 0<br />
Der er imidlertid tilfælde hvor den direkte løsningsmetode ikke slår til: Når matricen A er singulær (og altså ikke<br />
kan inverteres):<br />
> A:=;<br />
> b:=;<br />
> (1/A).b;<br />
A :=<br />
b :=<br />
5 7<br />
0 0<br />
\QTR{_cstyle17}{Error, (in rtable/Power) singular matrix}\QTR{_cstyle17}{<br />
}<br />
Ligningen har uendelig mange løsninger. I sådan et tilfælde giver LinearSolve en parameteriseret løsning:<br />
> LinearSolve(A,b);<br />
⎡<br />
⎣<br />
3<br />
0<br />
<br />
3 7<br />
−<br />
5 5 _t02<br />
_t02<br />
Maple indfører selv den nødvendige parameter. For LinearSolve er Maples valg af parameternavn lidt mere “besværlig”<br />
end vi har set tidligere idet parameteren nummereres med et indeks. Ovenstående parameter _t02 er man<br />
nødt til at skrive _t0[2] når man skal referere til den.<br />
Til slut vil vi verificere den generelle løsning samt en bestemt løsning for _t02 = −6:<br />
> løs:=%;<br />
> A.løs=b;<br />
> eval(løs,_t0[2]=-6);<br />
> A.%=b;<br />
⎡<br />
løs := ⎣<br />
3<br />
0<br />
3<br />
0<br />
<br />
⎤<br />
⎦<br />
3 7<br />
−<br />
5 5 _t02<br />
<br />
=<br />
<br />
9<br />
−6<br />
<br />
=<br />
Man kan finde mindste kvadraters løsninger til overbestemte ligningssystemer (altså hvor man har flere ligninger<br />
en variable) med funktionen LeastSquares, for eksempel:<br />
_t02<br />
3<br />
0<br />
<br />
3<br />
0<br />
<br />
<br />
⎤<br />
⎦<br />
27
28<br />
> A:=; b:=;<br />
⎡ ⎤<br />
1 2<br />
A := ⎣ 1 3 ⎦<br />
2 5<br />
⎡ ⎤<br />
1<br />
b := ⎣ −2 ⎦<br />
2<br />
> løs:=LeastSquares(A,b);<br />
<br />
8<br />
løs :=<br />
−3<br />
Vi kan få fejlens størrelse i de enkelte ligninger som følger:<br />
> A.løs-b;<br />
Vi skulle måske lige vise at LinearAlgebra også kan regne med andet end tal i matrixelementerne:<br />
⎡<br />
⎣<br />
> A:=; b:=; løs:=LinearSolve(A,b); eval(løs,a=1);<br />
<br />
a 2<br />
A :=<br />
1 3<br />
<br />
b :=<br />
<br />
1<br />
−2<br />
⎡<br />
7<br />
⎤<br />
⎢<br />
løs := ⎢ 3 a − 2<br />
⎣ 2 a + 1<br />
−<br />
3 a − 2<br />
<br />
7<br />
−3<br />
⎥<br />
⎦<br />
> restart;<br />
18 Grafer for funktioner<br />
1<br />
1<br />
−1<br />
I dette afsnit vil nogle af mulighederne for at lave grafer i Maple blive illustreret. For en mere fuldstændig beskrivelse<br />
af de enkelte funktioner og især af de mange varianter man har muligheder for at angive med specielle koder henvises<br />
til Maples hjælpefunktion. Da grafer fylder meget vil noteforfatteren af hensyn til at holde sidetallet nede i flere af de<br />
følgende eksempler forsøge at vise flere faciliteter på en gang.<br />
For det første skal det nævnes at man blot ved at højreklikke på resultatet af en beregning hvis resultat er et udtryk<br />
får en menu frem hvorfra det er muligt at få lavet en graf af den funktion udtrykket repræsenterer. For det andet er<br />
det i vid udtsrækning muligt at tilpasse sine grafer ved at højreklikke på dem og bruge den fremkomne menu. Alle<br />
tilpasninger kan man også få ved at angive specielle koder i selve kaldet af funktionen der tegner grafen. Denne tilgang<br />
er en fordel hvis man gerne vil have den samme tilrettede graf hver gang man udfører arbejdsarket og ikke ønsker at<br />
starte forfra i menuerne hver gang. Da der er myriader af specielle koder til at vælge skrifttyper, farver, koordinatakser<br />
og så videre kan de ikke alle beskrives her, så som nævnt oven for henvises til online-hjælpen.<br />
Den basale funktion til at få tegnet en 2D graf hedder plot. Man kan kalde den simpelt hen med en funktion af én<br />
variabel og et interval funktionen skal tegners for:<br />
> plot(sin,0..2*Pi);<br />
⎤<br />
⎦
–0.5<br />
1<br />
0.5<br />
0<br />
–1<br />
1 2 3 4 5 6<br />
Man kan også angive et udtryk og så angive variabelnavnet hvor man angiver intervallet:<br />
> plot(sin(x)*cos(x^2),x=0..2*Pi);<br />
–0.5<br />
1<br />
0.5<br />
0<br />
–1<br />
1 2 3 4 5 6<br />
Man kan naturligvis også få tegnet funktioner man selv definerer. Og man kan få tegnet flere funktioner i samme<br />
graf ved at angive en liste af funktioner (eller som her: udtryk) der skal tegnes:<br />
> f:=x->x^3-4*x^2+7;<br />
f := x → x 3 − 4 x 2 + 7<br />
> plot([f(x),diff(f(x),x),int(f(x),x)],x=-3..6);<br />
x<br />
29
30<br />
80<br />
60<br />
40<br />
20<br />
–2 0<br />
2 4 6<br />
–20<br />
–40<br />
Maple vælger automatisk at tegne graferne for funktionerne i forskellige farver (hvilke farver kan man bestemme<br />
ved at angive en speciel kode til plot).<br />
Maple kan håndtere at tegne grafer med en x-akse der går til uendeligt. Aksen bliver da som det fremgår af<br />
nedenstående eksempel komprimeret (ikke lineært naturligvis). Med samme eksempel vil det blive vist hvordan man<br />
får en titel på sin graf.<br />
> plot(sin(x)/x,x=-infinity..infinity,title="Graf for sin(x)/x");<br />
Graf for sin(x)/x<br />
0<br />
-infinity infinity<br />
Maple kan ikke som standard håntere grafer for funktioner med singulariteter særlig godt. Tangens funktionen for<br />
eksempel har værdier gående mod både ∞ og −∞ ved π 2 + n π for heltallige n. Hvis man bare forsøger at tegne<br />
funktionen ser det ikke særlig godt ud:<br />
> plot(tan,0..2*Pi);<br />
x<br />
x
0<br />
–500<br />
–1000<br />
–1500<br />
1 2 3 4 5 6<br />
Det første man kan gøre er at begrænse intervallet på y-aksen ved at give endnu et argument til plot:<br />
> plot(tan,0..2*Pi,-4..4);<br />
4<br />
3<br />
2<br />
1<br />
0<br />
–1<br />
–2<br />
–3<br />
–4<br />
1 2 3 4 5 6<br />
Men Maple tegner stadig (næsten) lodrette streger i singulariteterne fordi plot som udgangspunkt går ud fra at<br />
funktionen der tegnes er kontinuert. Ved at angive den specielle kode “discont=true” til plot kan man gøre opmærksom<br />
på at funktionen der skal tegnes ikke er kontinuert:<br />
> plot(tan,0..2*Pi,-4..4,discont=true);<br />
31
32<br />
4<br />
3<br />
2<br />
1<br />
0<br />
–1<br />
–2<br />
–3<br />
–4<br />
1 2 3 4 5 6<br />
Det er muligt at lave parametriske grafer, det vil sige grafer hvor y ikke er en funktion af x men hvor sammenhængende<br />
værdier af x og y udtrykkes ved en parameter t. En parametrisk graf får man ved at give plot en liste med tre<br />
elementer: Et parametrisk udtryk for x, et parametrisk udtryk for y og et interval for parameteren.<br />
> plot([cos(t)/t,2*sin(t)/t,t=1..15]);<br />
1.5<br />
1<br />
0.5<br />
–0.2 0<br />
0.2 0.4<br />
Som man kan se af ovenstående graf samt en del af de foregående eksempler så er skalaen på de to akser ikke<br />
nødvendigvis den samme. Hvis det er vigtigt at skalaen er den samme (for eksempel så man kan måle afstande direkte<br />
i grafen) så kan man give plot funktionen den specielle kode “scaling=constrained”:<br />
> plot([cos(t)/t,2*sin(t)/t,t=1..15],scaling=constrained);
1.5<br />
0.5<br />
1<br />
–0.2 0 0.2 0.4<br />
Maple kan også lave tredimensionelle grafer af funktioner af to variable. Til dette benytter man funktionen plot3d<br />
som i sin brug ligner plot på mange måder (bortset fra at der er en ekstra akse at angive intervaller for).<br />
Her et eksempel hvor plot3d anvendes med et udtryk:<br />
> plot3d(sin(x)*cos(y),x=0..2*Pi,y=0..2*Pi);<br />
Og neden for et eksempel hvor plot3d anvendes med en funktion:<br />
> g:=(x,y)->sin(x)*sqrt(y);<br />
g := (x, y) → sin(x) √ y<br />
> plot3d(g,0..2*Pi,0..10,axes=boxed,labels=["sin","sqrt","combo"]);<br />
33
34<br />
combo<br />
3<br />
2<br />
1<br />
0<br />
–1<br />
–2<br />
–3<br />
0<br />
2<br />
4<br />
sqrt<br />
6<br />
8<br />
Som standard vises 3D grafer uden akser men det er muligt at angive at man ønsker en bestemt type akser ved at<br />
give specielle koder til plot3d, som for eksempel oven for hvor koden “axes=boxed” bevirker at akserne tegnes som<br />
en kasse uden om den tegnede overflade. Koden “labels=[...]” angiver hvilke betegnelser man ønsker på akserne (og<br />
kan udelades hvis man ikke ønsker betegnelser på).<br />
Det er analogt med 2D grafer muligt at lave parametriske 3D grafer. Syntaksen er en lille smule anderledes for<br />
3D end for 2D idet parameterintervallerne i plot3d angives uden for (efter) listen af de tre parametriske udstryk for<br />
koordinaterne (mens parameterintervallet angives inden i listen når man bruger plot).<br />
> plot3d([s*sin(s)*cos(t),s*cos(s)*cos(t),s*sin(t)],s=0..2*Pi,t=0..Pi);<br />
Der er utallige andre muligheder for at lave specielle grafer også i andre koordinater end de kartesiske: polære koordinater<br />
i 2D og sfæriske eller cylindriske koordinater i 3D. Eller man kan for eksempel lave grafer med logaritmiske<br />
akser. Brug hjælpefunktionen til at finde ud af mere.<br />
En enkelt interessant speciel type af grafer skal nævnes her uden at der dog vil blive givet eksempler: Animerede<br />
grafer. Det er muligt med de to funktioner animate og animate3d at få vist animerede grafer, altså grafer med en ekstra<br />
dimension der vises som en animation over tid. Da papir er et temmelig utaknemmeligt medie at vise animationer på<br />
10<br />
6<br />
5<br />
4<br />
3<br />
sin<br />
2<br />
1<br />
0
er det ikke muligt at beskrive det på nogen fornuftig måde i disse noter, men slå de to funktioner op i hjælpefunktionen<br />
og lav nogle eksperimenter!<br />
> restart;<br />
19 Lidt om at arbejde med data<br />
Man kan selvfølgelig indlæse (importere) og behandle numeriske data i Maple, for eksempel forsøgsdata man skal analysere<br />
eller bare have tegnet en fornuftig graf for (regnearksprogrammer er ofte ikke så gode til at lave videnskabelige<br />
grafer). Man kan også eksportere sine resultater igen.<br />
For at man kan importere data fra en fil skal filen være i mellemrums- eller tabulatorsepareret tekst<strong>format</strong>. Decimaltal<br />
skal angives med decimalpunktum (og ikke komma). Stort set alle programmer der har med tal at gøre kan<br />
eksportere i et sådant <strong>format</strong>. Lad os nu antage at filen “minfil.txt´´ indeholder følgende:<br />
1.2 3.4 5.6<br />
3 6 9<br />
4.5 6.7 8.9<br />
9 6 3<br />
Der er 4 linier med 3 tal i hver. Dette kan indlæses simpelt med:<br />
> data:=readdata("minfil.txt",3);<br />
data := [[1.2, 3.4, 5.6], [3., 6., 9.], [4.5, 6.7, 8.9], [9., 6., 3.]]<br />
Man er nødt til at angive antallet af kolonner, ellers indlæses kun en enkelt kolonne. Bemærk at resultatet af<br />
indlæsningen er en liste af lister, hvor hver af de indre lister svarer til en linie i filen. Dette <strong>format</strong> kan hvis man ønsker<br />
det direkte konverteres til en matrix med Matrix funktionen (se afsnittet om lineær algebra).<br />
Hvis tekstfilen, der skal indlæses, indeholder andet end kommatal (for eksempel bogstavkoder i visse kolonner)<br />
er man nødt til mere detaljeret at angive <strong>format</strong>et af kolonnerne, ellers kløjes Maple i det. Se i hjælpen for readdata<br />
for at se de mange muligheder, her skal blot nævnes at man i stedet for antallet af kolonner kan angive en liste med<br />
kolonnernes datatyper, for eksempel:<br />
> readdata("minfil.txt",[string,float,integer]);<br />
[[“1.2”, 3.4, 5], [“3”, 6., 9], [“4.5”, 6.7, 8], [“9”, 6., 3]]<br />
Noget af det man typisk er interesseret i at tegne grafer for data. Antag at hver af de tre kolloner svarer til en målt<br />
egenskab og man vil vise alle sine målinger i et 3D punkt-plot:<br />
> with(plots):<br />
Warning, the name changecoords has been redefined<br />
> pointplot3d(data,view=[0..10,0..10,0..10],scaling=constrained,axes=bo<br />
> xed,symbol=circle,labels=["x","y","z"],orientation=[-100,70],color=bla<br />
> ck);<br />
35
36<br />
z<br />
10<br />
8<br />
6<br />
4<br />
2<br />
10<br />
8<br />
6<br />
y<br />
4<br />
2<br />
0 2 4 6 8 10<br />
0<br />
x<br />
Man kan også få punkterne forbundet med liniestykker i stedet. Hvis man ønsker både liniestykker og tydelig<br />
markering af punkterne kan det laves som to separate pointplot3d plots og kombineres med display3d:<br />
> p1:=pointplot3d(data,symbol=circle,color=black):<br />
> p2:=pointplot3d(data,style=line,color=red):<br />
> display3d(p1,p2,view=[0..10,0..10,0..10],scaling=constrained,axes=box<br />
> ed,labels=["x","y","z"],orientation=[-100,70]);<br />
z<br />
10<br />
8<br />
6<br />
4<br />
2<br />
10<br />
8<br />
6<br />
y<br />
4<br />
2<br />
0 2 4 6 8 10<br />
0<br />
x<br />
Det var selvfølgelig også muligt at man ville vise bare den anden kolonne mod den første:<br />
> data12:=data[1..4,1..2];<br />
data12 := [[1.2, 3.4], [3., 6.], [4.5, 6.7], [9., 6.]]<br />
> pointplot(data12,symbol=cross,scaling=constrained,view=[0..10,0..10],<br />
> labels=["x","y"]);
y<br />
10<br />
8<br />
6<br />
4<br />
2<br />
0<br />
2 4 6 8 10<br />
Hvis man på tilsvarende måde vil vise tredie kolonne mod første må man være lidt mere snedig og bruge map for<br />
at generere den ønskede liste af talpar:<br />
> data13:=map(r->[r[1],r[3]],data);<br />
data13 := [[1.2, 5.6], [3., 9.], [4.5, 8.9], [9., 3.]]<br />
Det kan jo også være at man ønsker at transformere lidt på værdierne og for eksempel lave et enkeltlogaritmisk<br />
plot:<br />
> pointplot(map(r->[log[10](r[1]),r[2]],data13),style=line,labels=["log<br />
> (x)","z"]);<br />
9<br />
8<br />
7<br />
z 6<br />
5<br />
4<br />
3<br />
0.2 0.4 0.6 0.8<br />
x<br />
log(x)<br />
Ofte ønsker man at tilpasse en kurve så den går igennem (eller tæt på) ens datapunkter. Dette kan man gøre med<br />
pakken CurveFitting. Med denne pakke kan man for eksempel lave lineær regression, tilpasse polynomier eller tilpasse<br />
med stykkevis polynomielle kurver (splines).<br />
> with(CurveFitting):<br />
Som eksempel vil brugen af funktionen LeastSquares fra pakken CurveFitting blive beskrevet. Denne er ikke at<br />
forveksle med funktionen af samme navn fra pakken LinearAlgebra (som jo bruges til at finde mindste kvadraters<br />
37
38<br />
løsninger til overbestemte ligningssystemer).<br />
Hvis man bare skriver<br />
> LeastSquares(data13,x);<br />
8.812137559 − 0.494268374915711906 x<br />
får man den linie, der bedst (i mindste kvadraters betydning) beskriver datapunkterne. Nu er en linie næppe nogen<br />
god interpolation af disse datapunkter, det kunne tænkes at et andengradspolynomium ville være bedre. Man kan til<br />
LeastSquares angive hvilken form den funktion, man ønsker at tilpasse med, skal have. Funktionen skal være lineær i<br />
sine parametre, men ikke nødvendigvis lineær i funktionsvariablen. Så vi kan forsøge med et andengradspolynomium:<br />
> kurve1:=LeastSquares(data13,x,curve=a*x^2+b*x+b);<br />
kurve1 := 2.833792084 − 0.313247450643479031 x 2 + 2.83379208407862526 x<br />
Et alternativ kunne være et andengradspolynomium i logaritmen til x i stedet:<br />
> kurve2:=LeastSquares(data13,x,curve=a*log(x)^2+b*log(x)+c);<br />
kurve2 := 3.775907628 + 10.5396548308231992 ln(x) − 4.93559635161722721 ln(x) 2<br />
Vi kan tegne de to kurver sammen med de oprindelige punkter for at sammenligne interpolationerne:<br />
> display(pointplot(data13,symbol=circle),plot([kurve1,kurve2],x=1..10)<br />
> );<br />
8<br />
6<br />
4<br />
2<br />
0<br />
2 4 6 8 10<br />
Som det sidste i dette afsnit skal kort nævnes hvordan man får sine data eksporteret som en tabulatorsepareret<br />
tekstfil. Det gør man med funktionen writedata, der er fuldstændig analog med readdata, inklusiv muligheder der er<br />
for at angive kolonne<strong>format</strong> (kommatal er standard):<br />
> writedata("nyfil.txt",data13);<br />
> restart;<br />
x
20 Oversigt over Maple til husbehov<br />
Denne oversigt er i <strong>PDF</strong> udgaven af disse noter (som du læser nu) tilrettet fra Maple arbejdsarket for at få en klarere<br />
opstilling. I Maple kan man ikke opstille tekst i tabeller og kolonner og oversigten kommer dermed til at se noget<br />
mindre overskuelig ud.<br />
For en beskrivelse af funktioner til at løse matematiske problemer så som at forsimple udtryk, løse ligninger et<br />
cetera henvises til de relevante afsnit i noterne.<br />
Maple Indtastning:<br />
indtastning; Udfør det indtastede, vis resultatet<br />
indtastning: Udfør det indtastede, vis ikke resultatet<br />
Ctrl-T Skift til indtastning af tekst<br />
Ctrl-M Indtast matematisk udtryk i tekst<br />
Ctrl-J Indsæt en ny beregningsgruppe efter denne<br />
Ctrl-K Indsæt en ny beregnningsgruppe før denne<br />
?emne Slå et emne op i online hjælpen<br />
Hent tidligere resultater:<br />
% Seneste resultat<br />
%% Næstseneste resultat<br />
%%% Tredieseneste resultat<br />
Bindinger og pakker:<br />
navn:=udtryk Bind navn til værdien af udtryk<br />
unassign(’navn’) Gør navn ubundet igen<br />
with(pakke) Indlæs pakke<br />
restart Fjern alle bindinger og indlæste pakker<br />
Almindelig regning:<br />
x+y Addition<br />
x-y Subtraktion<br />
x*y Multiplikation<br />
x/y Division<br />
xˆy Potensopløftning<br />
evalf(udtryk) Tilnærm værdien af et udtryk med decimaltal<br />
evalf(udtryk,n) Det samme, men med n decimalers præcision<br />
Trigonometriske funktioner:<br />
sin Sinus<br />
cos Cosinus<br />
tan Tangens<br />
cot Cotangens<br />
arcsin Arcus sinus<br />
arccos Arcus cosinus<br />
arctan Arcus tangens<br />
arccot Arcus cotangens<br />
Pi Konstanten π<br />
Andre almindelige funktioner:<br />
sqrt Kvadratroden<br />
exp Eksponentialfunktionen<br />
ln Den naturlige logaritme<br />
log Også den naturlige logaritme<br />
log[a] Logaritmen med grundtal a<br />
39
40<br />
Brugerdefinerede funktioner:<br />
x->udtryk Unavngiven funktion af variablen x<br />
(x,y)->udtryk Unavngiven funktion af flere variable<br />
f :=x->udtryk Definer funktionen f af variablen x<br />
g:=(x,y)->udtryk Definer funktionen g af flere variable<br />
unapply(udtryk,x) Lav et udtryk hvor x indgår om til en funktion af x<br />
unapply(udtryk,x,y) Lav et udtryk om til en funktion af flere variable<br />
Differentiering, integration, grænseværdier:<br />
diff(udtryk,x) Differentier et udtryk med hensyn til x<br />
diff(udtryk,x,y) Differentier et udtryk med hensyn til først x og dernæst y<br />
Diff Det samme som diff, men rent symbolsk (forsinket)<br />
D(f ) Den afledte funktion af funktionen f af en enkelt variabel<br />
int(udtryk,x) Integrer et udtryk over x<br />
int(udtryk,x=a..b) Integrer et udtryk over intervallet [a,b]<br />
Int Det samme som int, men rent symbolsk (forsinket)<br />
limit(udtryk,x=værdi) Grænseværdien for et udtryk for x gående mod en given værdi<br />
limit(udtryk,x=værdi,left) Grænseværdien for et udtryk for x gående mod en given værdi fra venstre<br />
limit(udtryk,x=værdi,right) Grænseværdien for et udtryk for x gående mod en given værdi fra højre<br />
limit(udtryk,x=infinity) Grænseværdien for et udtryk for x gående mod uendelig<br />
limit(udtryk,x=-infinity) Grænseværdien for et udtryk for x gående mod minus uendelig<br />
Limit Det samme som limit, men rent symbolsk (forsinket)<br />
value(udtryk) Tag værdien af et udtryk der indeholder Diff, Int eller Limit<br />
Sekvenser, lister og mængder:<br />
udtryk1,udtryk2, ... En sekvens<br />
[udtryk1,udtryk2,...] En liste<br />
{udtryk1,udtryk2,...} En mængde<br />
X[i] Indeksering; element nummer i ud af sekvensen/listen/mængden X<br />
X[i..j] Elementerne i til j af sekvensen/listen/mængden X, som en ny sekvens/liste/mængde<br />
A union B Foreningsmængden af mængderne A og B<br />
A intersect B Fællesmængden for mængderne A og B<br />
A minus B Mængdedifferensen mellem mængderne A og B<br />
seq(udtryk,x=i..j) Generer en sekvens af værdier hvor x i udtrykket erstattes af heltallene fra i til j<br />
map(funktion,A) Anvend en funktion på hvert element i (listen/mængden/tabellen) A<br />
select(funktion,A) Udvælg de elementer fra A for hvilke funktionen giver værdien sand<br />
Tabeller:<br />
array(m..n) Opret en tabel med pladser indekseret fra m til n<br />
array(m..n,liste) En tabel indekseret fra m til n, de første elementer initialiseres fra en liste<br />
array(liste) En tabel indekseret fra 1 indeholdende værdierne fra en liste<br />
T[i] Element nummer i fra tabellen T<br />
T[i]:=udtryk Tildel et udtryk til element i i tabellen T<br />
array(k..l,m..n) Opret en todimensionel tabel<br />
T[i,j] Element i,j fra en todimensionel tabel T<br />
table() Opret en (tom) associativt indekseret tabel<br />
table(liste) Opret en associativt indekseret tabel fra en liste elementer af formen indeks=værdi<br />
A[indeks] Elementet i den associativt indekserede tabel A associeret til indeks<br />
A[indeks]:=udtryk Lav en associering fra indeks til udtryk i den associativt indekserede tabel A<br />
A[indeks]:=’A[indeks]’ Fjern associering til indeks i den associativt indekserede tabel A<br />
print(X) Vis indholdet af tabellen X<br />
Substitutioner:<br />
eval(udtryk,x=værdi) Evaluer et udtryk hvor en given værdi substitueres for x<br />
eval(udtryk,mængde) Tilsvarende, med flere substitutioner angivet som en mængde ligninger venstre=højre<br />
eval(udtryk,liste) Tilsvarende, med flere substitutioner angivet som en liste af ligninger venstre=højre