bonjour a toutes et a tous
Voila je voulais faire un tracé de courbe sur Scilab, mais voila apparemment j'ai une erreur de dimension au niveau de mon plot et vraiment je planche dessus depuis 1h et impossible de trouver si vous voyez d'où vient le problème ça serait super sympa de me le dire je deviens fou
voila l'erreur que scilab m'affiche (d'ailleurs il m'ouvre un graphique sans tracé tout vide) :
"plot : Dimension erronée des arguments d'entrée n°2 et n°3 : Dimensions incompatibles."
voici mon code :
T=[0.5172 0.5473 -1.224 0.8012;0.5473 1.388 1.353 -1.112; -1.224 1.353 0.03642 2.893; 0.8012 -1.112 2.893 0.05827];
z1=[1 0 0 0]';
z2=[1;1;1;1]*(1/2);
z3=[1;1;0;2]*(1/2);
tol=10^-8;
nitermax =70;
[nu1,x1,niter1,err1]=puissance(T,z1,tol,nitermax);
[nu2,x2,niter2,err2]=puissance(T,z2,tol,nitermax);
[nu3,x3,niter3,err3]=puissance(T,z3,tol,nitermax);
figure(0)
plot(1:nitermax+1,nu1,'r',1:nitermax+1,nu2,'r',1:nitermax+1,nu3,'r')
legend('z1','z2','z3')
title('approximation de la valeur propre en fonction du nombre')
xlabel('nombre d iteration');
ylabel('erreur');
Bonsoir.
Où et comment est définie la fonction puissance() ?
Vérifiez le nombre de points à afficher : nitermax + 1 ou nitermax
ha oui voila ma fonction puissance merci de ton aide :
function[nu1,x1,niter,err]=puissance(A,z0,tol,nitermax);
q=z0/norm(z0);q2=q;err=[];nu1=[];
res=tol+1;niter=0;z=A*q;
while (res>=tol & niter<=nitermax)
q=z/norm(z);z=A*q;lam=q'*z;x1=q;
z2=q2'*A; q2=z2/norm(z2); q2=q2';
y1=q2; c=abs(y1'*x1);
if (c>=5e-2),
res=norm(z-lam*q)/c;
niter=niter+1;err=[err; res]; nu1=[nu1; lam];
else
disp('Probleme de convergence !');
break;
end
end
endfunction
La définition de fonction est-elle correcte ?
function[nu1, x1, niter, err] = puissance(A, z0, tol, nitermax)
comme ca tu veux dire ?
function[nu1,x1,err,niter]=puissance(A,z0,tol,nitermax);
q=z0/norm(z0);q2=q;err=[];nu1=[];
res=tol+1;niter=0;z=A*q;
while (res>=tol & niter<=nitermax)
q=z/norm(z);z=A*q;lam=q'*z;x1=q;
z2=q2'*A; q2=z2/norm(z2); q2=q2';
y1=q2; c=abs(y1'*x1);
if (c>=5e-2),
res=norm(z-lam*q)/c;
niter=niter+1;err=[err; res]; nu1=[nu1; lam];
else
disp('Probleme de convergence !');
break;
end
end
endfunction
T=[0.5172 0.5473 -1.224 0.8012;0.5473 1.388 1.353 -1.112; -1.224 1.353 0.03642 2.893; 0.8012 -1.112 2.893 0.05827];
z1=[1 0 0 0]';
z2=[1;1;1;1]*(1/2);
z3=[1;1;0;2]*(1/2);
tol=10^-8;
nitermax =70;
[nu1,x1,err1,niter1]=puissance(T,z1,tol,nitermax);
[nu2,x2,err2,niter2]=puissance(T,z2,tol,nitermax);
[nu3,x3,err3,niter3]=puissance(T,z3,tol,nitermax);
figure(0)
plot(1:nitermax,nu1,'r',1:nitermax,nu2,'r',1:nitermax,nu3,'r')
legend('z1','z2','z3')
title('approximation de la valeur propre en fonction du nombre')
xlabel('nombre d iteration');
ylabel('erreur');
on va laisser passer la nuit... de mon côté, j'ai une erreur sur l'appel de la fonction puissance( )...
Je pense avoir trouvé...
Le vecteur nu1 n'a pas la bonne dimension (69 x 1) alors que les autres (nu2 et nu3) ont comme dimension 71 x 1 ou la commande plot( ) n'est pas appelée avec une valeur correcte.
plot(1 : nitermax - 1, nu_1, 'r', 1 : nitermax + 1, nu_2, 'r', 1 : nitermax + 1, nu_3, 'r')
Bizarre comme modif j'aurais pas cru que cela soit un problème^^
en tous cas j'ai essayer ce que tu as fait et pour moi ca ne fonctionne pas tu peux m'envoyer ton code en entier? Je commence a me demander si cela ne viendrai pas de mon ordi qui m'aime pas xD
Ca fonctionne MERCI BEAUCOUP !!!
MAis la vraiment il y a quelque chose qui m'intrigue si je passe par exemple a 60 le nombre d'itération de ma ma fonction qui trace les courbe l'erreur revient je comprend pas pourquoi :/
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :