Comment peut-on sommer des fonction avec lambda de python

Utilisateur anonyme -  
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   -
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

trifou
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
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
 
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 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Utilisateur anonyme
 
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