Méthode de la sécante

Discussion sur l'enseignement de l'algorithmique avec Xcas au lycee
maurice
Messages : 50
Inscription : jeu. déc. 10, 2009 6:48 pm

Méthode de la sécante

Message par maurice » mer. déc. 04, 2013 5:57 pm

Bonsoir, j'essaie de programmer la méthode de la sécante. Voici mon code :

Code : Tout sélectionner

secante(f,x0,x1,N):={
  local xn, k, x;
  f:=unapply(f,x);
  k:=0;
  xn:=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
  tantque abs(f(x1)-f(x0))>epsilon et k<N faire
    x0:=x1;
    x1:=xn;
    xn:=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
    k:=k+1;
  ftantque;
  retourne evalf(xn);  
}:;
La commande secante(x^2-2,1,3,10) retourne bien une valeur approchée de sqrt(2) mais la commande secante(x^2-2,1,3.,10) retourne undef.
J'aimerais comprendre pourquoi...

Par ailleurs, l'utilisation de epsilon est-elle bien nécessaire ? le code :

Code : Tout sélectionner

secante(f,x0,x1,N):={
  local xn, k, x;
  f:=unapply(f,x);
  k:=0;
  xn:=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
  tantque f(x0)!=f(x1) and k<N faire
    x0:=x1;
    x1:=xn;
    xn:=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
    k:=k+1;
  ftantque;
  retourne evalf(xn);  
}:;
retourne aussi une valeur approchée de sqrt(2)...
Quels sont les cas pathologiques ?

merci de votre aide

Maurice

parisse
Messages : 5084
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Méthode de la sécante

Message par parisse » mer. déc. 04, 2013 7:38 pm

Le test de la boucle ne garantit pas que f(x1)!=f(x0) dans la définition de xn parce que les valeurs de x0 et x1 ont changé. Du coup avec la valeur initiale 3. on voit avec debug qu'on a après quelques itérations x0 et x1 égaux d'où le undef.
Je pense qu'il vaut mieux faire une boucle pour que tantque sur k

Code : Tout sélectionner

pour k de 1 jusque N faire
    x0:=x1;
    x1:=xn;
    si abs(f(x0)-f(x1))<=epsilon alors return x0; fsi;
    xn:=x1-f(x1)*(x1-x0)/(f(x1)-f(x0));
fpour
on met le test d'arrêt juste avant la définition de xn. Le code est ainsi plus clair (puisqu'on n'a plus de k:=k+1 ni de conjonction pour le test d'arrêt, à la place on utilise la propriété de sortie immédiate de la fonction par return), le risque d'erreur est moindre.
Sinon, pour la présence de epsilon, il faut savoir que le test d'égalité entre flottants utilise la tolérance définie par epsilon. Mais il me semble mieux et plus formatteur de faire un test avec un abs et même introduire une variable eps de controle en argument (après N).

maurice
Messages : 50
Inscription : jeu. déc. 10, 2009 6:48 pm

Re: Méthode de la sécante

Message par maurice » jeu. déc. 05, 2013 2:10 pm

Bonjour,
merci pour les précisions.
Du coup, j'ai modifié ma version de la méthode de Newton :

Code : Tout sélectionner

Newton(f,x0,N):={
  local df, xn, k;
  df:=unapply(diff(f),x);
  f:=unapply(f,x);
  xn:=x0-f(x0)/df(x0);
  pour k de 1 jusque N faire
   si df(xn)<epsilon alors afficher("le nombre dérivé est nul");
      retourne evalf(xn);
   sinon xn:=xn-f(xn)/df(xn) 
   fsi
  fpour
  retourne evalf(xn);
}:;
Une chose me chifonne cependant.
Lorsque l'on compile cette fonction, on a le message :
// Interprète Newton
// Attention: x, declarée(s) comme variable(s) globale(s)compilationNewton
Dans la procédure secante j'avaisn mis x en variable locale (comme ça pas de warning) et ça n'avait pas posé de problème à l'exécution mais ici, si je met

Code : Tout sélectionner

local  df, xn, x, k;
j'ai le message d'erreur :
"diff(f) dans Newton(x^3-2*x-2,2,10) instruction #2 erreur, essayez debug(Newton(x^3-2*x-2,2,10))
Valeur Argument Incorrecte"
Pouvez-vous m'expliquer pourquoi et ce qu'il vaut mieux faire.

Merci de votre aide.

Maurice

parisse
Messages : 5084
Inscription : mar. déc. 20, 2005 4:02 pm
Contact :

Re: Méthode de la sécante

Message par parisse » jeu. déc. 05, 2013 2:29 pm

Le plus simple est de modifier votre calcul de derivee en ecrivant tout simplement:
df:=f';
Pour utiliser x comme variable locale symbolique, il faut faire
local x;
puis assume(x,DOM_SYMBOLIC);

Répondre