Comment peut-on sommer des fonction avec lambda de python

Fermé
Utilisateur anonyme - Modifié le 6 déc. 2019 à 17:09
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 - 6 déc. 2019 à 21:05
Bonjour, quelqu'un peut-il m'aider, j'aimerais savoir comment peut-on faire pour sommer des fonctions avec lambda de python car je me retrouve avec une erreur merci d'avance pour toute aide ! :)

import matplotlib.pyplot as plt
import numpy as np
import math

X1 = [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0]
Y1 = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]


def VDM(X, p):
    A = np.empty([len(X), p])
    index = 0
    while p != 0:
        p -= 1
        for i in range(0, len(X)):
            A[i, index] = X[i]**(p)
        index += 1
    return A

def polynome(X, Y, p):
    A = VDM(X, p)
    A_transpose = np.transpose(A)
    Y = np.array([Y])
    Y_transpose = np.transpose(Y)

    produit1 = np.dot(A_transpose, A)
    produit2 = np.dot(A_transpose, Y_transpose)
    
    solutions = np.linalg.solve(produit1, produit2)
    y = lambda x : solutions[0]*x**(p-1) # voici mon polynôme initialisé
    for i in range(1, len(solutions)-1):
        y += solutions[i]*x**(i+1) # voici les sommes de polynôme c'est ici que j'ai une erreur !!!
    return y
    #y = lambda x : solutions[0]*x** 3 + solutions[1]*x**2 + solutions[2]*x**1 + solutions[3]*x**0

plt.scatter(X1, Y1, s = 50, c = 'red')

x = np.linspace(min(X1),max(X1),200)
y = polynome(X1, Y1, 4) # c'est une approximation d'un polynôme par un nuage de points à l'ordre 4 plus l'ordre est grand plus c'est précis !
plt.plot(x, y(x))
plt.grid()
plt.show()



Configuration: Windows / Chrome 78.0.3904.108
A voir également:

2 réponses

Bonsoir,

Que ce soit une fonction lambda ou non, le principe est le même.

Nommer une fonction y est une mauvaise idée.

get_y = lambda si, v: solutions[si] * x**v

# voici mon polynôme initialisé
y = get_y(0, p-1)
y += sum(get_y(i, i + 1) for i in range(1, len(solutions) - 1))


C'est sans doute pas vraiment ce que tu veux obtenir comme résultat et le nom de la fonction n'est sans doute pas représentative de ce qu'elle doit faire.

Les lambdas sont plus réservées pour créer des fonctions à la volée, dans ton code il est préférable d'en faire une fonction bien établie que l'on peut documenter.
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 Ambassadeur 1 550
Modifié le 6 déc. 2019 à 20:28
bonjour,
je trouve que les noms de tes variables sont mal choisis, et n'aident pas à comprendre ton programme.
au lieu de la fonction polynome, je ferais une classe de même nom:
class polynome: 
  def __init__(self, X, Y, p):
    A = VDM(X, p)
    A_transpose = np.transpose(A)
    Y = np.array([Y])
    Y_transpose = np.transpose(Y)
    produit1 = np.dot(A_transpose, A)
    produit2 = np.dot(A_transpose, Y_transpose)
    self.solutions = np.linalg.solve(produit1, produit2)
    self.p =  p
  def f(self, x):
    y= self.solutions[0]*x**(self.p-1) # voici mon polynôme initialisé
    for i in range(1, len(self.solutions)-1):
        y += self.solutions[i]*x**(i+1) # voici les sommes de polynôme c'est ici que j'ai une erreur !!!
    return y

et je remplacerais la ligne 38 par
y = polynome(X1, Y1, 4).f
0
Utilisateur anonyme
6 déc. 2019 à 20:34
je te commente mon code pour une compréhension de mon algo



#Nuage de points afin d'approximer un polynôme avec !
X1 = [10.0, 8.0, 13.0, 9.0, 11.0, 14.0, 6.0, 4.0, 12.0, 7.0, 5.0]
Y1 = [8.04, 6.95, 7.58, 8.81, 8.33, 9.96, 7.24, 4.26, 10.84, 4.82, 5.68]


def VDM(X, p): #cette fonction retourne la matrice de Vandermonde
A = np.empty([len(X), p])
index = 0
while p != 0:
p -= 1
for i in range(0, len(X)):
A[i, index] = X[i]**(p)
index += 1
return A

def polynome(X, Y, p): #cette fonction retourne un polynôme d'ordre p exemple p = 3 a*x**2 + b*x + c
A = VDM(X, p)
A_transpose = np.transpose(A)
Y = np.array([Y])
Y_transpose = np.transpose(Y)

produit1 = np.dot(A_transpose, A)
produit2 = np.dot(A_transpose, Y_transpose)

solutions = np.linalg.solve(produit1, produit2) #cela trouve les variables a, b et c de a*x**2 + b*x + c
y = lambda x : solutions[0]*x**(p-1) # voici mon polynôme initialisé
for i in range(1, len(solutions)-1):
y += solutions[i]*x**(i+1) # voici les sommes de polynôme c'est ici que j'ai une erreur !!!
return y
# cela doit retourner pour un exemple d'ordre 3 ==> y = lambda x : solutions[0]*x** 3 + solutions[1]*x**2 + solutions[2]*x**1 + solutions[3]*x**0, cette forme est traduite par a*x**2 + b*x + c

plt.scatter(X1, Y1, s = 50, c = 'red')

x = np.linspace(min(X1),max(X1),200)
y = polynome(X1, Y1, 4) # c'est une approximation d'un polynôme par un nuage de points à l'ordre 4 plus l'ordre est grand plus c'est précis !
plt.plot(x, y(x))
plt.grid()
plt.show()
0
yg_be Messages postés 23342 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 21 novembre 2024 1 550 > Utilisateur anonyme
6 déc. 2019 à 21:05
je recommande que tu adaptes les noms de tes variables, cela complète les commentaires et t'aidera à comprendre.
merci de toujours utiliser les balises de code quand tu postes du code.
as-tu testé ma suggestion?
quand tu n'auras plus d'erreur, tu constateras que tes résultats ne sont pas corrects.
0