Funzione fit cftool da programma

di Anonimizzato19879 il
6 risposte
Ciao a tutti, ho inserito la chiamata a cftool in un programma semplicemente scrivendo:
cftool (xdata,ydata);
Volevo sapere se esiste un modo per dargli anche una funzione di fitting direttamente dal programma (cioè quando si apre cftool) oltre i dati esce già la funzione di fitting voluta (perchè altriemtni di default mi esce una funzione lineare).
Grazie

6 Risposte

  • Ciao e come sempre grazie!

    ask_raf ha scritto:


    Tra gli input possibili non figura la possibilità di specificare una funzione:

    https://it.mathworks.com/help/curvefit/curvefitting-app.html [/code]

    Infatti io avevo letto che non c'era una funzione che permette ciò...tuttavia, quando ho portato il programma al laboratorio mi hanno detto che sicuramente c'è (però ovviamente non la conoscono)...

    Detto ciò...ho provato a seguire questo esempio
    
    function y = piecewiseLine(x,a,b,c,d,k)
    % PIECEWISELINE   A line made of two pieces
    % that is not continuous.
    
    y = zeros(size(x));
    
    % This example includes a for-loop and if statement
    % purely for example purposes.
    for i = 1:length(x)
        if x(i) < k,
            y(i) = a + b.* x(i);
        else
            y(i) = c + d.* x(i);
        end
    end
    end

    che trovi dove c'è scritto Fitting a Curve Defined by a File in the Curve Fitting App nel sito che mi hai indicato

    ask_raf ha scritto:


    https://it.mathworks.com/help/curvefit/custom-nonlinear-models.html

    ho provato allora a fare
    function myfitfun(xdata,A,ckgraconv_n, lambda,ckdian);
    myfitfun= A.*ckgraconv_n+lambda.*ckdian;
    cftool (xdata,ydata);
    ma mi da l'errore:
    Error: File: sp2sp3diff_Titantah.m Line: 562 Column: 5
    Function definitions are not permitted in this context.
    dove la riga 562 è
     function myfitfun(xdata,A,ckgraconv_n, lambda, ckdian);
    Poichè quel pezzo
    A.*ckgraconv_n+lambda.*ckdian
    è un pezzo già di fit che fa il programma (appoggiandosi a uno script esterno, infatti il programma plotta la funzione di fit come:
      plot(xdata, A.*ckgraconv_n+lambda.*ckdian,'g');
    ho anche provato a fare una cosa più semplice (solo per provare se funziona)
    e cioè:

    
    function myfitfun(xdata, b);
        i=1;
        for i=1:1024;
        myfitfun= xdata(i)*xdata(i)+b;
        i++;
        end
    [/cod]
    
    ma l'errore è sempre lo stesso
  • L'errore è nel modo nel quale hai definito la funzione:
    
    function myfitfun(xdata, b)
    
    definisce una funzione che non ritorna alcun output inoltre non puoi usare il nome della funzione come nome di una variabile all'interno della funzione stessa (ed in generale).

    Se vuoi che la funzione ritorni un parametro di output la devi definire come:
    
    function ret_value=myfitfun(xdata, b)
    
    dove "ret_value" è il nome della variabile di output della funzione, calcolato all'intero della funzione stessa.

    Per chiamare la funzione dovrai scrivere:
    
    output_val=myfitfun(xdata, b)
    
    Ho volutamente usato nomi diversi per la variabile di output per sottolineare il fatto che nn devono essere necessariamente uguali.

  • Ciao, grazie...comunque scrivendo:
    function ret_value=myfitfun(A,lambda);
        output_val=myfitfun(A,lambda);
       cftool (xdata,ydata);
    (perchè A,lambda sono i parametri del fit) mi da l'errore
    Function definitions are not permitted in this context.
    ma credo dipenda dal fatto che si appoggia a un file esterno..boh...
  • Devi pubblicare una parte coerente del codice, non solo qualche riga, qua e là.

    Hai pubblicato tre righe di codice che, da sole non consentono di capire quale sia il problema.

    Da dove saltano fuori "xdata" e "ydata"?

    Per caso hai inserito la funzione all'interno di uno script (".m") che contiene altro codice?
    Se è così, non puoi farlo, se non hai una versione di MatLab R2016b o più recente; le funzione devono essere salvate ognuna in un file dedicato, molto meglio se salvato con lo stesso nome della funzione.

    Puoi inserire più di una funzione in un file ".m", in questo caso solo la prima funzione è visibile "all'esterno" (pupò essere chiamata da altre funzioni / scripts), le altre sono considerate "funzioni locali" e sono visibili solo alla prima funzione.

    Hai letto la documentazione su come definire le funzioni che ti ho indicato nella risposta precedente?
  • Ciao innanzitutto grazie.
    Al momento devo fare un'altra cosa, poi proverò a vedere meglio.

    Comunque, io ho R2017a 64bit , al laboratorio c'è R2015 (non ricorso se a, b). Pensi che posso portare il file su pennetta senza portarmi il computer, o possono esserci problemi di compatibilità?
Devi accedere o registrarti per scrivere nel forum
6 risposte