Maple expressies nader bekeken

Structuur van een uitdrukking

Om vlot met Maple te kunnen werken is het interessant te weten hoe dit programma mathematische uitdrukkingen intern structureert. Eens men dit goed begrijpt is het manipuleren van uitdrukkingen een peulschil.

> Expr := (a*x + b)/(c*x + d) + e;

Expr := (a*x+b)/(c*x+d)+e

De functie 'op' is bijzonder handig: ze geeft de sequence waaruit een uitdrukking opgebouwd is.

> Seq := op(Expr);

Seq := (a*x+b)/(c*x+d), e

Deze sequence is uiteraard gedefinieerd t.o.v. de operator met de laagste prioriteit, de optelling in dit geval. Men kan deze vinden door gebruik te maken van 'op', zoals geillustreerd in het onderstaande voorbeeld.

> Operator := op(0, Expr);

Operator := `+`

Een sequence kan getransformeerd worden in een uitdrukking met behulp van de krachtige 'convert' functie.

> convert([Seq], Operator);

(a*x+b)/(c*x+d)+e

> Expr := 'Expr': Seq := 'Seq': Operator := 'Operator':

Selecteren van delen van een uitdrukking

Algemeen

De situatie wordt natuurlijk iets ingewikkelder indien men bijvoorbeeld geinteresseerd is in de factor waarmee x vermenigvuldigd wordt in de noemer van de breuk.

> Expr := (a*x + b)/(c*x + d) + e;

Expr := (a*x+b)/(c*x+d)+e

> op([1,2,1,1,1], Expr);

c

Het is beter dit stap voor stap te doen tenzij men zeer veel ervaring met Maple heeft. Het bekomen van de eerste term uit de som is uiteraard eenvoudig, maar hoe stelt Maple een breuk voor?

> op(op(1, Expr));

a*x+b, 1/(c*x+d)

Een breuk is dus een product van de teller met het inverse van de noemer. Deze factor kan men selecteren door:

> op([1,2], Expr);

1/(c*x+d)

> op(0,op([1,2], Expr));

`^`

De operator van deze factor is de machtsverheffing, het grondtal is dus het eerste deel van de uitdrukking.

> op([1,2,1], Expr);

c*x+d

De eerste term selecteren is triviaal.

> op([1,2,1,1], Expr);

c*x

En uiteindelijk krijgt men:

> op([1,2,1,1,1], Expr);

c

De tweede term in de noemer is dus:

> op([1,2,1,2], Expr);

d

> Expr := 'Expr':

Enkele speciale gevallen

Teller en noemer van een breuk

Het is erg eenvoudig de teller of de noemer van een uitdrukking te selecteren:

> Expr := c/(d*x^2 + e);

Expr := c/(d*x^2+e)

> numer(Expr);

c

> denom(Expr);

d*x^2+e

Men kan dit resultaat uiteraard ook bereiken door uitsluitend gebruik te maken van de 'op' functie.

> Expr := 'Expr':

Leden van een vergelijking

Bij het oplossen van vergelijkingen wil men soms verder werken met de wortels zonder een substitutie uit te voeren. Neem bijvoorbeeld:

> Opl := solve({a*x + b*y = c,d*x + e*y = f}, {x, y});

Opl := {x = -(b*f-c*e)/(a*e-d*b), y = (a*f-d*c)/(a*e-d*b)}

Men kan nu eenvoudig het rechter lid van deze vergelijkingen nemen:

> yOpl := rhs(Opl[1]);

yOpl := -(b*f-c*e)/(a*e-d*b)

> xOpl := rhs(Opl[2]);

xOpl := (a*f-d*c)/(a*e-d*b)

> Opl := 'Opl': xOpl := 'xOpl': yOpl := 'yOpl':

Substitutie van delen van een uitdrukking

> Expr1 := (a*x + b)/(c*x + d) + e;

Expr1 := (a*x+b)/(c*x+d)+e

Wil men deze term d nu vervangen door f(x), dan kan dit op twee manieren:

> subs(d = f(x), Expr1);

(a*x+b)/(c*x+f(x))+e

> subsop([1,2,1,2] = f(x), Expr1);

(a*x+b)/(c*x+f(x))+e

Uiteraard is de eerste vorm veruit de eenvoudigste, maar in sommige omstandigheden moet men wel met de tweede werken, zoals in het volgende voorbeeld geillustreerd wordt.

> Expr2 := subs(b = f(x), d = f(x), Expr1);

Expr2 := (a*x+f(x))/(c*x+f(x))+e

Indien men nu de functie f in de noemer wil vervangen door g, dan is men wel verplicht met 'subsop' te werken.

> subsop([1,2,1,2,0] = g, Expr2);

(a*x+f(x))/(c*x+g(x))+e

Sommige substituties zijn echter moeilijk of niet uit te voeren met de tot nog toe geziene Maple functies. Neem als voorbeeld de volgende uitdrukking waarin x^2 vervangen moet worden door y.

> Expr3 := a*x^4 + b*x^3 + c*x^2 + d*x + e;

Expr3 := a*x^4+b*x^3+c*x^2+d*x+e

> subs(x^2 = y, Expr3);

a*x^4+b*x^3+c*y+d*x+e

Dit levert duidelijk niet het gewenste resultaat.  De functie 'algsubs' komt hier van pas.

> algsubs(x^2 = y, Expr3);

(b*y+d)*x+e+a*y^2+c*y

Of beter:

> algsubs(x = sqrt(y), Expr3);

e+a*y^2+c*y+b*y^(3/2)+d*y^(1/2)

> Expr1 := 'Expr1': Expr2 := 'Expr2': Expr3 := 'Expr3':

Functies toepassen op een deel van een uitdrukking