[MatLab] Valori assunti da una funzione

fabiett1
Il problema mi chiede di determinare il numero di volte che la funzione $ 3xe^(4x^2)cos(2/3pix)+50(1+sin(7x)) $ assume il valore 40 nell'intervallo $[-1,1]$.
Il codice in allegato è il mio tentativo di risoluzione con risultato, errato, uguale a zero. Penso che il problema sia il fatto che la funzione non assume mai esattamente il valore 40, bensì valori molto vicini; pertanto suppongo si debba impostare una tolleranza tale per cui la condizione è ugualmente verificata. Sbaglio? Se ho dedotto correttamente potreste mostrarmi come si fa perché non sono in grado.
Grazie molte per l'attenzione.
x = linspace(-1,1,1000);
y = 3*x.*exp(1).^(4*x.^2).*cos(2/3*pi*x) + 50*(1 + sin(7*x));
i = 0;
for n = 1:1000
    if y(n) == 40
        i = i + 1;
    end
end
i

Risposte
apatriarca
Non so se esiste un metodo migliore in Matlab, ma normalmente non si cerca di trovare un valore fissato qualsiasi, ma si trasforma sempre la condizione in modo che si cerchino gli zeri. Invece di cercare le soluzioni di \(f(x) = 40\) si cercano insomma le soluzioni di \( g(x) = f(x) - 40 = 0.\)

fabiett1
Ma non è la stessa cosa? Il risultato è sempre zero. Sicuramente ci saranno differenze molto piccole approssimabili a zero ma nessuna proprio zero. Come faccio?

apatriarca
Per verificare che i tuoi valori siano uguali a meno di una tolleranza potresti fare come segue:
abs(y(n) - 40) < eps

Nota tuttavia che questo metodo per trovare i valori presenta numerosi altri problemi:
1. Se la tolleranza è troppo bassa, potresti non essere in grado di trovare dei valori per cui la funzione assume il valore desiderato.
2. Se la tolleranza è troppo alta potresti invece trovare numerosi valori per una singola soluzione o valori per cui la funzione si fermi prima di raggiungere il tuo risultato.
3. Se la frequenza di campionamento è troppo bassa rischi di saltare alcuni valori importanti.
4. Se la frequenza è troppo alta potresti trovare troppi valori uguali a quello desiderato a seconda della tolleranza.
5. La tolleranza ottimale potrebbe variare nel tuo intervallo [-1, 1] a seconda di come sia fatta la funzione.

La principale ragione per cercare gli zeri di una funzione risiede nel fatto che esistono metodi specifici per questo particolare caso. Esistono insomma funzioni come fzero o roots per trovare valori per cui la funzione valga zero. Inoltre, supponendo che la tua funzione non abbia un massimo o minimo in quel valore, puoi stabilire se una funzione ha uno zero tra due valori confrontando il loro segno. Ovviamente i valori devono essere sufficientemente vicini da assicurarti che ci sia un solo zero in quell'intervallo o nessuno.

fabiett1
x = linspace(-1,1,1000);
y = 3*x.*exp(1).^(4*x.^2).*cos(2/3*pi*x) + 50*(1 + sin(7*x));
fzero(y,0)

Ho fatto girare il seguente codice ma non capisco perché non funziona.

apatriarca
Nota che fzero trova un singolo valore per cui la funzione valga zero. Non mi sembra sia il problema che stai cercando di risolvere (soprattutto perché la tua funzione è la stessa del primo post in cui cercavi quando valeva 40..).

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.