Programmation

Retrouver tous les sujets résolus.
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation

Message par sos-math(21) » lun. 28 déc. 2020 10:57

Bonjour,
Il existe des fonctions Python qui calculent les dérivées de fonctions : il faut que tu cherches dans les documentations des modules sympy, numpy ou script. Regarde aussi les fonctions que l’on a construites au début du sujet.
Bonne continuation
Invité

Re: Programmation

Message par Invité » lun. 28 déc. 2020 12:31

Bonjour

Merci de la réponse

On pourrait utiliser la fonction diff() de la bibliothèque sympy ?

Mais après je vois pas du tout comment je pourrais utiliser ça dans la formule que j'ai donnée dans mon précédent message.,..
Invité

Re: Programmation

Message par Invité » lun. 28 déc. 2020 21:54

bonsoir avez-vous reçu mon dernier message ?

bonne soirée !
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation

Message par sos-math(21) » mer. 30 déc. 2020 20:58

Bonjour,
tu peux utiliser un programme similaire à celui du point fixe sauf que tu prends la formule proposée avec la dérivée, calculée en Python avec la fonction "derivative" du module scipy :

Code : Tout sélectionner

from scipy.misc import derivative
...
x = (f(x0) - x0*derivative(f,x0))/(1 - derivative(f,x0))
...
je te laisse construire cette nouvelle fonction et chercher le point fixe de la fonction donnée en exemple.
Bonne continuation
Invité

Re: Programmation

Message par Invité » jeu. 31 déc. 2020 03:04

Merci, voici ce que je propose pour la fonction suriteration :

Code : Tout sélectionner

from numpy.linalg import norm
from scipy.misc import derivative

def suriteration(f,x0,tol=10e-5,maxiter=100):
	e = 1
	itr = 0
	while(e > tol and itr < maxiter):
 		x = (f(x0) - x0*derivative(f,x0))/(1 - derivative(f,x0))
 		e = norm(x0-x) # erreur du résultat à l'étape actuelle
		x0 = x
		itr = itr + 1
	return x
Est-ce correct ?
Si non, que faut-il modifier ?

merci, bon réveillon !!
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation

Message par sos-math(21) » jeu. 31 déc. 2020 10:18

Bonjour,
cela me semble correct, j'avais fait :

Code : Tout sélectionner

from numpy.linalg import norm
from scipy.misc import derivative

def pointfixe(f,x0,tol=10e-5,maxiter=100):
    e = 1
    itr = 0
    xp = []
    while (e > tol and itr < maxiter):
        x = f(x0)
        e = norm(x0-x)
        x0 = x
        xp.append(x0)
        itr = itr + 1
    return x,xp

def suriteration(f,x0,tol=10e-5,maxiter=100):
    e = 1
    itr = 0
    xp = []
    while (e > tol and itr < maxiter):
        x = (f(x0) - x0*derivative(f,x0))/(1 - derivative(f,x0))
        e = norm(x0-x)
        x0 = x
        xp.append(x0)
        itr = itr + 1
    return x,xp
et l'appel donne :

Code : Tout sélectionner

>>> pointfixe(lambda x:(2-x**2)/4,0)
(0.44949654218854873,
 [0.5,
  0.4375,
  0.4521484375,
  0.44889044761657715,
  0.44962434150964725,
  0.44945948788050405,
  0.44949654218854873])

>>> suriteration(lambda x:(2-x**2)/4,0)
(0.4494897427831786, [0.5, 0.45, 0.44948979591836724, 0.4494897427831786])

On voit que la convergence est plus rapide avec la suritération (4 tours de boucle au lieu de 7).
Bonne continuation
Invité

Re: Programmation

Message par Invité » jeu. 31 déc. 2020 13:07

Merci beaucoup de votre réponse.

J'ai une dernière méthode à programmer, la voici : https://www.cjoint.com/data/JLFmhmpBUdO_newton.png

Voici le code que je propose (je me suis un peu aidé d'internet, mais un peu seulement) :

Code : Tout sélectionner

from scipy.misc import derivative

def newtonRaphson(f,x0,tol=10e-5,maxiter=100):
    compteur =0
    xn = x0
    while abs (f(xn)/derivative(f,xn)) >= tol and compteur < maxiter:
        xn=xn-f(xn)/derivative(f,xn)
        compteur += 1
        if derivative(f,xn) == 0 :
            print ("Fin du programme division par 0 impossible !")
            break
    print ("Une solution proche de ",xn ," avec ", compteur ," itération (s)")
Ce programme est-il correct selon vous ?
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation

Message par sos-math(21) » jeu. 31 déc. 2020 15:35

Bonjour,
ce programme est correct, il ressemble aux autres programmes précédents, la différence tient à une condition d'arrêt de la boucle si la dérivée est égal à 0 car il y a un quotient par \(f'(x_n)\).
En faisant un essai avec la fonction indiquée, on retrouve une valeurs approchée de \(\sqrt{2}\)

