Équation trigonométrique en python

Discutez d'informatique ici !
Corvus
Messages: 5
Enregistré le: 25 Avr 2019, 12:31

Équation trigonométrique en python

par Corvus » 25 Avr 2019, 12:42

Bonjour à toutes et à tous !

Voici mon problème :
J'ai une équation : Sin(A) = 0.39774 * Sin(L).

Je dois trouver la valeur de A en connaissant la valeur de L (elle est déduite de l'Input de l'utilisateur). Il me faudrait un algorithme, je me chargerais d'en faire une fonction en python !

Je tiens à préciser que je suis en seconde et que je n'ai donc jamais résolu d'équation de ce type.

Merci à toutes et à tous pour l'aide que vous m'apporterez !



Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

Re: Équation trigonométrique en python

par fatal_error » 25 Avr 2019, 13:17

slt,

par dichotomie:

tu calcules 0.39774*sin(L). mettons ca vaut 0.6
tu sais que sinus est positive sur [0;pi]
tu sais aussi que sinus est symétrique (sin(x)=sin(pi-x)) par rapport à l'axe des ordonnées, donc tu peux te concentrer sur [0;pi/2]

tu sais que sinus est croissant
tu subdivises l'intervalle en 2 ([0;pi/4] et [pi/4;pi/2]). tu regardes quel interval contient 0.6. tu resubdivises le bon interval en deux... et ainsi de suite jusqu'à ce que tu aies une valeur approchée suffisamment satisfaisante

(diviser en deux l'intervalle et ainsi de == dichotomie)
la vie est une fête :)

Corvus
Messages: 5
Enregistré le: 25 Avr 2019, 12:31

Re: Équation trigonométrique en python

par Corvus » 25 Avr 2019, 13:37

Merci beaucoup, je travaillerais dessus demain et j'envoie le résultat en python, ça peut servir à quelqu'un !

Corvus
Messages: 5
Enregistré le: 25 Avr 2019, 12:31

Re: Équation trigonométrique en python

par Corvus » 25 Avr 2019, 17:37

Du coup je trouve ça, mais j'ai des doutes...
Aurais-je mal compris?
En fait, si je doute, c'est que je n'ai aucun moyen de comparer avec un résultat vérifié !

Du coup je fais avec ça, et si quelqu'un voit une faute, qu'il me contacte !

Code: Tout sélectionner
from math import sin, pi

L = float(input("Entrer un nombre : "))

Sin_L = sin(L) * 0.39774

min = 0
max = pi/2
#intervalle = [ min, max ] (ça sert à expliquer)
milieu = (min + max) / 2
   
for _ in range(10**6):
    if milieu < Sin_L:
        min = milieu
        milieu = (milieu + max) /2 #Je fais la moyenne
        resultat = milieu #Résultat est la valeur de A !
    elif milieu > Sin_L:
        max = milieu
        milieu = (min + milieu) /2#idem
        resultat = milieu
    elif milieu == Sin_L:#Si ça tombe juste
        resultat = milieu
    else:
        resultat = milieu
       
print (resultat)


Encore merci pour ta réponse rapide !

mathelot

Re: Équation trigonométrique en python

par mathelot » 25 Avr 2019, 18:47

from math import sin, pi

L = float(input("Entrer un nombre : "))

Sin_L = sin(L) * 0.39774

min = 0
max = pi/2
#intervalle = [ min, max ] (ça sert à expliquer)
milieu = (min + max) / 2

for _ in range(10**6):
if sin(milieu) < Sin_L:
min = milieu
milieu = (milieu + max) /2 #Je fais la moyenne
resultat = milieu #Résultat est la valeur de A !
elif sin(milieu) > Sin_L:
max = milieu
milieu = (min + milieu) /2#idem
resultat = milieu
elif sin(milieu )== Sin_L:#Si ça tombe juste
resultat = milieu
else:
resultat = milieu

print (resultat)

Corvus
Messages: 5
Enregistré le: 25 Avr 2019, 12:31

Re: Équation trigonométrique en python

par Corvus » 25 Avr 2019, 19:06

Aaaaaaah, oui, maintenant je comprends pourquoi c'est faux !!
En fait c'est très bête !!
En tout cas merci !!

Corvus
Messages: 5
Enregistré le: 25 Avr 2019, 12:31

Re: Équation trigonométrique en python

par Corvus » 25 Avr 2019, 20:26

