Main Content

La traduzione di questa pagina non è aggiornata. Fai clic qui per vedere l'ultima versione in inglese.

polyfit

Adattamento della curva polinomiale

Descrizione

p = polyfit(x,y,n) restituisce i coefficienti di un polinomio p(x) di grado n che costituisce il miglior adattamento (in termini di minimi quadrati) per i dati in y. I coefficienti in p sono in potenze decrescenti e la lunghezza di p è n+1

p(x)=p1xn+p2xn1+...+pnx+pn+1.

esempio

[p,S] = polyfit(x,y,n) restituisce inoltre una struttura S che può essere utilizzata come input di polyval per ottenere stime di errore.

[p,S,mu] = polyfit(x,y,n) esegue la centratura e la scalatura per migliorare le proprietà numeriche del polinomio e dell'algoritmo di adattamento. Questa sintassi restituisce inoltre mu, ossia un vettore a due elementi con valori di centratura e scalatura. mu(1) è mean(x) e mu(2) è std(x). Utilizzando questi valori, polyfit centra x sullo zero e lo scala per ottenere una deviazione standard unitaria,

x^=xx¯σx.

esempio

Esempi

comprimi tutto

Generare 10 punti equidistanti lungo una curva sinusoidale nell’intervallo [0,4*pi].

x = linspace(0,4*pi,10);
y = sin(x);

Utilizzare polyfit per adattare un polinomio di 7° grado ai punti.

p = polyfit(x,y,7);

Valutare il polinomio su una griglia più fine e tracciare i risultati.

x1 = linspace(0,4*pi);
y1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1)
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Creare un vettore di 5 punti equidistanti nell'intervallo [0,1] e valutare y(x)=(1+x)-1 in questi punti.

x = linspace(0,1,5);
y = 1./(1+x);

Adattare un polinomio di grado 4 ai 5 punti. Di solito, per n punti, è possibile adattare un polinomio di grado n-1 che passi esattamente per i punti.

p = polyfit(x,y,4);

Valutare la funzione originale e l'adattamento polinomiale su una griglia più fine di punti compresi tra 0 e 2.

x1 = linspace(0,2);
y1 = 1./(1+x1);
f1 = polyval(p,x1);

Tracciare i valori della funzione e l'adattamento polinomiale nell'intervallo più ampio [0,2], con i punti utilizzati per ottenere l'adattamento polinomiale evidenziati come cerchi. L'adattamento polinomiale è adeguato nell’intervallo originale [0,1], ma diverge rapidamente dalla funzione adattata al di fuori di tale intervallo.

figure
plot(x,y,'o')
hold on
plot(x1,y1)
plot(x1,f1,'r--')
legend('y','y1','f1')

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers These objects represent y, y1, f1.

Generare prima un vettore di punti x equidistanti nell’intervallo [0,2.5], quindi valutare erf(x) in quei punti.

x = (0:0.1:2.5)';
y = erf(x);

Determinare i coefficienti del polinomio approssimante di grado 6.

p = polyfit(x,y,6)
p = 1×7

    0.0084   -0.0983    0.4217   -0.7435    0.1471    1.1064    0.0004

Per verificare l’adeguatezza dell’adattamento, valutare il polinomio in corrispondenza dei punti di dati e generare una tabella che mostri i dati, l'adattamento e l'errore.

f = polyval(p,x);
T = table(x,y,f,y-f,'VariableNames',{'X','Y','Fit','FitError'})
T=26×4 table
     X        Y          Fit         FitError  
    ___    _______    __________    ___________

      0          0    0.00044117    -0.00044117
    0.1    0.11246       0.11185     0.00060836
    0.2     0.2227       0.22231     0.00039189
    0.3    0.32863       0.32872    -9.7429e-05
    0.4    0.42839        0.4288    -0.00040661
    0.5     0.5205       0.52093    -0.00042568
    0.6    0.60386       0.60408    -0.00022824
    0.7     0.6778       0.67775     4.6383e-05
    0.8     0.7421       0.74183     0.00026992
    0.9    0.79691       0.79654     0.00036515
      1     0.8427       0.84238      0.0003164
    1.1    0.88021       0.88005     0.00015948
    1.2    0.91031       0.91035    -3.9919e-05
    1.3    0.93401       0.93422      -0.000211
    1.4    0.95229       0.95258    -0.00029933
    1.5    0.96611       0.96639    -0.00028097
      ⋮

