Programmation 2

Retrouver tous les sujets résolus.
Emilie

Programmation 2

Message par Emilie » jeu. 31 déc. 2020 15:33

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 !
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation 2

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

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
Invité

Re: Programmation 2

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

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 !
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation 2

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

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
Invité

Re: Programmation 2

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

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
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation 2

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

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
Invité

Re: Programmation 2

Message par Invité » mar. 5 janv. 2021 21:30

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à....
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation 2

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

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
Invité

Re: Programmation 2

Message par Invité » mar. 5 janv. 2021 21:51

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
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation 2

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

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
Invité

Re: Programmation 2

Message par Invité » mar. 5 janv. 2021 22:06

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 ?
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation 2

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

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.
Invité

Re: Programmation 2

Message par Invité » mar. 5 janv. 2021 22:24

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 ?
sos-math(21)
Messages : 10354
Enregistré le : lun. 30 août 2010 11:15

Re: Programmation 2

Message par sos-math(21) » mer. 6 janv. 2021 10:39

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
Invité

Re: Programmation 2

Message par Invité » mer. 6 janv. 2021 19:51

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 ?
Répondre