Maple
Son bon usage en mathématiques
Philippe Dumas, Xavier Gourdon
Springer-Verlag, 1997
Code Maple du Chapitre 2, Livre second.
# section 1, page 141.
A:=array(1..2,1..4,[[1,2,3,4],[4,3,2,1]]);
A:=matrix(2,4,[[1,2,3,4],[4,3,2,1]]);
A:=matrix(2,4,[1,2,3,4,4,3,2,1]);
B:=matrix(4,3,proc(i,j) i+j end);
C:=array(1..3,1..3,antisymmetric):
C[3,2]:=p:C[1,3]:=q:C[2,1]:=r:
print(C);
evalm(A&*B&*C);
linalg[multiply](A,B,C);
coeffA:=rand(-10..10):
n:=5:
A:=matrix(n,n,[seq(coeffA(),i=1..n^2)]);
sol:=NULL:
for k to n^2 while sol=NULL do
Equ:=evalm(add(lambda[i]*A^i,i=0..k-1)+A^k);
Inc:={seq(lambda[i],i=0..k-1)};
sol:=solve({seq(seq(Equ[i,j],j=1..n),i=1..n)},Inc)
od:
nu:=k-1:
mu:=subs(sol,add(lambda[i]*x^i,i=0..nu-1)+x^nu);
with(linalg):
P:= companion(x^3+x^2,x):
Q:=companion(x^3,x):
R:=companion(x^3-x^2,x):
Z := matrix(3,3,0):
A:=blockmatrix(3,3,Z,-R,Q,R,Z,-P,-Q,P,Z);
n:=coldim(A):
M:=array(1..n,1..n,identity):
d[0]:=0:
for k to n do
M:=evalm(A&*M);
N[k]:=nullspace(M);
d[k]:=nops(N[k])
od:
seq(d[k],k=0..n);
seq(N[k],k=0..9);
N[1];
N[2];
if d[1]>0 then
K:=augment(op(N[1]));
r:=d[1];
for k from 2 to n do
if d[k]>d[k-1] then
for v in N[k] do
tmpK:=augment(K,v);
if rank(tmpK)>r then
K:=eval(tmpK);
r:=r+1;
fi;
od
fi
od
fi:
eval(K);
AK[1]:=K:
for k from 2 to n do AK[k]:=evalm(A &* AK[k-1]) od:
seq(eval(AK[k]),k=1..n);
S:=T;
K:=tmpK;
if rank(tmpK)>r then
K:=tmpK;
r:=r+1
fi;
f:=(x-2)*(x+1)^2:
rec:=add(coeff(f,x,k)*u(n+k),k=0..degree(f,x));
sol:=rsolve({rec,seq(u(k)=a[k],k=0..degree(f,x))},{u(n)});
g:=q^n*n^nu:
matrix(3,3,[seq(subs(n=nn,[seq(subs(i,g),
i=[{q=2,nu=0},{q=-1,nu=0},{q=-1,nu=1}])]),nn=0..2)]);
linalg[det](");
sol:=rsolve({rec=n},{u(n)});
remove(has,subs(sol,u(n)),u);
# section 3, page 153.
# probleme page 155.
triangularmultiply:=proc(A::matrix,B::matrix)
local M,n,i,j,k;
n:=linalg[coldim](A);
M:=array(1..n,1..n,sparse);
for i to n do
for j from i to n do
for k from i to j do M[i,j]:=M[i,j]+A[i,k]*B[k,j] od
od
od;
eval(M)
end: # triangularmultiply
n:=10:
H:=matrix(n,n,proc(i,j) 1/(i+j-1) end);
# fin probleme.
# probleme page 157.
a:=(x-2)^3:
b:=(x+1)^2:
p:=a*b;
q:=collect(p,x):
d:=degree(q,x):
C:=linalg[companion](q,x);
haphazard:=rand(-10..10):
P:=matrix(d,d,[seq(haphazard(),k=1..d^2)]):
if linalg[det](P)=0 then ERROR(`P is singular. Try again!`) fi;
L:=evalm(P^(-1) &* C &* P);
evalm(subs(x=L,p));
A:=evalm(subs(x=L,a)):
B:=evalm(subs(x=L,b)):
polytodiffop:=proc(p,x,t)
local q,d,opalg,k,z;
global _z,_opalg;
if type(p,polynom(ratpoly,x)) then
q:=collect(p,x);
d:=degree(q,x);
opalg :=add(coeff(q,x,k)*'diff'(z,[t$k]),k=0..d);
subs(_opalg=opalg,z=_z,proc(_z::algebraic) _opalg end)
else ERROR(`polytodiffop expects its first argument,p, to be
a polynom in`,x,`with coefficients of type
ratpoly, but received`,p)
fi
end: # polytodiffop
polytodiffop(x^2+1,x,t)(z(t));
dsolve(polytodiffop(x^2+1,x,t)(z(t)),z(t));
a:=(x-2)^3:
b:=(x+1)^2:
A:=polytodiffop(a,x,t):
B:=polytodiffop(b,x,t):
A(y(t)),B(y(t));
A(B(y(t)));
eval(subs(y(t)=A(y(t)),B(y(t))));
p:=a*b: P:=polytodiffop(p,x,t): P(y(t));
# section 4, page 160.
# probleme page 160.
u:=binomial(n,k)*binomial(k,m):
imax:=1: jmax:=1:
equ[1]:=add(add(a[i,j]*subs(n=n-i,k=k-j,u),j=0..jmax),i=0..imax):
equ[2]:=expand(equ[1]/u);
equ[3]:=collect(numer(equ[2]),k);
sys:={seq(coeff(equ[3],k,i),i=0..degree(equ[3],k))}:
SOL:=solve(sys,{seq(seq(a[i,j],j=0..jmax),i=0..imax)});
rec[1]:=subs(SOL,add(add(a[i,j],j=0..jmax)*s(n-i),i=0..imax)):
rec[2]:=numer(rec[1]):
sol:=rsolve({rec[2]},s(n));
subs(n=m,sol):
solve("=1,s(0)):
sol:=subs(s(0)=",sol);
convert(",binomial):
combine(",power);
# fin probleme.
# section 5, page 164.
# exercice 2.1, page 164.
n:=3:
A:=array(1..n,1..n,antisymmetric):
sol:=NULL:
for k to n^2 while sol=NULL do
Equ:=evalm(add(lambda[i]*A^i,i=0..k-1)+A^k);
Inc:={seq(lambda[i],i=0..k-1)};
sol:=solve({seq(seq(Equ[i,j],j=1..n),i=1..n)},Inc)
od:
nu:=k-1:
mu:=subs(sol,add(lambda[i]*x^i,i=0..nu-1)+x^nu):
collect(mu,x);
# fin exercice 2.1.
# exercice 2.2, page 165.
f:=(x-lambda)^3:
rec:=add(coeff(f,x,k)*u(n+k),k=0..degree(f,x));
sol:=rsolve({rec,seq(u(k)=a[k],k=0..degree(f,x))},{u(n)}):
collect(sol,{n},factor);
f:=(x^2+1)*(x+1)^2:
rec:=add(coeff(f,x,k)*u(n+k),k=0..degree(f,x));
sol:=rsolve({rec,seq(u(k)=a[k],k=0..degree(f,x))},{u(n)}):
collect(evalc(sol),{cos,sin,n},factor);
# fin exercice 2.2.
# exercice 2.3, page 166.
decompose:=proc(P,basis)
local Q,n,d,Equ,coord,i,j,k,sys,inc,sol;
Q:=evalm(P);
n:=linalg[coldim](Q);
d:=nops(basis);
Equ:=evalm(Q-add(coord[k]*basis[k],k=1..d));
sys:={seq(seq(Equ[i,j],j=1..n),i=1..n)};
inc:={seq(coord[k],k=1..d)};
sol:=solve(sys,inc);
if sol=NULL then FAIL
else subs(sol,add(coord[k]*basis[k],k=1..d))
fi
end: # decompose
M:=matrix(3,3,[x+y+z,-x-y,-x-z,-x-z,x+y+z,-x-y,-x-y,-x-z,x+y+z]):
B[1]:=subs(x=1,y=0,z=0,eval(M)):
B[2]:=subs(x=0,y=1,z=0,eval(M)):
B[3]:=subs(x=0,y=0,z=1,eval(M)):
Basis:=[B[1],B[2],B[3]]:
decompose(M,Basis);
Mu:=subs(x=xi,y=eta,z=zeta,eval(M)):
P:=evalm(M &* Mu):
decompose(P,Basis);
decompose(M&*Mu-Mu&*M,Basis);
Id:=array(1 .. 3,1 .. 3,identity):
decompose(Id,Basis);
linalg[det](M);
P:=evalm(M^(-1)):
decompose(P,Basis);
C:=matrix(3,3,[0,0,1,1,0,0,0,1,0]);
newBasis:=[Id,C,C^2]:
map(decompose,newBasis,Basis);
map(decompose,Basis,newBasis);
B[0]:=array(1..2,1..2,identity):
B[1]:=matrix(2,2,[0,1,-1,0]):
B[2]:=matrix(2,2,[0,I,I,0]):
B[3]:=matrix(2,2,[I,0,0,-I]):
Basis:=[seq(B[i],i=0..3)]:
H:=alpha*B[0]+beta*B[1]+gamma*B[2]+delta*B[3]:
HH:=a*B[0]+b*B[1]+c*B[2]+d*B[3]:
decompose(H&*HH,Basis);
# fin exercice 2.3.
# exercice 2.4, page 168.
linalg[sylvester](a*x^2+b*x+c,`a'`*x^2+`b'`*x+`c'`,x):
linalg[det](");
f:=x^3+p*x+q;
linalg[sylvester](f,diff(f,x),x):
linalg[det](");
f:= 7*x^2-7*x*y+7*y^2+146*x-149*y-189:
g:=x^2-2*y^2-1:
linalg[sylvester](f,g,y);
S:=collect(linalg[det]("),x);
sol:=[solve(S,x)]:
sol:=evalc(sol):
sol:=remove(has,sol,I);
for s in sol do
s,op(solve(subs(s,{f,g}),y))
od;
# fin exercice 2.4.
# exercice 2.6, page 170.
H:=matrix(2,2,[2,1,1,2]):
h:=(2*x+1)/(x+2):
HH:=H:
hh:=h:
for k to 10 do
HH:=evalm(HH&*H);
hh:=normal(subs(x=h,hh))
od;
H:=matrix(2,2,[a,b,c,d]):
h:=(a*x+b)/(c*x+d):
`H'`:=matrix(2,2,[`a'`,`b'`,`c'`,`d'`]);
`h'`:=(`a'`*x+`b'`)/(`c'`*x+`d'`);
evalm(H &* `H'`);
collect(normal(subs(x=`h'`,h)),x);
EV:=[linalg[eigenvects](H)]:
lambda:=EV[1][1];
mu:=EV[2][1];
sol:=[solve(h=x,x)];
if radnormal(sol[1]-op([1,3,1],EV[1])/op([1,3,1],EV[2]))=0
then alpha:=sol[1]: beta:=sol[2]:
else alpha:=sol[2]; beta:=sol[1]
fi:
k:=normal(((h-alpha)/(h-beta))/((x-alpha)/(x-beta)),expanded):
radnormal(k-lambda/mu);
# fin exercice 2.6.