Pour ceux qui sont intéressés, le voici sous la forme d'une fonction, il faut rentrer comme argument X (le facteur) et B (le sinus) de l'équation Sin(B) * X.
Le résultat est la valeur de A ( Sin(A) = Sin(B) * X)

Code: Tout sélectionner
from math import sin, pi
def SinA_egal_XfoisSinB (B, X):
    min = 0
    max = pi/2
    milieu = (min + max) / 2
    for _ in range(10**6): #Combien de fois ce sera testé (ici 10⁶), détermine la précision du résultat
        if sin(milieu) < sin(B) * X:
            min = milieu
            milieu = (milieu + max) /2 #Je fais la moyenne
            resultat = milieu #Résultat est la valeur de A !
        elif sin(milieu) > sin(B) * X:
            max = milieu
            milieu = (min + milieu) /2#idem
            resultat = milieu
        elif sin(milieu) == sin(B) * X:#Si ça tombe juste
            resultat = milieu
        else:
            resultat = "erreur"
    return resultat

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

Re: Équation trigonométrique en python

par fatal_error » 26 Avr 2019, 07:29

slt,

pour tuner un peu plus ton algo

1)
#Combien de fois ce sera testé (ici 10⁶), détermine la précision du résultat

généralement on ecrit
Code: Tout sélectionner
    tant que error > epsilone

ou eventuellement
Code: Tout sélectionner
    tant que error > epsilone && steps < 10**6
        steps++

avec error = abs(sin(millieu) - sin(B)*X) et epsilone très petit (positif) genre 1e-6

ca permet de pas se farcir 10**6 iterations si on a déjà la précision souhaitée..


2) de la même manière (mais tu l'observeras problement jamais sur cet algo), ta boucle for n'a pas de condition de sortie (hormis 10**6 iter) donc si tu trouves le resultat à l'iter 2, ben tu te farcies qd même toutes les autres :D

c'est adressé avec 1 ci-dessus, même sinon simplement return resultat en plein dans le for

3) le resultat == 'erreur' est impossible
>, ou <, ou ==, ya pas d'autres possibilités, donc directement
if >, elif <, else, mais encore une fois si tu fais la sortie via epsilone, tu as juste
if >
else #(c'est inférieur, le cas d'égalité c'est pas important)
le cas d'égalité est plus à gérer en particulier, vu que c'est une solution 'comme une autre' prise dans la bande epsilone

4) pour être plus usinagaz, tu sais qu'avec python tu peux passer des fonctions donc par ex, l'equation tu la réécris
sin(milieu) - sin(B)*X = 0
ici, tu remarques que tu avais testé
Code: Tout sélectionner
if sin(milieu) > sin(B)*X

mais tu peux aussi écrire
Code: Tout sélectionner
if sin(milieu) - sin(B)*X > 0

donc si tu poses une fonction f(milieu) = sin(milieu)-sin(B)*X
tu peux écrire
Code: Tout sélectionner
if f(milieu)>0

et donc tu peux écrire ton algo(SinA_egal_XfoisSinB à renommer de fait) avec en param la fonction supplémentaire
Code: Tout sélectionner
def SinA_egal_XfoisSinB (f, B, X):
    min = 0
    max = pi/2
    steps = 0
    err = 1
    eps = 1e-6
    resultat = 2 #ne doit jamais arriver vu que sin prend ses valeurs dans 0;[pi/2~=1.5]

    while err > eps and steps < 10**6:
        milieu = (min + max) /2 #Je fais la moyenne
        if f(milieu, B, X) < 0:
            min = milieu
        else:
            max = milieu
        err = abs(f(milieu, B, X))
    return resultat

on peut faire un peu mieux (en particulier pour pas se farcir B et X à passer à SinA_egal_XfoisSinB, peut-être vois-tu, le terme c'est closure)
la vie est une fête :)

Avatar de l’utilisateur
fatal_error
Membre Légendaire
Messages: 6610
Enregistré le: 22 Nov 2007, 12:00

Re: Équation trigonométrique en python

par fatal_error » 26 Avr 2019, 07:38

j'ajoute quand même, tu as traité le cas ou la solution est dans 0;pi/2, tu as oublié la solution symétrique dans ce cas là.
et tu as aussi oublié la solution lorsque le sinus est négatif!
la vie est une fête :)

 

Retourner vers ϟ Informatique

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité

Tu pars déja ?



Fais toi aider gratuitement sur Maths-forum !

Créé un compte en 1 minute et pose ta question dans le forum ;-)
Inscription gratuite

Identification

Pas encore inscrit ?

Ou identifiez-vous :

Inscription gratuite