Inscription / Connexion Nouveau Sujet

1 2 +


Posté par
mathafou Moderateur
re : Distance Minimale 28-12-20 à 22:42

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 f'(x)=\dfrac{x}{\sqrt{9+x^2}} + \dfrac{x-8}{\sqrt{36 +(8-x)^2}}
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

Posté par
superninie
re : Distance Minimale 29-12-20 à 00:25

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

Posté par
mathafou Moderateur
re : Distance Minimale 29-12-20 à 11:26

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

déja, que penses tu du signe de f'(0) ?
or tu calcules au premier passage f'(0)
comme il n'est pas >=0 tu passes immédiatement dans le sinon
qui va calculer x = 0 +1/10+1/100+1/1000 = 0,111
et on revient au début du "pour"
mais dans la boucle "pour" x est automatiquement augmenté de 1
c'est le rôle d'un "pour" !!
dans le meilleur des cas cela va donc donner x =1,111 pour le deuxième passage
bref
en fait il est très nuisible de modifier dans une boucle "pour" la variable de la boucle elle-même : ça perturbe le fonctionnement du "pour"
si on veut faire ça il ne faut pas utiliser une boucle "pour" mais une boucle "tant que" :

x = 0
tant que  bla bla
    opérations, tests etc
    progression de x comme on veut
Fin tant que


ensuite la boucle sur n ne doit pas être "tout d'un coup" et à l'intérieur de la boucle sur x, mais c'est le contraire :

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


les lignes commençant par "//" sont des commentaires
ne faisant pas partir du code, ils en expliquent le fonctionnement
c'est indispensable. pour une bonne pratique et pour détecter rapidement des erreurs logiques de conception générale de l'algorithme. (à quoi sert ce qu'on fait et pourquoi)
à la limite on devrait même commencer par écrire ces commentaires avant d'écrire le code !
serait-ce même du "pseudocode" (langage naturel) comme ici

Posté par
superninie
re : Distance Minimale 29-12-20 à 23:44

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)

Posté par
mathafou Moderateur
re : Distance Minimale 30-12-20 à 12:10

j'ai mis en police fixe avec le bouton code (seul moyen pour un modérateur de conserver l'indentation)
Distance Minimale
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)

ligne 1 OK
ligne 2 : un nom ne devrait pas comporter de caractères accentués ni de signes de ponctuation
ne pas l'appeler f' mais g par exemple.
que ce soit la dérivée de f ne concerne pas le programme, ce n'est que dans notre tête
de plus c'est def et pas Def

ligne 3 : les crochets sont illégaux pour cet usage, utiliser uniquement des parenthèses
mais elles sont inutiles !! (compte tenu de la priorité des opérations)
      return x/sqrt(9+x**2)+(x-8)/sqrt(36+(8-x)**2)   suffit

ligne 4 : indentée ainsi elle fait partie du code de la fonction "f'(x)" donc ne sera jamais exécutée car à l'exécution on aura déja quitté la fonction par return
la fin de la définition d'une fonction, ce n'est pas le return
c'est le retour à l'indentation précédente (nulle)
le "return" (ou les return dans des tests) signale le moment où on arrêtera l'exécution de la fonction et la valeur renvoyée par cette fonction

de même que aucune des lignes qui suit ne sera exécutée !
...
ligne 11 : seule celle là le sera ! et x est alors inconnu...

une fois cette erreur d'indentations corrigée
revenons à la ligne 4 :
solve f'(0)
ça ne veut rien dire
et de plus on ne cherche pas à faire "résoudre" quoi que ce soit, on cherche à faire balayer des valeurs successives de x !
et ça c'est les boucles suivantes qui vont le faire.
ligne à supprimer totalement.

ligne 5 : OK (à part l'indentation qui doit être nulle)
ligne 6 : for n in range (0,3):
c'est à, dire les valeurs de n : 0, 1, 2 et c'est tout
pour aller jusqu'à 3 inclus il faut mettre range (0,4)

ligne 7 : while:
tant que quoi ?? il manque la condition !
ligne 8 : c'est dans la ligne while que on fait le test
et tester un signe se fait simplement par > 0 ou < 0 !
ligne à supprimer, c'est dans le while (condition) :

la suite est à priori bonne. (une fois les indentations corrigées)

Posté par
mathafou Moderateur
re : Distance Minimale 30-12-20 à 13:35

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 !)

Posté par
superninie
re : Distance Minimale 30-12-20 à 22:29

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?

Posté par
mathafou Moderateur
re : Distance Minimale 30-12-20 à 23:11

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)

Posté par
superninie
re : Distance Minimale 30-12-20 à 23:55

Bonsoir,
Un grand merci pour votre aide.

1 2 +




Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Inscription gratuite

Fiches en rapport

parmi 1674 fiches de maths

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !