Page 1 sur 2

Programmation 2

Posté : jeu. 31 déc. 2020 15:33
par Emilie
Bonjour,

C'est de nouveau Emilie, avec des questions de programmation en Python.

J'ai un autre travail ici : https://www.cjoint.com/data/JLFoEuZoAZO_équationbis.png

Pourriez-vous m'aider à programmer la méthode d'Euler ?
Surtout, comment peut-on faire calculer les coefficients à Python ? Faut-il créer une liste ?

Merci vraiment de l'aide et belle Saint Sylvestre !

Re: Programmation 2

Posté : jeu. 31 déc. 2020 16:05
par sos-math(21)
Bonjour,
tu trouveras sur le web de très bonnes explications pour la méthode d'Euler comme : https://www.normalesup.org/~glafon/eiff ... erique.pdf
Si tu dois seulement utiliser le principe de la méthode d'Euler, il existe une fonction toute faite du module scipy : odeint.
Voir : https://apmonitor.com/pdc/index.php/Mai ... lEquations
Bonne continuation

Re: Programmation 2

Posté : mar. 5 janv. 2021 03:40
par Invité
merci grâce aux PDF j'ai compris.

Aujourd'hui notre prof nous a donner en cours une correction pour la méthode d'Euler et pour la méthode de Runge Ketta 4. Il paraît qu'il a pris ça d'un livre.

Il a donné ça pour la méthode d'Euler :

Code : Tout sélectionner

import numpy as np
import matplotlib.pyplot as np
def eulerExpl (f,t0,y0,tf,N):
	h =(tf-t0)/N
# definition du pas fixe
	# sinon h=t[i+1]-t[i]
	Ly,Lt=[y0],[t0]
stockage du point initial
	for k in range (N):
# A la limite Lt peut etre donne ailleurs
# prevoir que y0 peut etre vectoriel
		y0 = y0 + h*np.array(f(t0,y0))
		t0 += h
		Ly.append(y)
		Lt.append(t0)
	return np.array(Lt),np.array(Ly)
Et pour la méthode de Runge Ketta 4 :

Code : Tout sélectionner

import numpy as np
def rungeKutta4(dXdt,X0,t):
"""
Entrees :
t : contient les points de la subdivision
X0 : les conditions initiales
dXdt : la fonction connue
Sorties :
X : Solutions approchees aux points de t
"""
	n = len(t)
	X = np.zeros((len(t),)+ np.shape(X0)) # on construit une matrice de 0
	X[0]=X0 # stocker les valeurs initiales
	for i in range (n-1):
		k1=dXdt(X[i],t[i]) # k1=f(y,t)
		h=(t[i+1]-t[i])/2
		k2=dX_dt(X[i]+h*k1,t[i]+h)
		k3=dX_dt(X[i]+h*k2,t[i]+h)
		k4=dX_dt(X[i]+2*h*k3,t[i]+2*h)
		X[i+1]=X[i]+h/3*(k1+2*k2+2*k3+k4)# on a deja divise h par 2
	return(X)
Ensuite il y a deux exercices que je bloque dessus.
Je les ai mis ici : https://www.cjoint.com/data/KAfcIVZuecf ... python.png

Dans l'exercice 1, comment appeler les fonctions que j'ai données juste au-dessus ? Comment je peux les utiliser avec la question 1 de cet exo 1 ?
par exemple t appartient à [0;1,5], mais du coup on prend t égal à combien dans la question 1 ? Et x0 c'est combien ?
Pourreiz-vous m'expliquer tout cela svp ? Que mettre dans les arguments des deux fonctions ?

merci énormément de l'aide apportée !

Re: Programmation 2

Posté : mar. 5 janv. 2021 20:09
par sos-math(21)
Bonjour,
tes fonctions renvoient des valeurs approchées des solutions aux points de la subdivision.
Il s'agit donc de calculer l'erreur relative commise entre les différentes solutions, en calculant par exemple la somme des valeurs absolues des différences \(X[j]-Y[j]\) au point de la subdivision.
Je te laisse chercher car j'ai tout de même l'impression de tout faire et ce n'est pas l'esprit du forum.
Bonne continuation

Re: Programmation 2

Posté : mar. 5 janv. 2021 20:41
par Invité
d'accord

l'erreur relative c'est la fonction erf ou c'est quelque chose déjà construit par Python qu'on appelle avec from ?

merci beaucoup

Re: Programmation 2

Posté : mar. 5 janv. 2021 21:24
par sos-math(21)
Bonjour,
non erf c'est une fonction bien spéciale en mathématiques, qui n'a pas grand chose à voir avec ta situation : https://fr.wikipedia.org/wiki/Fonction_d%27erreur
L'erreur relative serait plutôt cela : https://lexique.netmath.ca/erreur-relative/
et il faut que tu fasses la somme des erreurs aux points de comparaison (points de la subdivision).
Bonne continuation

Re: Programmation 2

Posté : mar. 5 janv. 2021 21:30
par Invité
Donc si j'ai bien compris l'erreur relative c'est la valeur absolue des différences X[j]−Y[j] au point de la subdivision ?

Mais ensuite on doit sommer quoi ?

Je crois que je m'embrouille là....

Re: Programmation 2

Posté : mar. 5 janv. 2021 21:33
par sos-math(21)
Tu dois faire la somme des valeurs absolues à des écarts de chaque différence : |X[0]-Y[0]|+|X[1]-Y[1]|+|X[2]-Y[2]|+.....
Bonne continuation

Re: Programmation 2

Posté : mar. 5 janv. 2021 21:51
par Invité
OK merci je comprends mieux !

Normalement le code que j'ai écrit en dessous permet de faire ça ? Est-ce juste ?

Code : Tout sélectionner

liste=[abs(X[i]-Y[i]) for i in range (n)]

def somme(liste):
    somme = 0
    for i in liste:
        somme = somme + i
    return somme

Re: Programmation 2

Posté : mar. 5 janv. 2021 22:04
par sos-math(21)
Tu sommes les indices pas les valeurs des termes de la liste : il faut ajouter l'élément de la liste d'indice j (liste[j]).
Par ailleurs si tu veux mesurer l'erreur relative de Y par rapport à X, il faut plutôt calculer abs(((X[j]-Y[j])/X[j]) : le quotient par X[j] permet de mesurer l'importance relative de l'écart par rapport à la valeur attendue

Code : Tout sélectionner

def somme(liste):
    somme = 0
    for i in liste:
        somme = somme + liste[i] # on ajoute liste[i] pas i
    return somme
Bonne continuation

Re: Programmation 2

Posté : mar. 5 janv. 2021 22:06
par Invité
liste=[abs(((X[j]-Y[j])/X[j]) for i in range (n)]
def somme(liste):
somme = 0
for i in liste:
somme = somme + liste
return somme


Ca ça fonctionnerait ou pas ?

Je comprends pas trop pourquoi c'est liste et pas juste i, car j'ai mis for i in liste ?
Vous pourriez m'expliquer svp ?

Re: Programmation 2

Posté : mar. 5 janv. 2021 22:09
par sos-math(21)
Pardon, j'avais mal lu. Tu as raison.
Cela fonctionne, mais évite d'utiliser la lettre i qui est réservée habituellement aux indices.
Prends plutôt un nom de variable var ou elt afin que ce soit plus clair :

Code : Tout sélectionner

def somme(liste):
    somme = 0
    for elt in liste:
        somme = somme + elt
    return somme
Avec mes excuses.

Re: Programmation 2

Posté : mar. 5 janv. 2021 22:24
par Invité
Pas de problème, vous m'aidez beaucoup, une erreur peut arriver !

Donc je récapitule :

Code : Tout sélectionner

liste=[abs(((X[j]-Y[j])/X[j]) for i in range (n)]
def somme(liste):
    somme = 0
    for elt in liste:
        somme = somme + elt
    return somme
Est-ce que tout est correct maintenant ?

Re: Programmation 2

Posté : mer. 6 janv. 2021 10:39
par sos-math(21)
Bonjour,
Dans ta liste, il faut écrire : for j in range(len(X) car la variable n n’est pas connue et tu utilises j comme indice de tes listes.
Sinon, cela me semble correct : il n’y a qu’un moyen de le vérifier c’est d’exécuter le programme.
Bonne application

Re: Programmation 2

Posté : mer. 6 janv. 2021 19:51
par Invité
Merci beaucoup !

Mais du coup quand j'exécute ça :

Code : Tout sélectionner

liste=[abs(((X[j]-Y[j])/X[j]) for j in range (len(X))]
def somme(liste):
    somme = 0
    for elt in liste:
        somme = somme + elt
    return somme
Python tourne sans s'arrêter, je n'obtiens jamais de résultat...

Est-ce pareil avec vous ?