Curve fitting - custom equation

di il
6 risposte

Curve fitting - custom equation

Ciao a tutti, è il mio primo post nel forum e spero di trovare risposta.
Usando il curve fitting toolbox sono riuscito a fittare una curva utilizzando una equazione custom (e fin qui tutto ok), però ho la necessità di inserire dei parametri nell'equazione che vengano presi dal workspace.
In pratica nel seguente codice i numeri presenti nell'equazione vorrei metterli in forma letterale, ma voglio ottenere solo A come risultato del curve fitting.
Spero di aver esposto il problema in modo chiaro.
function A = coffin_coefficient(X,Y)

[xData, yData] = prepareCurveData( X, Y );

ft = fittype( 'A*x^(-6.9397)*exp(0.8084/((8.6173e-05)*(120+273.15)))', 'independent', 'x', 'dependent', 'y' );
opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
opts.Algorithm = 'Levenberg-Marquardt';
opts.Display = 'Off';
opts.StartPoint = 0.1;

6 Risposte

  • Re: Curve fitting - custom equation

    Non sono sicuro di aver compreso il problema, ma se vuoi "mettere in forma letterale" i numeri

    -6.9397
    0.8084
    8.6173e-05
    ecc.

    la cosa più semplice che puoi fare è definirli come parametri aggiuntivi di input alla funzione.
    Nello script nel quale invochi la funzione potresti scrivere (trova i "nomi giusti" per le variabili - nell'esempio ho inserito solo i primi tre)
    
    par_1=-6.9397
    par_2=0.8084
    par_3=8.6173e-05
    ecc.
    
    A = coffin_coefficient(X,Y,par_1, par_2, par_3, ...)
    
    e nella funzione:
    function A = coffin_coefficient(X,Y,par_1,par_2,par_3, ...)
    
    [xData, yData] = prepareCurveData( X, Y );
    
    ft = fittype( 'A*x^(par_1)*exp(par_2/((par_3)*(120+273.15)))', 'independent', 'x', 'dependent', 'y' );
    opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
    opts.Algorithm = 'Levenberg-Marquardt';
    opts.Display = 'Off';
    opts.StartPoint = 0.1;
    Per evitare di avere una lista troppo lunga di parametri, potresti definire una "struct" che contenga i parametri:
    par_struct.par_1=-6.9397
    par_struct.par_2=0.8084
    par_struct.par_3=8.6173e-05
    
    function A = coffin_coefficient(X,Y,par_struct)
    
    e nella definizione della funzione:
    function A = coffin_coefficient(X,Y,par_struct)
    
    [xData, yData] = prepareCurveData( X, Y );
    
    ft = fittype( 'A*x^(par_struct.par_1)*exp(par_struct.par_2/((par_struct.par_3)*(120+273.15)))', 'independent', 'x', 'dependent', 'y' );
    opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
    opts.Algorithm = 'Levenberg-Marquardt';
    opts.Display = 'Off';
    opts.StartPoint = 0.1;
  • Re: Curve fitting - custom equation

    ask_raf ha scritto:


    grazie mille della risposta. Provo e ti faccio sapere se va...
  • Re: Curve fitting - custom equation

    ask_raf ha scritto:


    ho provato il tuo metodo ma ahimè non funziona.
    Però ho risolto con la funzione "eval"
    function A = coffin_coefficient(deltaT,Nf,n,Ea,kb,Tm)
    
    [xData, yData] = prepareCurveData( deltaT, Nf );
    
    eval(['ft = fittype( ''A*x^(-',num2str(n),')*'...
        'exp(',num2str(Ea),'/((',num2str(kb),')*(',num2str(Tm),'+273.15)))'','...
        ' ''independent'', ''x'', ''dependent'', ''y'' );'])
    
    opts = fitoptions( 'Method', 'NonlinearLeastSquares' );
    opts.Algorithm = 'Levenberg-Marquardt';
    opts.Display = 'Off';
    opts.StartPoint = 0.1;
    Sono sicuro ci sia una modo più elegante, eventualmente sarei interessato a saperlo.
  • Re: Curve fitting - custom equation

    Scusa,
    colpa mia, non avevo notato che il primo parametro di "fittype" è una stringa.

    Non c'è bisogno di usare "eval" (per altro sconsigliato anche da MathWorks).

    Puoi creare la stringa semplicemente concatenando le parie parti (come, per altro fai con "eval").
    Nella funzione puoi creare le stringhe contenenti i valori numerici ricevuti in input ed usarle per costruire la stringa che costituisce il primo parametro passato a "fittype":
    n_str=num2str(n)
    Ea_str=num2str(Ea)
    kb_str=num2str(kb)
    Tm_str=num2str(Tm)
    
    S=['A*x^(' n_str ')*exp(' Ea_str '/((' kb_str ')*(' Tm_str '+273.15)))']
    
    Non capisco, però come venga gestito "A": dove è definito?
  • Re: Curve fitting - custom equation

    ask_raf ha scritto:


    Scusa,
    colpa mia, non avevo notato che il primo parametro di "fittype" è una stringa.

    Non c'è bisogno di usare "eval" (per altro sconsigliato anche da MathWorks).

    Puoi creare la stringa semplicemente concatenando le parie parti (come, per altro fai con "eval").
    Nella funzione puoi creare le stringhe contenenti i valori numerici ricevuti in input ed usarle per costruire la stringa che costituisce il primo parametro passato a "fittype":
    n_str=num2str(n)
    Ea_str=num2str(Ea)
    kb_str=num2str(kb)
    Tm_str=num2str(Tm)
    
    S=['A*x^(' n_str ')*exp(' Ea_str '/((' kb_str ')*(' Tm_str '+273.15)))']
    
    Non capisco, però come venga gestito "A": dove è definito?
    Effettivamente così si semplifica il codice, ti faccio sapere se funziona. A è la variabile d'uscita della funzione quindi non c'è bisogno di dichiararlo. Sapresti dirmi come mai Mathworks sconsiglia l'utilizzo di eval?
  • Re: Curve fitting - custom equation

    In questi articoli puoi trovare la spiegazione di alcune delle ragioni per le quali è sconsigliato l'uso di "eval":



    https://it.mathworks.com/matlabcentral/answers/16442-why-eval-and-evalin-are-not-recommended

    https://it.mathworks.com/matlabcentral/answers/56124-eval-is-evil-using-variables-created-dynamically-info-retrieval
Devi accedere o registrarti per scrivere nel forum
6 risposte