Vous êtes sur la page 1sur 4

Université de Nantes 2008/2009

Analyse Numérique : S22M030


T.P. MatLab : Erreurs ma hines et Méthode du point xe

On n'a pas intérêt à divisier par un nombre trop petit en module


Commenter le programme Divzero.m.
Tester le !
Modier e programme pour le rendre minimal et n'a her que x et f0(x),
en dénissant vos x. En parti ulier on hangera 'while' en 'for k=k1 :k2'.

Divzero.m
% division par zero
eps
n=20;
v=[5:n℄;
w=(10*ones(1,length(v))).^(-v);
f0=(x) (1.0+(x-1))./x;
x=w(1);
k=1;
while ((eps < x) & (k <= n))
k+4
f0(x)
k=k+1;
x=w(k);
end

Ce n'est pas par e qu'une série onverge, qu'on a intérêt à la sommer


numériquement aussi loin que possible.
Constater le ave le programme ErrSom.m.
En devoir maison, on ommentera les ommandes Matlab nouvelles pour
vous, de e programme.

ErrSom.m
%Test 1, propagation des erreurs
f1=(n) [1:n℄;%fon tion anonime a' 1 var.
n=100;
m=20;
b1=zeros(1,m);
f2=(x,d) round((10^d).*x)/(10^d);%fon tion anonime a' 2 var.
% Utilisation des fon tions Matlab

1
for k=1:m
a1=f1(k*n);
b1(k)=sum(1./(a1.*a1));
end % Pour for k
% Utilisation du al ul a' la main
b2=zeros(1,m);
for k=1:m
a1=f1(k*n);
b2(k)=0;
for j=1:length(a1)
b2(k)=b2(k)+(1/(a1(j)*a1(j)));
end % Pour for j
end % Pour for k
% Utilisation du al ul a' la main en simple pre ision
B3=zeros(5,m);
for l=1:5
for k=1:m
a1=f1(k*n);
B3(l,k)=0.0;
s3=0.0;
for j=1:length(a1)
s3=f2(1/(a1(j)*a1(j)),3+l);
B3(l,k)=f2(B3(l,k)+s3,3+l);
end % Pour for j
end % Pour k
end % Pour for l
x=f1(m);
y1=(6/(pi*pi))*b1;
y2=(6/(pi*pi))*b2;
Y3=(6/(pi*pi))*B3;
e1=min(abs(1-y1));
k1=find(e1==abs(1-y1));
e2=min(abs(1-y2));
k2=find(e2==abs(1-y2));
E3=abs(ones(5,m)-Y3);
K3=[1:5℄;
for l=1:5
K3(l)=min(find(min(E3(l,:))==E3(l,:)));
end % Pour l
%%%%%%%%%%%%%%%
disp(['La plus petite erreur de Matlab est ', num2str(e1)℄)
disp(['Elle est prise au rang ', num2str(n*min(k1))℄)
disp('Rentrez une tou he pour ontinuer')
pause
disp(['La plus petite erreur par un al ul manuel est ', num2str(e2)℄)
disp(['Elle est prise au rang ', num2str(n*min(k2))℄)

2
disp('Rentrez une tou he pour ontinuer')
pause
for l=1:5
disp(['La plus petite erreur par un al ul modulo 10^(-', num2str(3+l),') est ',
disp(['Elle est prise au rang ',num2str(n*K3(l))℄)
disp('Rentrez une tou he pour ontinuer')
pause
end % Pour for l
% Les erreurs sembles indentiques
%Petit plot
figure(1)
plot(x,y2,x,Y3(1,:),x,Y3(5,:));
xlabel('n/100');
ylabel('6*Somme/(pi*pi)');
legend('long','4 digits','8 digits');
title('Comparaison des pre isions');
grid;
disp('Rentrez une tou he pour ontinuer')
pause
figure(2)
plot(x,Y3(1,:),x,Y3(2,:),x,Y3(3,:),x,Y3(4,:),x,Y3(5,:))
xlabel('n/100');
ylabel('6*Somme/(pi*pi)');
legend('4d','5d','6d','7d','8d');
title('Comparaison des pre isions');
grid;

Le Théorème du point xe n'assure la onvergen e que, dans un


intervalle où la dérivée est, en module, sti tement plus petit que 1.
Copier les fon tions ga.m et pointx.m.
Exe uter le programme Pointx_T.m, le ommenter et modier la fon tion
teste et le nombre d'itérations.
Trouver le point xe de cos(x) sur [0, π/2] .

ga.m
fun tion y=ga(x,a,b)
%ne essite 3 variables
y=x-b*(x.^2-a);
%%%%

3
pointx.m
fun tion y=pointfix(nom,a,n)
%ne essite 3 variables
%le nom d'une fon tion a' 1 var.,
%le point de depart
%et le nombre d'iterations
y(1)=a;
for k=1:n
y(k+1)=feval(nom,y(k));
end

Pointx_T.m
f1=(x) ga(x,2,0.1);%fon tion teste ave |g'(a)|<1
vv=pointfix(f1,1,25);
disp('Cas d''une onvergen e: g(x) = x - (x^2 - 2)/10; x(0) = 1.')
for i=0:5
disp(['x(', num2str(20+i),') = ', num2str(vv(20+i))℄)
end %for i
%%%%%%%%%%%%%%%
f2=(x) ga(x,2,-0.1);%fon tion teste ave |g'(a)|>1
vv=pointfix(f2,1,25);
disp('Rentrer une tou he pour onntinuer!!!');
disp('Cas d''un mauvais hoix de depart: g(x) = x + (x^2 - 2)/10; x(0) = 1.');
for i=0:5
disp(['x(', num2str(20+i),') = ',num2str(vv(20+i))℄)
end %for i
%%%%%%%%%%%%%%%
vv=pointfix(f2,2,25);
disp('Rentrer une tou he pour onntinuer!!!');
disp('Cas de non onvergen e: g(x) = x + (x^2 - 2)/10; x(0) = 2.');
for i=0:5
sprintf('x(%d) = %f \n',20+i,vv(20+i))
end %for i

Vous aimerez peut-être aussi