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.