Forum de mathématiques - Bibm@th.net
Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
Discussion fermée
#1 05-11-2020 08:39:36
- Lulutomtom83
- Membre
- Inscription : 05-11-2020
- Messages : 2
Dm de maths, programme python
Bonjour ! J'ai un programme en python à remplir, mais je n'y arrive pas vraiment...
La consigne :
Il faut compléter le programme ci-dessous en python afin qu'il affiche tous les termes de cette suite :
La suite est :
{ Uo = 3, U1 = 1
{ Un+1 = 2Un-1 +Un
Et le programme à remplir est :
def u(n)
if ...........
return 3
elif n==1 :
return .......
return .........
J'ai calculé U2 = 1 , U3 = 3 et U4 = 5
Si vous pouviez m'aider en le remplissant ça m'aiderait énormément ?, merci beaucoup ! Bonne journée :)
Hors ligne
#2 05-11-2020 12:52:54
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Dm de maths, programme python
Re,
Désolé, mais je ne ferai pas le travail à ta place, il faut que tu réfléchisses un peu (*).
En Python, on respecte l'indentation (balise code : <>)
def u(n):
if ...........
return 3
elif n==1 :
return
return .........
C'est mieux comme ça...
Alors après de un(n), il manquait le caractère : (deux points).
Ensuite, il est particulièrement recommandé de ne pas donner le même nom à une variable et une fonction sous peine d'incohérence grave.
Là, j'ignore qui a proposé ce code à trous (probablement sorti d'un bouquin ou d'une brochure papier ou pdf), mais ce n'est pas brillant : il ne fonctionnera pas sans des ajouts supplémentaires, par ex le calcul de la Suite.
Or pour calculer un terme quelconque de cette suite (à partir de U2) tu as besoin des 2 termes précédents : $U_2=U_1+2U_0$, $U_3=U_2+2U_1$, $U_4 = U_3+2U_2$
Où sont-ils conservés dans cette fonction ?
Où est le calcul de $U_2$, $U_3$, $U_4$ dans ce code ?
--> afin qu'il affiche : ce code n'affiche rien. L'affichage à l'écran réclame l'instruction print().
--> affiche tous les termes : combien ? Parce que tous c'est impossible, la suite est croissante et n'a pas de limite
--> J'ai calculé U2 = 1 , U3 = 3 et U4 = 5
Pas d'accord !
n = 0 U0 = 3
n = 1 U1 = 1
n = 2 U2 = 7
n = 3 U3 = 9
n = 4 U4 = 23
n = 5 U5 = 41
n = 6 U6 = 87
n = 7 U7 = 169
n = 8 U8 = 343
n = 9 U9 = 681
n = 10 U10 = 1367
En effet
$U_2=U_1+2U_0= 1+2 \times 3 = 1+6=7$,
$U_3=U_2+2U_1= 7+2 \times 1= 7+2=9$
$U_4=U_3+2U_2= 9+2 \times 7= 9+14 =23$
(*) En fait après examen attentif, je crains fort que seul, même guidé, tu ne t'en sortes pas...
Ce code est tout simplement horrible :
Pour afficher toutes les valeurs de U (ou le nombre choisi), il te faut une boucle for....
A moins que l'exercice soit encore plus simplet que je ne le coyais
et ne te demande d'afficher :
1
3
Un+1 = Un+2Un-1
Dans ce cas ça irait.
Peux-tu soit me fournir le sujet recopié et identique à la virgule près, soit me préciser ce que celui qui t'a donné le sujet beut ditre avec la phrase :
compléter le programme ci-dessous en python afin qu'il affiche tous les termes de cette suite
En attendant tu peux compléter ça facilement :
return 3
elif n==1 :
return ....
.
parce qu'il est dit
{ Uo = 3, U1 = 1
{ Un+1 = 2Un-1 +Un
Si n=1 quelle valeur dois-tu retourner ? donc return .. ? ici plutôt que que retourner un nombre, écrire return "U0= ..." avec la valeur de n à la place de ..
Et si tu retournes 3, quelle valeur de n as-tu testée ? donc if n== .. ? D'ailleurs mieux que return 3 : return "U0=3"
Et le dernier return ? vois-tu ce que qu'il faudrait retourner ?
@+
Hors ligne
#3 05-11-2020 19:50:40
- Lulutomtom83
- Membre
- Inscription : 05-11-2020
- Messages : 2
Re : Dm de maths, programme python
Bonjour !
déjà merci d'avoir pris le temps d'écrire tout ça !
de plus, merci oui pour les résultats de U2, U3, U4 etc. car effectivement je m'étais bien trompé !
voici exactement mon sujet, écrit à la virgule près ;) :
Soit la suite (Un) définie sur N par : { Uo = 3, U1 = 1
{ Un+1 = 2Un-1 + Un
1) Calculer U2, U3, U4.
2) Recopier et Compléter le programme ci-dessous en python afin qu'il affiche tous les termes de cette suite :
def u(n):
if ...........
return 3
elif n==1 :
return.....
return .........
je vais demander à mon prof si l'on peut rajouter des étapes ou non :/
Pour ce que je peux compléter facilement, voici ce que j'ai proposé :
if n==0:
return 3
elif n==1:
return 1
je ne comprends pas par contre ce qu'il faut retourner pour le dernier "return"... Ce n'est pas très clair :////
Je vais essayer de faire le programme maintenant quand même avec vos aides et explications. Je reviens très vite !
merci beaucoup pour votre réponse !!
Hors ligne
#4 05-11-2020 21:46:34
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Dm de maths, programme python
Re,
if n==0:
return 3
elif n==1:
return 1
Oui, c'est bon...
Connais-tu (et tes petit camarades avec toi) la différence entre nombre et chaine de caractères et comment passer de l'une à l'autre ?.
>>> type(m), type(n)
(<class 'int'>, <class 'str'>)
dans le code ci-dessus je mets dans la variable m, le nombre entier 2, et la chaîne de caractère "2".
type() me dit à quels types de variables appartiennent m et n :
pour m c'est le type int abréviation de integer (entier)
pour n, c'est le type str abréviation de string (chaîne)
str(2), c'est l'instruction qui permet de transformer l'entier 2 en la chaîne "2"
J'aurais aussi pu écrire :
>>> m,n=2,"2"
Oui, le dernier return n'est pas clair
Si c'est une valeur de U qui n'est $U_0$, ni $U_1$, alors ce code ne peut pas fonctionner :
1. Mettons que la valeur à retourner soit celle de $U_4$. Comment sera-ce possible alors que, dans la fonction , ne sont pas connues les valeurs de $U_3$ et $U_2$ ? Donc un return U pour finir déclenchera un message d'erreur...
2. Il faudra donc calculer la Valeur U entre le return 1 et un return U
2. A ce que je vois, l'affichage de n'importe quelle valeur de "U_n", n'est pas géré dans la fonction : cette fonction n'affichera rien du tout.
Il faudrait insérer au moins une ligne, avant chaque return, avec un print(). Mais pas de pointillés dans le code donc c'est pas prévu ?
3. Ou alors gérer l'affichage à l'extérieur de la fonction avec un seul print, qq ch comme print u(n). mais j'ai le même souci que le 2) :
pas de pointillés dans le code donc c'est pas prévu ?
4. A quoi sert le n ? C'est l'indice du U... Et on en revient au point 1.
Pour pouvoir calculer $U_{n+1}$, j'ai besoin de connaître $U_n$ et $U_{n-1}$...
Pour pouvoir calculer $U_4$, j'ai besoin de connaître $U_3$ et $U_2$..
Mais
Pour pouvoir calculer $U_3$, j'ai besoin de connaître $U_2$ et $U_1$.
Pour pouvoir calculer $U_2$, j'ai besoin de connaître $U_1$ et $U_0$.
Alors tu vas penser $U_1$ et $U_0$, je les ai...
Oui et non.
Si je passe à la fonction la valeur 2 :
1er test : n==0 ? Non, elle passe
2e test : n==1 ? Non, elle passe
Et on arrive au dernier return
Quand j'ai fait mes essais, j'ai pensé à : return U1+2*U0
Oui, mais c'est quoi, U0 et U1? Réponse des variables que ne connaît pas la fonction...
Python va donc couiner et me coller un message d'erreur...
Alors, on peut penser à contourner comme ça :
if n==0:
U0=3
return U0
elif n==1:
U1=1
return U1
return U1+2*U0
J'ai déjà triché 2 fois : j'ai ajouté 2 lignes ! (pas prévu).
Bof, pas grave...
Si parce que Python va donc couiner quand même et me coller un message d'erreur...
Pourquoi ? Parce que arrivé au dernier return comme n=2, il aura ignoré ce qui suit le if et le elif qui suit le if.
Il n'aura donc pas connaissance de l'existence même des variables U_0 et U_1...
(au passage elif ne se justifie pas, else suffit, elif s'emploie avec la construction :
if Si
elif Sinon Si
else Sinon)
Retour à la case départ.
5. La seule solution, "débile", est
if n==0:
return 3
elif n==1:
return 1
return "Un +2*Un-1" # (chaîne de caractère et Python ne couine plus)
Et on appelle la fonction en lui passant une valeur de n : print(u(n))... Mais je triche quand même, j'ai ajouté une ligne pas prévue
Pourquoi "débile"
print(u(0)) affiche 3... ok
print(u(0)) affiche 1... ok
Mais,
print(u(2)) affiche la chaîne Un +2*Un-1...
print(u(3)) affiche la chaîne Un +2*Un-1...
print (u(4)) affiche la chaîne Un +2*Un-1...
...............
print (u(50)) affiche la chaîne Un +2*Un-1...
C'est ça afficher toutes les valeurs ?...
Je me suis battu 3/4 h pour coller à la fonction à compléter : rien ne marche...
Alors j'ai dû m'en éloigner et stocker au fur et à mesure les U calculés dans une liste (connais-tu les listes ?), créer une boucle extérieure (connais-tu la boucle for ?) et l'appel à la fonction se fait en lui passant en paramètre l'indice de la boucle, qui permet d'extraire les 2 dernières valeurs stockées pour calculer la suivante et la stocker à la suite...
Là, ça fonctionne mais ça fait beaucoup de modifications...
Demain, j'aurai peut-être une autre idée...
@+
Hors ligne
#5 05-11-2020 23:32:18
- Lulutomtom836
- Invité
Re : Dm de maths, programme python
Bonsoir, wow merci pour ce travail, c'est énorme. on devrait vou s
j'ai demandé à mon prof si on pouvait rajouter des lignes mais toujours pas de réponses pour l'instant...
pour répondre à votre question, non nous ne connaissons pas la différence entre nombre et chaine de caractères et comment passer de l'une à l'autre :/
si je ne peux pas rajouter de ligne, je pense mettre ça du coup :
def u(n)
if n==0:
return 3
elif n==1:
return 1
return "Un +2*Un-1"
si je peux par contre, peut-être bien de rajouter comme vous l'avez précisé print(u(n)) à la fin et peut-être aussi un input() avant pour définir déjà quel nombre je veux definir ?
et oui! je connais les liste et les boucles !!
je voulais mettre un "for i in range" ou quelque chose comme ça si on pouvait rajouter des lignes mais je ne sais pas si j'en ferai une bonne utilisation.
merci beaucoup pour vos réponses !!
à ++
#6 06-11-2020 12:00:17
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Dm de maths, programme python
Bonjour,
Je rectifie d'abord une bêtise... J'ai fait erreur : si il faut bien utiliser ici.
Voilà mon code épuré :
def u(i,L):
if i==0:
return [3]
elif i==1:
return [3,1]
return L+[L[i-1]+2*L[i-2]]
S,n=[],20
for j in range(n):
S=u(j,S)
print ("U"+str(j)+" =",S[j])
J'ai utiliser j et non i dans ce code sinon, je ne peux pas poster : c'est le moteur du forum qui veut ça : il croit que c'est le code de passage en italique. Dans Python, il y a bien i, mais ça n'a pas d'importance j ou i ça marche aussi bien...
Ce code renvoie la liste de tous les $U_j$
la limite n n'est utilisée que comme limite de la boucle.
Avant la boucle, je déclare une liste vide S et la limite n (en fait avec n=20, la boucle ne calculera que jusqu'à $U_{19}$ (c'est normal de 0 à 19, ça fait bien 20.)
Dans la boucle j'appelle la fonction u et je lui passe en paramètre le i et la liste S (S comme suite) et je récupère la liste S ; d'où le S=u(i,S)
Dans la fonction, je récupère le i, la liste S sous le nom de L (pour te montrer, que dans la fonction les variables sont locales) donc je peux les récupérer soit avec le nom d'origine, soit avec un nom différent comme la liste S que j'appelle L...
SI i == 0, la fonction renvoie la liste [3]
SINON Si i == 1, la fonction renvoie la liste [3,1]
et si >=2 ce n'est i=0, ni = 1 donc ces deux conditions sont ignorées et la fonction renvoie maintenant la fonction L à laquelle j'ai ajouté la
mini-liste contenant la somme du dernier élément de L et du double de l'avant-dernier.
Pour i ==2
On a L=[3,1]
Je lui ajoute la mini-liste [L[j]+2*L[j-1]] c'est à dire [1+2*3] soit [7]
Donc la fonction renvoie [3,1]+[7]
Et à l'arrivée S=u(j,n) me permet de récupérer S=[3,1,7]
Puis j'affiche les caractères U+la valeur de la variable numérique i convertie en chaîne de caractères par str(i)
1+2=3 mais "1"+"2"="12" : le + représente une concaténation de chaînes, je rajoute un maillon.
Si j'essaie de faire "U"+j Python couine : c'est comme si tu essayais de trouver le résultat de la somme de 1 carotte et une chaussure...
Donc si j vaut 2,
je fais "U"+"2" ce qui me donne "U2", Et les guillemets ne se voient pas à l'affichage...
Et pour faire plus joli, je concatène "U", "2" et " =", ce qui me donne à l'affichage : U2 =
puis, j'ajoute une virgule pour rester sur la même ligne et je demande d'afficher (à la suite donc) S[j], soit ici S[2]
Ce qui me donne le 3e élément de la liste S = [3,1,7], c'est à dire les listes commençant à l'indice 0 le nombre en position n° 2, soit 7...
D'où la ligne :
print("U=str(j)+" = ", S[j]).
N-B : je pourrais aussi récupérer le denier élément de la liste en demandant simplement S[-1] : 1er élément en partant de la fin...
Voilà ce que ça donne avec 20 pour n :
U0 = 3
U1 = 1
U2 = 7
U3 = 9
U4 = 23
U5 = 41
U6 = 87
U7 = 169
U8 = 343
U9 = 681
U10 = 1367
U11 = 2729
U12 = 5463
U13 = 10921
U14 = 21847
U15 = 43689
U16 = 87383
U17 = 174761
U18 = 349527
U19 = 699049
T'as tout compris ?
Dans la fonction, je me suis calé au plus près de ce qui est proposé, c'est en dehors de ladite fonction que sont les gros changements, puisque rien n'existait...
@+
Hors ligne
#7 06-11-2020 13:58:43
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Dm de maths, programme python
Bonjour
Je me suis amusé à essayer de compléter la question posée mais sans résultat ... Et pour cause
dans le deuxième return il faut impérativement mettre [3,1]
Afin qu'ensuite la fonction def u(n,L): récupère les résultats pour n == 0; n==1 , afin de calculer le résultat de n+1
puis compléter le programme après la troisième fonction return ...
"Où moi j'ai remplacé de partout les i et j par n qui est l'indice le Suite u(n)" Mais je suppose que ce n'est pas ce qu'il faut faire dans ce genre de question posé...ou en programmation "
def u(n,L):
if n==0:
return [3]
elif n==1:
return [3,1]
return L+[L[n-1]+2*L[n-2]]
S,n=[],20
for n in range(n):
S=u(n,S)
print("U"+str(n)+" =",S[n])
Hors ligne
#8 06-11-2020 15:39:41
- yoshi
- Modo Ferox
- Inscription : 20-11-2005
- Messages : 17 385
Re : Dm de maths, programme python
Salut,
Pourquoi veux-tu à tout prix utiliser les mêmes noms de variable à l'intérieur et à l'extérieur de la fonction ?
1. Ce n'est pas utile
2. Moi, j'évite. Parce qu'un débutant peut croire que c'est la même variable, ce qui est inexact, alors que c'est seulement le même nom
Si j'utilise une variable K qui est une liste de nombres à l'extérieur, et K pour une chaîne à l'intérieur de la fonction :
modifier le K extérieur en lui ajoutant des éléments ne modifie pas le K intérieur :
le K extérieur a une portée globale à l'extérieur et n'est pas vu à l'intérieur de la fonction.
le K intérieur est une variable locale qui n'a une portée que limitée à cette seule fonction.
3. C'est volontairement que j'ai utilisé dans mon code dans Python deux variables i et n.
Parce que mon propos était d'afficher tous les valeurs de $U_i$ pour i variant de 0 à n (dans mon exemple : 20).
Donc j'ai pris n=20 et j'ai fait varier i de 0 à n.
Si je voulais écrire mathématiquement que je veux la somme Somme de $U_0,\,U_1,\,U_2,\,U_3\cdots U_{19}$, j'écrirais
$\text{Somme }= \sum\limits_{i=0}^{19}\, U_i$ que je lirais : somme de i =0 jusqu'à 19 de tous les $U_i$
Là, je calcule de i=0 jusqu'à n-1, la valeur de tous les $U_i$ : c'est le même principe.
Je ne me pose même pas la question c'est un réflexe conditionné par ma pratique mathématique...
4. Dans ce que tu proposes ça ne fonctionne que parce
a) Python est parfois très (trop) conciliant mais cette écriture for n in range(n): est une horreur !
En effet, le n de for n... est une variable au sens mathématique du terme i.e dont la valeur est changeante...
Et le n de range(n) est une constante c'est une borne qui là ne devrait pas changer.
Donc ton n est à la fois variable et fixe !... Python ne devrait pas l'accepter
b) Le n de for n et le n de def u(n,L): sont deux variables (au sens de l'inform) différentes stockées par Python dans deux espaces différents...
A la place du n de def u(n,L): je pourrais écrire def u(LEG,L):
et dans la fonction je remplace systématiquement les n par LEG et ça marche...
@+
Hors ligne
#9 06-11-2020 16:00:16
- LEG
- Membre
- Inscription : 19-09-2012
- Messages : 790
Re : Dm de maths, programme python
Re @Yoshi tu as tout à fait raison , car effectivement je trouvais pour moi plus simple mais surement pas exact le fait d'interpréter les U(n) à toutes les sauce que ce soit pour les indices i , ou pour les j.
Mais si maintenant, tu les remplaces par LEG, là pour le coup ça devient comme moi : nul.... LoLL ; voila pourquoi il faut bien connaître les variables et ne pas confondre , ce qui la plupart du temps est mon cas , j'espère que les jeunes en prendront bonne note et qu'ils se conformeront à tes explications et non pas mes fantaisies non Mathématiques.
Cordialement
Gilbert@+
Hors ligne
Pages : 1
Discussion fermée