In questo intervallo, i valori interpolati e quelli correnti concordano piuttosto bene. Creare un grafico per mostrare come, al di fuori di questo intervallo, i valori estrapolati divergano rapidamente dai dati correnti.

x1 = (0:0.1:5)';
y1 = erf(x1);
f1 = polyval(p,x1);
figure
plot(x,y,'o')
hold on
plot(x1,y1,'-')
plot(x1,f1,'r--')
axis([0  5  0  2])
hold off

Figure contains an axes object. The axes object contains 3 objects of type line. One or more of the lines displays its values using only markers

Creare una tabella di dati sulla popolazione per gli anni 1750-2000 e tracciare i punti di dati.

year = (1750:25:2000)';
pop = 1e6*[791 856 978 1050 1262 1544 1650 2532 6122 8170 11560]';
T = table(year, pop)
T=11×2 table
    year       pop   
    ____    _________

    1750     7.91e+08
    1775     8.56e+08
    1800     9.78e+08
    1825     1.05e+09
    1850    1.262e+09
    1875    1.544e+09
    1900     1.65e+09
    1925    2.532e+09
    1950    6.122e+09
    1975     8.17e+09
    2000    1.156e+10

plot(year,pop,'o')

Figure contains an axes object. The axes contains a line object which displays its values using only markers.

Utilizzare polyfit con tre output per adattare un polinomio di 5° grado utilizzando la centratura e la scalatura, che migliorano le proprietà numeriche del problema. polyfit centra i dati in year sullo 0 e li scala in modo da ottenere una deviazione standard di 1, che evita una matrice di Vandermonde mal condizionata nel calcolo dell’adattamento.

[p,~,mu] = polyfit(T.year, T.pop, 5);

Utilizzare polyval con quattro input per valutare p con gli anni scalati (year-mu(1))/mu(2). Tracciare i risultati rispetto agli anni originali.

f = polyval(p,year,[],mu);
hold on
plot(year,f)
hold off

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers

Adattare un modello di regressione lineare semplice a un insieme di punti di dati discreti bidimensionali.

Creare qualche vettore di punti di dati campione (x,y). Adattare un polinomio di primo grado ai dati.

x = 1:50; 
y = -0.3*x + 2*randn(1,50); 
p = polyfit(x,y,1); 

Valutare il polinomio adattato p nei punti di x. Tracciare il modello di regressione lineare risultante con i dati.

f = polyval(p,x); 
plot(x,y,'o',x,f,'-') 
legend('data','linear fit') 

Figure contains an axes object. The axes object contains 2 objects of type line. One or more of the lines displays its values using only markers These objects represent data, linear fit.

Adattare un modello lineare a una serie di punti di dati e tracciare i risultati, compresa una stima di un intervallo di previsione del 95%.

Creare qualche vettore di punti di dati campione (x,y). Utilizzare polyfit per adattare un polinomio di primo grado ai dati. Specificare due output per restituire i coefficienti dell'adattamento lineare nonché la struttura di stima dell'errore.

x = 1:100; 
y = -0.3*x + 2*randn(1,100); 
[p,S] = polyfit(x,y,1); 

Valutare l’adattamento polinomiale di primo grado in p nei punti di x. Specificare la struttura di stima dell'errore come terzo input in modo che polyval calcoli una stima dell’errore standard. La stima dell'errore standard è restituita in delta.

[y_fit,delta] = polyval(p,x,S);

Tracciare i dati originali, l'adattamento lineare e l'intervallo di previsione del 95% y±2Δ.

plot(x,y,'bo')
hold on
plot(x,y_fit,'r-')
plot(x,y_fit+2*delta,'m--',x,y_fit-2*delta,'m--')
title('Linear Fit of Data with 95% Prediction Interval')
legend('Data','Linear Fit','95% Prediction Interval')

