Curve fitting - custom equation

di Anonimizzato28375 il
6 risposte
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

  • 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;
  • ask_raf ha scritto:


    grazie mille della risposta. Provo e ti faccio sapere se va...
  • 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.
  • 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?
  • 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?
Devi accedere o registrarti per scrivere nel forum
6 risposte