26.07.2013 Views

PDF-format

PDF-format

PDF-format

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!