Voir le sujet précédent :: Voir le sujet suivant |
Auteur |
Message |
molp
Inscrit le: 29 Oct 2006 Messages: 4
|
Posté le: 04 Nov 2006 16:48 Sujet du message: suites adjacentes |
|
|
bonjour,
je cherche à écrire l'algorithme suivant (et comme j'ai commencé à utiliser maple que depuis 2 semaines : oui je sais ! mais vaut mieux tard que jamais!!!) et je ne vois vraiment pas comment faire :
"Soient a et b deux réels tels que 0<a<b. On démontre que les suites (u[n]) et (v[n]) définies par u[0]=a, v[0]=b, et la relation de récurrence simultanée :
{u[n+1]=sqrt(u[n]*v[n])
{v[n+1]=(u[n]+v[n])/2
sont adjacentes. Ecrire un algorithme qui, à partir des réels a et b, calcule une valeur approchée à 10^-6 près de cette limite."
merci d'avance |
|
Revenir en haut de page |
|
|
zozo
Inscrit le: 03 Jan 2013 Messages: 125
|
Posté le: 04 Nov 2006 17:32 Sujet du message: |
|
|
On s'arrete dès que abs(u[n]-v[n])<epsilon, avec ici epsilon=10^(-6)
donc avec une boucle while, tu boucles tant que abs(u[n]-v[n])>=epsilon.
A+ |
|
Revenir en haut de page |
|
|
molp
Inscrit le: 29 Oct 2006 Messages: 4
|
Posté le: 04 Nov 2006 19:43 Sujet du message: |
|
|
voici ce que j'ai écrit à la fin il faudrait mettre evalf mais je sais pas avec quoi pour déterminer la valeur de la limite.
A part ca il doit manquer d'autres choses.
merci de m'aider à compléter car je vois pas ce qui manque.
merci d'avance!! |
|
Revenir en haut de page |
|
|
molp
Inscrit le: 29 Oct 2006 Messages: 4
|
Posté le: 04 Nov 2006 19:44 Sujet du message: |
|
|
oups il manquait ce que j'ai écrit :
u[0] := a; v[0] := b; while 1/1000000 < sqrt(u[n]*v[n])-1/2*u[n] do sqrt(u[n+1]*v[n+1])-1/2*u[n+1] end do |
|
Revenir en haut de page |
|
|
prof_simplet
Inscrit le: 12 Sep 2006 Messages: 86
|
Posté le: 05 Nov 2006 10:47 Sujet du message: |
|
|
Bonjour, ça ne marchera pas: car déjà a et b n'ont pas de valeurs (il faudrait écrire une procédure limite de paramètres a, b, et epsilon) et n n'a pas été initialisé et n'évolue pas. Conseil: mettre 3 variables locales dans la procédure: n, u et v qui contiendront les valeurs des suites (u[n]) et (v[n]) au cours du calcul.
Comme les suites sont adjacentes, c'est le u[n], ou le v[n] final qui donneront une valeur approchée de la limite L, car |u[n]-L|<=|u[n]-v[n]|<epsilon.
Je te laisses approfondir la question. |
|
Revenir en haut de page |
|
|
molp
Inscrit le: 29 Oct 2006 Messages: 4
|
Posté le: 05 Nov 2006 13:05 Sujet du message: |
|
|
bonjour, donc je propose:
limite:=proc(a::positive,b::positive,`ϵ`::positive)
local n,u[n],v[n];
n:=0: u[0]:= a: v[0]:=b:
while u[n]*v[n]<`ϵ` do
n:=n+1: u[n+1]:=sqrt(u[n]*v[n]): v[n+1]:=(u[n]+v[n])/2: rang:=evalf(u[n+1]+v[n+1]):
od;
n
end proc:
est-ce correct ????
merci d'avance |
|
Revenir en haut de page |
|
|
molp
Inscrit le: 29 Oct 2006 Messages: 4
|
Posté le: 05 Nov 2006 13:08 Sujet du message: |
|
|
ah oui je sais pas à quel moment je dois définir :
&varepsilon=10^-6
|
|
Revenir en haut de page |
|
|
molp
Inscrit le: 29 Oct 2006 Messages: 4
|
Posté le: 05 Nov 2006 17:20 Sujet du message: |
|
|
s'il vous plait pouvez vous me dire si ce que je propose est correct ? |
|
Revenir en haut de page |
|
|
ALS
Inscrit le: 11 Sep 2006 Messages: 647
|
Posté le: 06 Nov 2006 12:51 Sujet du message: |
|
|
Je vous propose la correction suivante, votre condition while u[n]*v[n]<`ϵ` do n'étant pas satisfaisante.
Code: |
> limite:=proc(a::numeric,b::numeric,epsilon::numeric)
> local n,t,u,v;
> n:=0: u:=a: v:=b:
> while abs(u-v)>=epsilon do
> n:=n+1: t:=u:
> u:=evalf(sqrt(u*v)): v:=evalf((t+v)/2):
> print(n,u,v) # affichage de n,u,v en cours de calcul
> od:
> u # résultat final (valeur approchée par défaut de la limite)
> end proc:
> limite(1,2,10^(-6));
1, 1.414213562, 1.500000000
2, 1.456475315, 1.457106781
3, 1.456791014, 1.456791048
1.456791014
|
En supposant a<b, mettre v à la place de u comme résultat final si on veut une valeur approchée par excès de la limite. |
|
Revenir en haut de page |
|
|
|