Code : Tout sélectionner

>>> newtonRaphson(lambda x:x**2-2,2)
Une solution proche de  1.4142156862745099  avec  3  itération (s)
.
Bonne continuation
Invité

Re: Programmation

Message par Invité » jeu. 31 déc. 2020 15:41

Merci beaucoup !

Voici la suite de l'exercice : https://www.cjoint.com/data/JLFoMw3LomO ... ations.png

Mais j'ai un problème, comment utiliser la fonction newton que l'on vient de construire alors qu'il y a b, une constante, dans l'expression de la fonction de la première application ?
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation

Message par sos-math(21) » dim. 3 janv. 2021 14:00

Bonjour,
je pense qu'il faut que tu attribues des valeurs à \(a\) et \(b\).
je ne vois pas d'autre possibilité... qu'y a-t-il avant cette question dans ton énoncé ?
Bonne continuation
Invité

Re: Programmation

Message par Invité » mar. 5 janv. 2021 03:11

Vous avez raison il n'y a aucune donnée concernant a et b avant.

Voici donc ce que je fais pour tracer la courbe (je prends b=3 et a=4) :

Code : Tout sélectionner

import numpy as np
import matplotlib.pyplot as plt
x=np.linspace (−10,10,100)
y=3*np.sin(x)-x/4
plt.plot(x,y)
En traçant la courbe j'évalue la valeur des deux racines à :
x1=-2,57 et x2=2,57

Le code que j'ai écrit est-il correct ? Les valeurs des racines que j'ai évaluées sont-elles correctes aussi ?

Par contre, que peut-on remarquer pour la question 2 en utilisant la méthode de Newton en partant de valeurs initiales différentes ?
Je ne vois rien de bien flagrant ou d'intéressant... Et vous ?

Merci bonne journée ! :)
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation

Message par sos-math(21) » mar. 5 janv. 2021 20:14

Bonjour,
il faut sûrement faire plusieurs calculs avant de remarquer quelque chose.
Je te laisse creuser le problème.
Bonne continuation
Invité

Re: Programmation

Message par Invité » mar. 5 janv. 2021 20:40

Merci d'avoir répondu, hélas j'ai bien creusé, dimannche après-midi, et toute la soirée de lundi (jusqu'à même beaucoup trop tard dans la nuit comme vous devez le voir à l'horaire de l'envoi de mon message)...

Avez-vous une idée de votre côté ?

Merci beaucoup
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation

Message par sos-math(21) » mar. 5 janv. 2021 21:26

Bonjour,
non, je n'ai pas d'idée pour le moment, l'énoncé est trop vague. Peut-être un mail à ton professeur afin de lui demander ce qu'il attend pour cette question ?
Bonne continuation
Invité

Re: Programmation

Message par Invité » mer. 6 janv. 2021 20:11

J'ai envoyé un mail au prof, mais elle refuse de me dire quoi que ce soit.

VOici donc ce que je fais pour cette première application (rappel de l'énoncé ici : https://www.cjoint.com/data/JLFoMw3LomO ... ations.png)

Code : Tout sélectionner

import numpy as np
from scipy.misc import derivative

def newtonRaphson(f,x0,tol=10e-5,maxiter=100):
    compteur =0
    xn = x0
    while abs (f(xn)/derivative(f,xn)) >= tol and compteur < maxiter:
        xn=xn-f(xn)/derivative(f,xn)
        compteur += 1
        if derivative(f,xn) == 0 :
            print ("Fin du programme division par 0 impossible !")
            break
    print ("Une solution proche de ",xn ," avec ", compteur ," itération (s)")

print(newtonRaphson(lambda x:3*np.sin(x)-x/4,2.5,tol=10e-5,maxiter=100))
J'obtiens alors :

Code : Tout sélectionner

Une solution proche de 2.897690225800663 avec 6 iteration (s)
None
Mais j'obtiens avec x0=10 une valeur de 8.623..... avec 6 itérations.

C'est une valeur complètement différente de la première !

Qu'en pensez-vous ?

Je suis très étonnée et un peu désemparée là .....
Répondre