Comando fzero matlab

di il
4 risposte

Comando fzero matlab

Buonasera a tutti sto scrivendo in quanto sto cercando di utilizzare il comando fzero per trovare gli zeri di una funzione (ne ha 4) ma mi da sempre errore!

Vi allego il codice della funzione
a=5
b=2
x=(-4:.1:9)
y=(a.*sin(x).*exp(5-0.01.*x.^2)+b.*(x.^2+4.*x+5))


[img]file:///C:/Users/Graziano's%20PC/Pictures/untitled.jpg[/img]

avendola implementata con una function, chiamata funrif,per calcolare gli zeri facevo
z=fzero(@funrif,3)
dove 3 è il valore attorno al quale c'è lo zero.
faccio bene oppure è sbagliato?
qualcuno può aiutarmi?

ps. l'errore che mi segnala è questo:


Operands to the || and && operators must be convertible to logical scalar values. 
Error in fzero (line 308)
    elseif ~isfinite(fx) || ~isreal(fx)

4 Risposte

  • Re: Comando fzero matlab

    Ho provato ad eseguire il codice che hai pubblicato sia con Octave che con MatLab R2015b ed ottengo il risultato corretto (3.2264).

    Come hai implementato la funzione "funrif"?
  • Re: Comando fzero matlab

    Ciao io ho matlab R2015b.
    Sto provando ancora ma da sempre errore:
    Operands to the || and && operators must be convertible to logical scalar values.
    
    Error in fzero (line 307)
        elseif ~isfinite(fx) || ~isreal(fx)
     
    La function l'ho strutturata così:
    function [y] = funrif(a,b,x)
    a=5;
    b=2;
    x=(-4:.1:9);
    y=(a.*sin(x).*exp(5-0.01.*x.^2)+b.*(x.^2+4.*x+5));
    plot(x,y,'-r')
    e poi ho i comandi per generare le diverse linee del grafico in questo modo:
    hold on
    line([-4 9],[0 0]);
    xlabel ('asse delle ascisse (x)');
    ylabel('asse delle ordinate (y)');
    text([-3.1349 -0.0134 3.2266 6.0268],[0 0 0 0],' \leftarrow zero' );
    grid;
    text([-1.55 4.6 1.55 7.8],[-720.96 -507.62 750.5799 597.3395],{'\leftarrow punto di minimo 1','\leftarrow punto di minimo 2','\leftarrow punto di massimo 1','\leftarrow punto di massimo 2'});
    line([-4 -1.55],[-720.96 -720.96], 'Color' , 'green' , 'LineStyle' , '-.');
    line([-4 4.6],[-507.62 -507.62], 'Color' , 'green' , 'LineStyle' , '-.');
    line([-4 1.55], [750.5799 750.5799], 'Color' , 'green' , 'LineStyle' , '-.');
    line([-4 7.8],[597.3395 597.3395], 'Color' , 'green' , 'LineStyle' , '-.');
    Questa è la function di funrif... Non so come fare ed il tempo per farlo finisce sempre più
  • Re: Comando fzero matlab

    Nella chiamata alla funzione "fzero" devi fornire l'handle della funzione della quale vuoi trovare la radice ed il punto iniziale dal quale cominciare la ricerca, come hai giustamente fatto.

    Il problema è che hai definita in modo che accetti tre parametri di input (a,b.x), ma "fzero" si aspetta, in input, una funzione del tipo "Y=f(x)" per cui interpreta in modo scorretto i parametri "a" e "b".

    Nella tua ultima domanda, non è chiaro se tutto il codice che hai pubblicato è contenuto all'interno della funzione "funrif".

    La funzione da passare in input a "frzero" dovrebbe consistere solo delle istruzioni che definiscono la funzione per cui, per cominciare, dovresti spostare in un'altra funzione o in uno script il codice relativo al plottaggio.

    La soluzione più semplice consiste nel:

    [*] definire la tua funzione come una Anonymous Function in modo da poter specificare gli eventuali parametri aggiuntivi oltre alla variabile indipendente (x)
    [*] incapsulare la tua funzione in un'altra Anonymous Function che sia funzione di una sola variabile
    [*] fornire questa seconda Anonymous Function in input alla funzione "fzero"
    [*] usare la prima Anonymous Function per calcolare i valori della tua funzione per il plottaggio

    Una possibile implementazione potrebbe essere (al fondo del codice ho aggiunto l'istruzione per il plottaggio della radice):
    
    % Definizione della funzione
    my_func=@(x,a,b) (a.*sin(x).*exp(5-0.01.*x.^2)+b.*(x.^2+4.*x+5));
    % Definizioine dei parametri
    a=5;
    b=2;
    % Incapsulamento della funzione
    funris=@(x) my_func(x,a,b)
    % Calcolo della radice
    z=fzero(funris,3)
    
    % Plot dei risultati
    % Definizione delle ascisse
    x=(-4:.1:9);
    % Calcolo deivalori della funzione
    y=my_func(x,a,b);
    % Creazione del grafico
    figure
    plot(x,y,'-r')
    hold on
    line([-4 9],[0 0]);
    xlabel ('asse delle ascisse (x)');
    ylabel('asse delle ordinate (y)');
    text([-3.1349 -0.0134 3.2266 6.0268],[0 0 0 0],' \leftarrow zero' );
    grid;
    text([-1.55 4.6 1.55 7.8],[-720.96 -507.62 750.5799 597.3395],{'\leftarrow punto di minimo 1','\leftarrow punto di minimo 2','\leftarrow punto di massimo 1','\leftarrow punto di massimo 2'});
    line([-4 -1.55],[-720.96 -720.96], 'Color' , 'green' , 'LineStyle' , '-.');
    line([-4 4.6],[-507.62 -507.62], 'Color' , 'green' , 'LineStyle' , '-.');
    line([-4 1.55], [750.5799 750.5799], 'Color' , 'green' , 'LineStyle' , '-.');
    line([-4 7.8],[597.3395 597.3395], 'Color' , 'green' , 'LineStyle' , '-.');
    %
    %%%%%%%%%%%%%%%%%
    % PLOT THE ROOT %
    %%%%%%%%%%%%%%%%%
    %
    plot(z,0,'d','markerfacecolor','r','markeredgecolor','r')
    
    

    radice_funzione.jpg
    radice_funzione.jpg

  • Re: Comando fzero matlab

    Grazie mille ask_raf mi salvi sempre
    Grazie davvero
Devi accedere o registrarti per scrivere nel forum
4 risposte