un algorithme n'a rien à voir avec la résolution exacte que tu as faite.
pour résoudre f'(x) = 0 par approximations, on la prend telle qu'elle est directement sans chercher à finasser.
le but de l'exo n'est absolument pas de trouver ces 8/3 mais de s'entrainer à écrire des algorithmes !
ce qui pourra servir quand on n'aura pas de méthode algébrique pour le faire de façon exacte.
bref on peut considérer cet exo comme "assez stupide", vu qu'il y a une méthode géométrique extrêmement simple pour le résoudre presque sans aucun calcul.
(voir beaucoup plus haut, Thalès et c'est terminé)
même la résolution "avec des fonction de x" est juste un prétexte pour s'exercer à faire des calculs "assez bourrins".
mais puisque l'énoncé le demande, va pour un algorithme
on part de f'(x) écrite directement
la recherche algébrique de la solution de f'(x) = 0 semblant à première vue "difficile" à cause de ces racines carrées.
d'où l'idée de ne pas s'embêter et de faire une résolution approchée.
on va donc faire calculer les valeurs numériques de f'(x) pour des valeurs successives de x de plus en plus proche de la solution
pour ça diverses méthodes existent :
par exemple, on peut calculer de 1 en 1 depuis x=0 jusqu'à x=8 ou que f'(x) change de signe
puis de 0.1 en 0.1 entre les deux dernières valeurs (celles de part et d'autre du changement de signe)
puis de 0.01 en 0.01 etc
donc une boucle dans une boucle
on peut aussi opérer par dichotomie ("couper l'intervalle en deux"), au lieu de diviser en valeurs décimales
signes de f'(0) et de f'(8)
signe de f'((0+8)/2) = f'(4)
signe de f'((0+4)/2) = f'(2) ou bien de f'((4+8)/2) = f'(6) selon le résultat précédent par rapport aux signes de f'(0) et de f'(8)
etc jusqu'à ce que l'intervalle soit suffisamment petit.
d'autres méthodes (Newton, etc) seront plus compliquées
Si j'ai bien compris, mon algorithme pourrait se présenter ainsi:
Soit f'(x)=2x/(9+x²) + (x-8)/(36+(8-x)^2).
Pour x allant de 0 à 8 de 1 en 1
Calculer f'(x)
Si f'(x)>=0
alors
on continue avec x=x+1
sinon
pour n allant de 1 à 3
on prend x=x+1/10^n
Fin si
Return x
pas vraiment mais il y a de l'idée.
déja tu mets bien des Fin si mais aucun Fin pour
et comme ton "indentation" (les décalages de lignes) est douteuse, on ne sait pas ce qui est répété et ce qui, ne l'est pas.
disons :
Pour x allant de 0 à 8 de 1 en 1
Calculer f'(x)
Si f'(x)>=0 alors
on continue avec x=x+1
sinon
pour n allant de 1 à 3
on prend x=x+1/10^n
Fin pour
Fin si
Fin pour
Return x
x = 0
tant que bla bla
opérations, tests etc
progression de x comme on veut
Fin tant que
x = 1 // 0 + 1er pas de 1
pour n de 0 à 3
tant que f'(x) de même signe que f'(0)
progresser x de 10-n
fin tant que
// ici la valeur cherchée est entre les deux dernières valeurs
// c'est à dire entre x-10-n et x
reculer x de 10-n
Fin pour
// attention ici n = 4
// solution entre x et x + 10-3
Bonsoir,
Merci beaucoup pour votre aide. Maintenant, je dois mettre en œuvre l'algorithme sur Python et c'est relativement nouveau pour moi. D'où, l'ébauche qui suit:
from math import *
Def f'(x):
return[x/sqrt(9+x**2)]+[(x-8)/sqrt(36+(8-x)**2)]
solve f'(0)
x=1
for n in range (0,3):
while:
ici je bloque, dois-je créer une première fonction signe
x=x+10^-n
x=x-10^-n
print("La solution est",x)
j'ai mis en police fixe avec le bouton code (seul moyen pour un modérateur de conserver l'indentation)
et j'ai ajouté des numéros de ligne pour pouvoir en discuter (ne pas les mettre dans Python, c'est lui qui les numérote) :
1 from math import *
2 Def f'(x):
3 return[x/sqrt(9+x**2)]+[(x-8)/sqrt(36+(8-x)**2)]
4 solve f'(0)
5 x=1
6 for n in range (0,3):
7 while:
8 ici je bloque, dois-je créer une première fonction signe
9 x=x+10^-n
10 x=x-10^-n
11 print("La solution est",x)
complément :
10^-n ne veut pas dire 10 à la puissance -n en Python
cela se dit en Python 10**-n
(^ veut dire autre chose : 10^-3 vaut -9 !)
Bonsoir,
Du coup, j'ai écrit ceci:
from math import*
def g(x):
return x/sqrt(9+x**2)+(8-x)/sqrt(36+(8-x)**2)
x=1
for n in range (0,4):
while g(x)>0:
x=x+10**-n
x=x-10**-n
print("La solution est:", x)
Et le logiciel Python me répond: Console de processus distant Réinitialisée ***
Mais je n'arrive pas à trouver où réside la ou les erreurs?
tes indentations sont toujours incorrectes
(tout ton code est dans la fonction g(x), tout ce qui suit son return ne sera jamais exécuté)
de plus il y a une erreur de recopie qui traine depuis un bout de temps :
la dérivée c'est x/sqrt(9+x**2)+(x-8)/sqrt(36+(8-x)**2)
enfin le signe de f'(x) c'est d'abord <0 puis passe par 0 avant de devenir > 0
donc on doit boucler tant que c'est encore <0
while g(x) <0
from math import *
def g(x):
return x/sqrt(9+x**2)+(x-8)/sqrt(36+(8-x)**2)
# la définition de la fonction g(x) est terminée
# la suite est le "programme principal"
# indentation nulle
x=1
for n in range (0,4):
while (g(x)<0) :
x=x+10**-n
# fin de la boucle while
x=x-10**-n
# fin de la boucle for
print("La solution est:", x)
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :