Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

polyfit

Ajuste de una curva polinómica

Descripción

ejemplo

p = polyfit(x,y,n) devuelve los coeficientes para un polinomio p(x) de grado n que es la mejor solución (en el sentido de los mínimos cuadrados) para los datos de y. Los coeficientes de p están en potencias descendentes y la longitud de p es n+1.

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

[p,S] = polyfit(x,y,n) también devuelve una estructura S que se puede utilizar como entrada para polyval para obtener estimaciones de error.

ejemplo

[p,S,mu] = polyfit(x,y,n) también devuelve mu, que es un vector de dos elementos con valores de centrado y escalado. mu(1) es mean(x) y mu(2) es std(x). Utilizando estos valores, polyfit centra x en cero y lo escala para tener la desviación estándar de unidad

x^=xx¯σx.

Esta transformación de centrado y escalado mejora las propiedades numéricas tanto del polinomio como del algoritmo de ajuste.

Ejemplos

contraer todo

Genere 10 puntos equidistantes a lo largo de una curva sinusoidal en el intervalo [0,4*pi].

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

Utilice polyfit para ajustar un polinomio de 7.º grado a los puntos.

p = polyfit(x,y,7);

Evalúe el polinomio en una cuadrícula más detallada y trace los resultados.

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

Cree un vector de 5 puntos equidistantes en el intervalo [0,1] y evalúe en esos puntos.

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

Ajuste un polinomio de grado 4 a los 5 puntos. En general, para n puntos, se puede ajustar un polinomio de grado n-1 para que pase exactamente a través de los puntos.

p = polyfit(x,y,4);

Evalúe la función original y el ajuste polinómico en una cuadrícula más detallada de puntos entre 0 y 2.

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

Trace los valores de función y el ajuste polinómico en el intervalo más amplio [0,2], con los puntos utilizados para obtener el ajuste polinómico resaltados como círculos. El ajuste polinómico es correcto en el intervalo original [0,1], pero se desvía rápidamente de la función ajustada fuera de ese intervalo.

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

En primer lugar, genere un vector de x puntos equidistantes en el intervalo [0,2.5] y, a continuación, evalúe erf(x) en esos puntos.

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

Determine los coeficientes del polinomio aproximador de grado 6.

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

    0.0084   -0.0983    0.4217   -0.7435    0.1471    1.1064    0.0004 ⋯

Para comprobar la validez del ajuste, evalúe el polinomio en los puntos de datos y genere una tabla que muestre los datos, el ajuste y el error.

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

En este intervalo, los valores interpolados y los valores reales coinciden bastante estrechamente. Cree un diagrama para mostrar cómo fuera de este intervalo los valores extrapolados se desvían rápidamente de los datos reales.

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

Cree una tabla de datos poblacionales para los años 1750-2000 y trace los puntos de datos.

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')

Utilice polyfit con tres salidas para ajustar un polinomio de 5.º grado utilizando centrado y escalado, lo cual mejora las propiedades numéricas del problema. polyfit centra los datos de year en 0 y los escala para tener una desviación estándar de 1, lo que evita una matriz de Vandermonde mal condicionada en el cálculo de ajuste.

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

Utilice polyval con cuatro entradas para evaluar p con los años escalados, (year-mu(1))/mu(2). Trace los resultados con respecto a los años originales.

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

Ajuste un modelo de regresión lineal simple a un conjunto de puntos de datos discretos 2D.

Cree algunos vectores de puntos de datos de muestra (x,y). Ajuste un polinomio de primer grado a los datos.

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

Evalúe el polinomio ajustado p en los puntos de x. Trace el modelo de regresión lineal resultante con los datos.

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

Argumentos de entrada

contraer todo

Puntos de consulta, especificados como un vector. Los puntos de x corresponden a los valores de función ajustados contenidos en y.

Aparecen mensajes de advertencia cuando x ha repetido (o casi repetido) puntos o si x podría necesitar centrado y escalado.

Tipos de datos: single | double
Soporte de números complejos:

Valores ajustados en los puntos de consulta, especificados como un vector. Los valores de y corresponden a los puntos de consulta contenidos en x.

Tipos de datos: single | double
Soporte de números complejos:

Grado de ajuste polinómico, especificado como escalar entero positivo. n especifica la potencia polinómica del coeficiente más a la izquierda en p.

Argumentos de salida

contraer todo

Coeficientes polinómicos ajustados para mínimos cuadrados, devueltos como un vector. p tiene la longitud n+1 y contiene los coeficientes polinómicos en potencias descendentes, siendo la potencia más alta n. Si x o y contienen valores NaN y n < length(x), todos los elementos de p son NaN.

Utilice polyval para evaluar p en los puntos de consulta.

Estructura de estimación de error. Esta estructura de salida opcional se utiliza principalmente como entrada para la función polyval para obtener estimaciones de error. S contiene los siguientes campos:

CampoDescripción
RFactor triangular de una descomposición QR de la matriz de Vandermonde de x
dfGrados de libertad
normrNorma de los valores residuales

Si los datos de y son aleatorios, una estimación de la matriz de covarianza de p es (Rinv*Rinv')*normr^2/df, donde Rinv es la inversa de R.

Si los errores de los datos de y son independientes y normales con varianza constante, [y,delta] = polyval(...) produce límites de error que contienen al menos el 50 % de las predicciones. Es decir, y ± delta contiene al menos el 50 % de las predicciones de las futuras observaciones en x.

Valores de centrando y escalado, devueltos como un vector de dos elementos. mu(1) es mean(x) y mu(2) es std(x). Estos valores centran los puntos de consulta en x en cero con la desviación estándar de la unidad.

Utilice mu como la cuarta entrada de polyval para evaluar p en los puntos escalados, (x - mu(1))/mu(2).

Limitaciones

  • En problemas con muchos puntos, aumentar el grado del ajuste polinómico mediante polyfit no siempre resulta en un mejor ajuste. Los polinomios de orden superior pueden oscilar entre los puntos de datos, lo que lleva a un ajuste peor a los datos. En esos casos, se puede utilizar un ajuste polinómico de orden bajo (que tiende a ser más suave entre los puntos) o una técnica diferente, dependiendo del problema.

  • Los polinomios son funciones sin límites, oscilatorias por la naturaleza. Por lo tanto, no son adecuados para la extrapolación de datos limitados o monotónicos (en aumento o disminución).

Algoritmos

polyfit utiliza x para formar la matriz de Vandermonde V con n+1 columnas y m = length(x) filas, lo que resulta en el sistema lineal

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

que polyfit se resuelve con p = V\y. Puesto que las columnas de la matriz de Vandermonde son potencias del vector x, el número de condiciones de V es a menudo grande para los ajustes de orden alto, dando por resultado una matriz de coeficientes singular. En esos casos, el centrado y el escalado pueden mejorar las propiedades numéricas del sistema para producir un ajuste más fiable.

Capacidades ampliadas

Consulte también

| | | | | |

Introducido antes de R2006a