Section : Pour essayer
Précédent : Intégrales
Suivant : Itérations

Résolutions

La fonction solve résoud les équations de façon formelle quand c'est possible. Pour obtenir une valeur numérique il faut appliquer float à la forme non évaluée, obtenue par hold. Des méthodes numériques particulières sont disponibles dans le module numeric.
solve(x^4=a^4);
solve(x^4=a^4, x);
solve(a*x^2+b*x+c);
solve(a*x^2+b*x+c, x);
p:=x^4+x^3+x^2+x+1: s:=solve(p,x);
simplify(expand(subs(p,x=op(s)[1])));
solve({x/(y+1)=z, y/(x+1)=t}, {x,y});
float(hold(solve)(x^7 + 3*x^2 = 1, x));
float(hold(solve)(x^7 + 3*x^2 = 1,x=-1..1));
numeric::newton(x^7 + 3*x^2 = 1,x=-1..1);
La solution de certaines équations (par exemple trigonométriques) peut être un ensemble discret. Celle d'un système d'inéquations peut être un ensemble d'intervalles.
solve(sin(x)=cos(x),x);
solve(exp(2*x)+2*exp(x)+1=z,x);
solve(abs(x-1)>2,x);
solve({x^2>4,x<5},x);
Les systèmes linéaires, dégénérés ou non, se résolvent plutôt à l'aide de linsolve. Pour éviter d'avoir à taper le système complet, on peut aussi utiliser la fonction linearSolve du module d'algèbre linéaire linalg, qui prend comme arguments la matrice du système et son second membre.
linsolve({2*x+y+z=6,2*x+y+2*z=10,x+3*y+z=10},{x,y,z});
linsolve({x+y+z=6,2*x+y+2*z=10,x+3*y+z=10},{x,y,z});
linsolve({2*x+y+z=5,2*x+y+2*z=10,x+3*y+z=10},{x,y,z});
On peut appliquer solve à une équation différentielle, formée à partir d'un ensemble d'expressions par ode (ordinary differential equation). Là aussi une fonction de calcul numérique est disponible.
solve(ode(y'(x)-x*y(x)=1, y(x)));
solve(ode(x^2*diff(y(x),x)+3*x*y(x)=sin(x)/x,y(x)));
solve(ode({y''(x)+4*y(x)=sin(2*x), y(0)=0, D(y)(0)=0}, y(x)));
systeme:={diff(x(t),t)-x(t)+y(t)=0,diff(y(t),t)-x(t)-y(t)=0}:
solution:=solve(ode(systeme,{x(t),y(t)}));
eval(subs([op(systeme)],op(solution)));
f := proc(t,y) begin array(1..2,[y[2], t*y[1]^3]) end_proc:
numeric::odesolve(0..2, f, [0,1], Stepsize=0.1, Alldata=2);
On peut également former une équation de récurrence à l'aide de rec, avant de lui appliquer solve.
solve(rec(r(n+2)-2*r(n+1)+r(n)=2,r(n)));
solve(rec(r(n+2)-2*r(n+1)+r(n)=2,r(n),{r(0)=-1,r(1)=m}));