y. D'une part, la commande
correcte est y=x.*sin((1)./x). D'autre part, si n est
impair, le vecteur x contient 0
et le calcul de y
renvoie un message de division par 0
. En outre, les variations
de h=0.1; uh = 1/h; x = %pi*[floor(uh/%pi):0.1:ceil(uh*1000/%pi)]; x(1)=[]; X = (1)./x; Y = X.*sin(x); clf(); plot2d(X,Y);Le vecteur des abscisses
X a pour valeurs extrêmes
des valeurs proches de function y=xsin1(h) // // Represente le graphe de la fonction y=x*sin(1/x) // entre -h et h. Retourne la valeur en h. // uh = 1/h; y = h*sin(uh); x = %pi*[floor(uh/%pi):0.1:ceil(uh*1000/%pi)]; x(1)=[]; X = (1)./x; Y = X.*sin(x); clf(); plot2d(-X,Y,style=5,rect=[-h,-h,h,h],nax=[1,10,1,10]); plot2d([-X($),0,X($)],[Y($),0,Y($)],style=5,frameflag=0); // relie parties paires et impaires plot2d(X,Y,style=5,frameflag=0); endfunction
function D=differences_divisees(x,y) // // Calcule la matrice des differences divisees // du vecteur y par le vecteur x (vecteurs lignes). // d = y; D=[d]; // initialisation n=size(y,"*"); // taille du vecteur for i=1:n-1, // construction des lignes dy = d(2:n-i+1)-d(1:n-i); // differences d'ordonnees dx = x(1+i:n)-x(1:n-i); // differences d'abscisses d = dy./dx; // differences divisees D=[D;d,zeros(1,i)]; // stocker le resultat end; endfunction
x=gsort(rand(1,10),"c","i"); y=x.^5+3*x^4-2*x^2+x-1; D=differences_divisees(x,y)
function P = Newton(x,y) // // Retourne le polynome d'interpolation // des valeurs y aux points x // (x et y sont deux vecteurs lignes de meme taille). // Le calcul utilise les differences divisees. // n = size(x,"*"); // nombre de points d = y; // differences divisees s = n; // longueur P = y(1); // initialisation du polynome f = 1; // produit de facteurs for k=1:n-1, d = d([2:s])-d([1:s-1]); // nouveau vecteur de differences a = x([n-s+2:n])-x([1:s-1]);// differences d'abscisses d = d./a; // diviser par les differences s = s-1; // la taille diminue f = f*(%s-x(k)); // nouveau produit P = P+d(1)*f; // ajouter au polynome end; endfunction
x=gsort(rand(1,5),"c","i"); y=x.^5+3*x^4-2*x^2+x-1; P=Newton(x,y); horner(P,x)-y
function P = Lagrange(x,y) // // Retourne le polynome d'interpolation // des valeurs y aux points x // (x et y sont deux vecteurs lignes de meme taille). // Le calcul utilise les polynomes cardinaux. // n = size(x,"*"); // nombre de points P = 0; // initialisation du polynome for k=1:n // parcourir les abscisses z = x; // recopier le vecteur d'abscisses z(k)=[]; // supprimer la k-ieme L = prod((%s-z)./(x(k)-z)); // k-ieme polynome cardinal P = P+y(k)*L; // multiplier par la valeur et ajouter end; endfunction
x=gsort(rand(1,1000),"c","i"); y=rand(1,1000); timer(); Newton(x,y); tN=timer() timer(); Lagrange(x,y); tL=timer() x=gsort(rand(1,10),"c","i"); c=rand(1,10); P=poly(c,"X","coeff"); y=horner(P,x); PN=Newton(x,y); norm(coeff(PN)-c) PL=Lagrange(x,y); norm(coeff(PL)-c)
deff("L=Lt(n)","L=toeplitz([1:n],[1,zeros(1,n-1)])")
deff("L=Lr(n)","L=tril(rand(n,n))")
n=100; L=Lt(n); A=L*L'; timer(); d=norm(L-chol(A)'); t=timer(); [d,t]Avec
Lt, les matrices L et A sont à valeurs entières.
La décomposition de Cholesky est numériquement stable : la norme de la différence
est nulle, même pour de grandes valeurs de
Avec Lr, la décomposition de Cholesky est numériquement instable : la norme de la différence
peut être très variable. Un message
d'erreur sur le fait que la matrice A n'est pas définie positive
peut apparaître dès
.
function L = Cholesky3(A)
//
// Pour une matrice symetrique A, la matrice L
// est triangulaire inferieure et A=L*L'
// 3 boucles emboitees.
//
L=zeros(A); // initialisation : matrice nulle
n = size(A,"r"); // nombre de lignes
dia = sqrt(A(1,1)); // coefficient diagonal
L(:,1) = A(:,1)/dia; // premiere colonne
for j=2:(n-1), // colonnes suivantes
dia = A(j,j);
for l=1:(j-1),
dia = dia - L(j,l)^2;
end;
dia = sqrt(dia);
L(j,j) = dia; // coefficient diagonal
for i=(j+1):n,
aux = A(i,j);
for l=1:(j-1),
aux = aux - L(i,l)*L(j,l);
end;
aux = aux/dia;
L(i,j) = aux;
end;
end;
dia = A(n,n);
for l=1:(n-1),
dia = dia -L(n,l)^2;
end;
dia = sqrt(dia);
L(n,n) = dia; // dernier coefficient
endfunction
function L = Cholesky2(A)
//
// Pour une matrice symetrique A, la matrice L
// est triangulaire inferieure et A=L*L'
// 2 boucles emboitees.
//
L=zeros(A); // initialisation : matrice nulle
n = size(A,"r"); // nombre de lignes
dia = sqrt(A(1,1)); // coefficient diagonal
L(:,1) = A(:,1)/dia; // premiere colonne
for j=2:n-1, // colonnes suivantes
dia = sqrt(A(j,j)-sum(L(j,[1:j-1]).^2));
L(j,j) = dia; // coefficient diagonal
for i=j+1:n,
L(i,j) = (A(i,j) - sum(L(i,[1:j-1]).*L(j,[1:j-1])))/dia;
end;
end;
dia = sqrt(A(n,n)-sum(L(n,[1:n-1]).^2));
L(n,n) = dia; // dernier coefficient
endfunction
function L = Cholesky1(A)
//
// Pour une matrice symetrique A, la matrice L
// est triangulaire inferieure et A=L*L'
// 1 seule boucle.
//
L=zeros(A); // initialisation : matrice nulle
n = size(A,"r"); // nombre de lignes
dia = sqrt(A(1,1)); // coefficient diagonal
L(:,1) = A(:,1)/dia; // premiere colonne
for j=2:n-1, // colonnes suivantes
dia = sqrt(A(j,j)-sum(L(j,[1:j-1]).^2));
L(j,j) = dia; // coefficient diagonal
L([j+1:n],j) = (A([j+1:n],j) - ..
sum(L([j+1:n],[1:j-1]).*(ones(n-j,1)*L(j,[1:j-1])),"c"))/dia;
end;
dia = sqrt(A(n,n)-sum(L(n,[1:n-1]).^2));
L(n,n) = dia; // dernier coefficient
endfunction