Figure contains an axes object. The axes object with title Linear Fit of Data with 95% Prediction Interval contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Data, Linear Fit, 95% Prediction Interval.

Argomenti di input

comprimi tutto

Punti di query, specificati come vettore. I punti in x corrispondono ai valori della funzione adattata contenuti in y. Se x non è un vettore, polyfit lo converte in un vettore colonna x(:).

Quando x presenta punti ripetuti (o quasi) o se dovesse essere necessario centrare o scalare x, vengono visualizzati dei messaggi di avviso.

Tipi di dati: single | double
Supporto numeri complessi:

Valori adattati ai punti di query, specificati come vettore. I valori in y corrispondono ai punti di query contenuti in x. Se y non è un vettore, polyfit lo converte in un vettore colonna y(:).

Tipi di dati: single | double
Supporto numeri complessi:

Grado di adattamento polinomiale, specificato come scalare intero positivo. n specifica la potenza polinomiale del coefficiente più a sinistra in p.

Argomenti di output

comprimi tutto

Coefficienti polinomiali di adattamento ai minimi quadrati, restituiti come vettore. p ha lunghezza n+1 e contiene i coefficienti polinomiali in potenze decrescenti, con la potenza più alta n. Se x o y contiene valori NaN e n < length(x), tutti gli elementi in p sono NaN. Se si specificano tre argomenti di output per centrare e scalare i dati, polyfit restituisce coefficienti diversi in p rispetto a quando i dati non sono centrati e ridimensionati.

Utilizzare polyval per valutare p ai punti di query.

Struttura di stima dell’errore. Questa struttura di output opzionale viene utilizzata principalmente come input della funzione polyval per ottenere stime di errore. S contiene i seguenti campi:

CampoDescrizione
RFattore triangolare R (eventualmente permutato) da una decomposizione QR della matrice di Vandermonde di x
dfGradi di libertà
normrNorma dei residui

Se i dati in y sono casuali, una stima della matrice di covarianza di p è (Rinv*Rinv')*normr^2/df, dove Rinv è l’inverso di R.

Se gli errori nei dati in y sono indipendenti e normali con varianza costante, [y,delta] = polyval(...) produce limiti di errore che contengono almeno il 50% delle previsioni. Ossia, y ± delta contiene almeno il 50% delle previsioni delle osservazioni future in x.

Valori di centratura e scalatura, restituiti come vettore a due elementi. mu(1) è mean(x) e mu(2) è std(x). Questi valori centrano i punti di query in x sullo zero con una deviazione standard unitaria.

Utilizzare mu come quarto input di polyval per valutare p ai punti scalati (x - mu(1))/mu(2).

Limiti

  • Nei problemi con molti punti, aumentare il grado dell'adattamento polinomiale utilizzando polyfit non sempre produce un adattamento migliore. I polinomi di ordine elevato possono essere oscillanti tra i punti di dati, determinando un adattamento meno adeguato ai dati. A seconda del problema, in questi casi, si può utilizzare un adattamento polinomiale di ordine inferiore (che tende a essere più uniforme tra i punti) o una tecnica diversa.

  • I polinomi sono per natura funzioni oscillatorie e non vincolate. Pertanto, non sono particolarmente adatti all'estrapolazione di dati vincolati o di dati monotoni (crescenti o decrescenti).

Algoritmi

polyfit utilizza x per formare la matrice di Vandermonde V con n+1 colonne e m = length(x) righe, risultante nel sistema lineare

(x1nx1n11x2nx2n11xmnxmn11)(p1p2pn+1)=(y1y2ym),

che polyfit risolve con p = V\y. Poiché le colonne della matrice di Vandermonde sono potenze del vettore x, il numero di condizioni di V è spesso grande per gli adattamenti di ordine elevato, risultante in una matrice a coefficiente singolare. In questi casi, la centratura e la scalatura possono migliorare le proprietà numeriche del sistema e produrre un adattamento maggiormente affidabile.

Funzionalità estese

Cronologia versioni

Introduzione prima di R2006a