Zjednodušování a úpravy výrazů

Zde ukážeme některé přikazy pro zjednodušování výrazů a funkcí. Jedním ze základních příkazů je simplify .

> simplify(x^3/x^2);
simplify(cos(x)^2+sin(x)^2);

x

1

Někdy je nutno přidat parametry (viz help).

> simplify((x^y)^z);
simplify((x^y)^z,`symbolic`);

(x^y)^z

x^(y*z)

Mnohdy však je nuttné uvést i podmínky pro zjednodušení.

> g:=sqrt(x^2);

g := sqrt(x^2)

> simplify(g);

csgn(x)*x

> simplify(g,assume=real);

abs(x)

> simplify(g,assume=positive);

x

Lze definovat podmínku pro proměnnou x i globálně, což se potom projeví i ve značení.

> sqrt(x^2);
simplify(%);

sqrt(x^2)

csgn(x)*x

> assume(x>0);
simplify(%%);

x

> x:='x';

x := 'x'

Podmínkou pro výsledek může být i rozsah hodnot.

> simplify(arcsin(sin(x)));
simplify(%,assume=RealRange(-Pi/2,Pi/2));
simplify(%,`arctrig`,`symbolic`);

arcsin(sin(x))

x

x

Pro úpravu a zjednodušování racionálních funkcí slouží příkaz normal , jehož některé vlastnosti zde ukážeme.

> normal( 1/x+x/(x+1) );

(x+1+x^2)/(x*(x+1))

> normal( 1/x+x/(x+1), expanded );

(x+1+x^2)/(x^2+x)

Při prvním čtení lze vynechat -- Normal

Dále uvedeme ještě několik příkladů, v nichž použijeme funkce combine , expand , a convert .

> convert(cos(x),exp);
normal(%);

1/2*exp(I*x)+1/2/exp(I*x)

1/2*(exp(I*x)^2+1)/exp(I*x)

> normal(combine(%%));
simplify(%);

1/2*exp(I*x)+1/2*exp(-I*x)

cos(x)

> expand(cos(3*x+y));

4*cos(y)*cos(x)^3-3*cos(y)*cos(x)-4*sin(y)*sin(x)*c...

> combine(%);
%=convert(%,tan);

cos(3*x+y)

cos(3*x+y) = (1-tan(3/2*x+1/2*y)^2)/(1+tan(3/2*x+1/...

Mnohé další úpravy je možné provést známou funkcí convert , jejíž něktré vlastnosti byly uz ukázány v minulém výkladu. Na tomto místě zmíníme ještě další užitečnou informaci. Budeme-li chtít vyčíslit složitý polynom vysokého stupně, potom se vyplatí uptavit jeho tvar podle následující jednoduché ukázky.

> sort(expand(p1^2));

25*x^6+30*x^5+29*x^4+52*x^3+28*x^2+16*x+16

> ### WARNING: persistent store makes one-argument readlib obsolete
readlib(cost)(%);

Error, could not find `cost` in the library

> convert(%%,'horner');
codegen[cost](%);

cos(3*x+y) = (1-tan(3/2*x+1/2*y)^2)/(1+tan(3/2*x+1/...

0