Methode itérative du deuxième ordre.

cs_Maritime Messages postés 69 Date d'inscription dimanche 16 mars 2003 Statut Membre Dernière intervention 14 mars 2015 - 11 sept. 2004 à 03:25
cs_Maritime Messages postés 69 Date d'inscription dimanche 16 mars 2003 Statut Membre Dernière intervention 14 mars 2015 - 16 sept. 2004 à 02:13
Je cherche une Fonction Vbasic sur la convergence de la méthode
de Newton-Raphson.

6 réponses

Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
11 sept. 2004 à 18:42
La méthode de Newton-Raphson, c'est celle qui prend la tangente en f(x0) et trouve l'intersection avec l'axe x, ce qui donne un nouveau x0 ?
Si c'est ça, ce ne doit pas être trop dur de faire les quelques lignes de programme !

VB Lover
0
cs_Maritime Messages postés 69 Date d'inscription dimanche 16 mars 2003 Statut Membre Dernière intervention 14 mars 2015 2
13 sept. 2004 à 02:05
Oui c'est bien ça, mais ce n'est pas exactement ma question.
j'ai la fonction et sa dérivée, soit f(x) et f'(x).
dan mon cas F(phi2) et F'(phi2)
par itérations on calcul phi2 i+1=phi2 i - F(phi2 i)/F'(phi2 i)
c'est cette itération ou boucle que je n'arrive pas a faire.
Un petit exemple de code me suffit.
0
CrisseTof Messages postés 57 Date d'inscription jeudi 5 août 2004 Statut Membre Dernière intervention 2 juillet 2005 1
14 sept. 2004 à 15:34
Je pense que tu peux utiliser quelque chose de la forme :
Epsilon, c'est la précision de ton calcul.

dim phi() as double
dim epsilon as double
dim nb as integer
nb=2
epsilon = 0.01
redim phi(2)
do until abs(phi(n)-phi(n-1)) < Epsilon
n=n+1
redim preserve phi(n)
phi2(n) = phi2(n-1) - F(phi(n-1))/F'(phi(n-1))
loop

Ta valeur est phi(n)
0
cs_Maritime Messages postés 69 Date d'inscription dimanche 16 mars 2003 Statut Membre Dernière intervention 14 mars 2015 2
15 sept. 2004 à 02:11
Merci de me mettre sur la bonne voie ;) .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Vb Lover Messages postés 221 Date d'inscription vendredi 30 novembre 2001 Statut Membre Dernière intervention 13 février 2010 5
15 sept. 2004 à 22:01
La boucle de CrisseTof est bonne, la seule chose, c'est que ça ne sert à rien de garder dans un tableau toutes les approximations. En plus, le fait de faire un redim preserve prend énormément de temps. Pour te donner un autre critère d'arrêt, tu regardes l'erreur relative et non absolue. C'est en général toujours mieux de faire comme ça, sauf si ta valeur est proche de zéro.
Je ferais donc simplement :

dim Epsilon as Double
dim X0 as double, X1 as Double

X1 = 0 ' valeur initiale, exemple ici
do
  X0 = X1
  X1 = X0 -F(X0)/F'(X0)
loop until abs((X1-X0)/X0) <= Epsilon
' tu améliores une dernière fois ton approximation
msgbox (X0+X1)/2



VB Lover
0
cs_Maritime Messages postés 69 Date d'inscription dimanche 16 mars 2003 Statut Membre Dernière intervention 14 mars 2015 2
16 sept. 2004 à 02:13
Bonjour,

Je n'arrive toujours pas a résoudre mon problème,
Je vais, si vous le permettez, vous exposer mon problème concrètement.
Il s'agit de résoudre un problème de navigation qui est un cas
particulier de la loxodromie écrit en C++,
et que j'essaie de traduire en Vbasic.

Enoncé :
Partant d'un point dont on connaît les coordonnées, latitude Phi1 et longitude Lng1,
ainsi que la route à suivre R et la Longitude d'arrivée Lng2,
On cherche à calculer la distance d et la Latitude d'arrivée Phi2.

Eléments connus Eléments à calculer
(Phi1,Lng1,R,Lng2)------------> (Phi2,d).

Code C++

#define Function(x) ((double)(Phi1+DLng*cos( DegRad( (Phi1+(x))/2.0 ) )/tan( DegRad( R ) )-(x)))
#define Derivée(x) ((double)(-0.5*DLng*sin( DegRad( (Phi1+(x))/2.0 ) )/tan( DegRad( R ) )-1))

short PhiM::DistancePhi2(void)
{
// Indeterminations: R=0º,180º,360º -> tanR=0 F=1/0 F'=1/0
if( R 0 || R 180 || R == 360 ) {
AfxMessageBox( "Indéfini pour R=0º,180º" );
return(-1); }

DLng = Lng2 - Lng1;

// Cas du franchissement du méridien 180º
DLng = ang_180( DLng );

//Newton-Raphson
int itération = 0;
const double epsilon = 1E-6;
double Phi = 0;

Phi2 = Phi1 + DLng * cos( DegRad( Phi1) ) / tan( DegRad( R ) );

for( double error = 100; error > epsilon && iteration<40;++iteration ) {

Phi = Phi2-Function( Phi2 )/Derivée( Phi2 );

error = fabs( Phi-Phi2 );

Phi2 =Phi;
}

dPhi = Phi2 - Phi1;

PhiM= ( Phi1 + Phi2 ) / 2.0;

apart = DLng * cos( DegRad( PhiM ) );

distance = sqrt( sqrt( dPhi ) + sqrt( apart ) );
distance = distance * 60.0;

return(1);
}
0
Rejoignez-nous