Topic: Plottare funzioni con variabile x molitplicata per un array  (Letto 277 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Pyspys

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Ciao a tutti. Ho una funzione (scalare) da plottare in cui la variabile indipendente è moltiplicata attraverso l'operatore * con un array: per fare un esempio banale, possiamo prendere il codice


import numpy as np
import matplotlib.pyplot as plt

def f(x):
     return sum(x*np.array([1,2]))

x = np.linspace(-10, 10, 100)
plt.plot(x, f(x), color='red')
plt.show()


Questo codice non funziona, perché x è visto da Python come l'intero array lungo 100 anziché come le sue componenti. Come posso ottenere il risultato corretto?

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:Plottare funzioni con variabile x molitplicata per un array
« Risposta #1 il: Settembre 14, 2022, 16:09 »
Non capisco cosa ti aspetti.


x è un array, lo moltiplichi per un altro array e poi fai sum.


Ipotizzando che x sia [a, b, c], ti aspetti qualcosa tipo [(1a + 2a), (1b + 2b), (1c + 2c)]?


Se sì, dovresti manipolare gli array in modo leggermente diverso (considera che non sono un esperto):

def f(x):
    xm = np.atleast_2d(x).T # transform x to 2d matrix of shape (100,1)
    xms = np.hstack([xm, xm]) # duplicate x in the second column
    r = xms * y # do actual multiplication
    return r.sum(axis=1) # sum along rows






Offline Pyspys

  • python unicellularis
  • *
  • Post: 2
  • Punti reputazione: 0
    • Mostra profilo
Re:Plottare funzioni con variabile x molitplicata per un array
« Risposta #2 il: Settembre 14, 2022, 17:26 »
Provo a spiegarmi meglio. Quello che voglio fare è fare il grafico di f(x) (che è una funzione scalare) al variare di x (un altro scalare!) in un certo intervallo. Solitamente, per funzioni 1D si usa matplotlib con la sintassi


import numpy as np
import matplotlib.pyplot as plt

x=np.linspace(-10,10,100) #divide l'intervallo [-10,10] in 100 punti equispaziati
y=x**2

plt.plot(x,y)
plt.show()


Supponi però di avere una funzione più complicata in cui la variabile x entra a moltiplicare scalarmente un array (chiamalo v), come nel mio esempio (che è fatto a caso, non è la funzione che sto studiando io). Allora questo non funziona, perché non ottieni un plot delle coppie x[k] e f(x[k]) al variare di k, ma proprio il prodotto scalare tra x come array e v.
Non so come ovviare a questo problema!

Edit. Cerco di fare ancora più chiarezza. Quando vado a plottare la funzione, discretizzo la variabile x con np.linspace(-10,10,100), che mi restituisce un array contenente cento punti (o quanti ne voglio, non è importante) sui quali valutare la funzione. Ora, se la funzione è facile come questa qui sopra, il programma capisce che non deve prendere tutti questi valori come un array quando chiama  la funzione, ma solo il primo (su cui valuta f), poi il secondo, e così via per tutti e cento i punti fino a ottenere un bel grafico.

Nella funzione dell'OP, questo va storto, perché quando chiamo f il programma gli passa una x che è un array, e giustamente lui vede x*array e fa un prodotto scalare (peraltro non riesce, perché hanno lunghezza diverse, ma non importa). Quello che voglio fare è dirgli, "guarda che devi prendere x[1] e valutare f, poi x[2] e valutare f, e così via, non prendermi tutto x come array" idealmente senza modificare la funzione f stessa.

Spero sia più chiara la questione.
« Ultima modifica: Settembre 14, 2022, 17:43 da Pyspys »

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.723
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:Plottare funzioni con variabile x molitplicata per un array
« Risposta #3 il: Settembre 16, 2022, 14:52 »
Ma la funzione f è sbagliata, quindi devi modificarla per forza.


* non fa un prodotto scalare in numpy, fa un prodotto element-wise, che è una cosa diversa.


Non capisco il processo logico che inferisce sum(x * array([1, 2])) da "voglio valutare f(x[1]), f(x[2]), ecc"


Guardati vectorize e roba simile in questi casi.