Conozca los principios y aplicaciones del modelado matemático [Principios básicos e implementación de programación de interpolación y ajuste]

contenido principal

La interpolación y el ajuste son un método básico de análisis de datos en el modelado matemático y se reconocen como uno de los algoritmos comúnmente utilizados en el modelado.
Aprenda sobre los problemas de interpolación, los principios de interpolación, el fenómeno de Runge de interpolación de alto orden, unidimensional y bidimensional en Comando de interpolación de Matlab
, problema de ajuste, principio de ajuste y pasos, y luego presenta el cálculo de ajuste de Matlab.

interpolación

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
El problema anterior se puede resumir como "se conoce el valor de la función en varios puntos de un determinado intervalo (dominio), y el valor de la función en otros puntos del intervalo (dominio)" es adecuado para resolver mediante el método de interpolación.
El problema de interpolación unidimensional se puede describir como: Conocer los valores Yo, Y1,..., Yn de la función en Xo, x1,···,xn, encontrar una función simple p(x), hacer p (xi) = yi generalmente Tomando p(x) como polinomio,
podemos usar el determinante de Vandermond y la regla de Clem para demostrar que
el polinomio con los valores y0, y1, ·yn en x0, x1, xn existe y es único, es decir, la solución al problema de interpolación existe de forma única.
Los métodos de interpolación más utilizados son el método de interpolación de Lagrange y el método de interpolación de Newton.

interpolación lagrangiana

La fórmula de interpolación de Lagrange (nombre extranjero fórmula de interpolación de Lagrange) se refiere a un polinomio de interpolación en el que la función base del nodo se da en el nodo, y luego se realiza una combinación lineal de las funciones base, y el coeficiente de combinación es el valor del nodo. función.
Insertar descripción de la imagen aquí

Fenómeno Runge de interpolación de alto orden (fenómeno Runge)

Cuanto mayor sea el grado del polinomio de interpolación, mayor será la precisión de la interpolación. La conclusión sólo es cierta cuando el grado del polinomio de interpolación no excede siete; cuando el grado del polinomio de interpolación excede siete, el polinomio de interpolación sufrirá una oscilación severa, lo que se denomina fenómeno de Runge.
Insertar descripción de la imagen aquí
En la práctica no deberían utilizarse más de siete interpolaciones.
Un método común para evitar el fenómeno de Runge es dividir el intervalo de interpolación en varios intervalos pequeños y utilizar interpolación de orden bajo (cuadrática, cúbica) dentro de los intervalos pequeños, es decir, interpolación de orden bajo por partes, como la interpolación de función spline.
Insertar descripción de la imagen aquí

interpolaciónMATLAB

1. Interpolación unidimensional

El comando de interpolación unidimensional es interp1, y su formato básico es yi= interp1(x,y,xi, 'método').
x,y son puntos conocidos, xi,yi son los puntos interpolados y los resultados de la interpolación, x,y y xi, yi suele ser un vector;
método' representa el método de interpolación:
más cercano' - interpolación del vecino más cercano,
'lineal' - interpolación lineal
spline' - interpolación spline cúbica,
'cúbica' - interpolación cúbica,
el valor predeterminado es la interpolación lineal.

Aplicación de programación de interpolación spline cúbica

x=0:2:24;
y=[12 9 9 10 18 24 28 27 25 20 18 15 13];
x1=13;%插值点在13处
yl=interp1(x,y,x1,'spline')%求出在该点的值
xi=0:1/3600:24;
yi=interp1(x,y,xi, 'spline');
plot(x,y,'*',xi,yi)


Insertar descripción de la imagen aquí
La gráfica dibujada para el valor en x=13
Insertar descripción de la imagen aquí

Comparación de tres métodos de interpolación.

Primero cree la función de interpolación de Lagrange y asígnele el nombre archivo lagrange.m.
El código de la función es el siguiente

function y=lagrange(x0,y0,x)
n=length(x0);
m=length(x);
for i=1:m
    z=x(i);
    s=0.0;
    for k=1:n
        p=1.0;
        for j=1:n
            if j~=k
                p=p*(z-x0(j))/(x0(k)-x0(j));
            end
         end
s=p*y0(k)+s;
    end
     y(i)=s;
en

Programa de creación % Comparación de interpolación lagrangiana, interpolación lineal e interpolación spline cúbica

x0=[0 3 5 7 9 11 12 13 14 15 ];
y0=[0 1.2 1.7 2.0 2.1 2.0 1.8 1.2 1.0 1.6];
x=0:0.1:15;
y1=lagrange(x0,y0,x);%使用拉格朗日插值法
y2=interp1(x0,y0,x);%使用一维插值命令的线性插值法
y3=interp1(x0,y0,x,'spline');%使用一维插值命令的三次样条插值法
subplot(3,1,1);
plot(x0,y0,'k+',x,y1,'r');
grid;%生成网格点
title('lagrange');
subplot(3,1,2);
plot(x0,y0,'k+',x,y2,'r');
grid;
title('piecewise linear');
subplot(3,1,3);
plot(x0,y0,'k+',x,y3,'r');
grid;
title('spline');

Resultados de la ejecución:
Insertar descripción de la imagen aquí
Los resultados muestran que la interpolación spline cúbica es mejor aquí.

  • El programa utilizó sucesivamente tres métodos de interpolación: Lagrange, lineal por partes y spline cúbico para realizar cálculos. El fenómeno de Runge obviamente apareció en la interpolación de alto orden de Lagrange;
  • Debido a que Matlab no tiene la función de interpolación de alto orden de Lagrange, la función de interpolación de alto orden lagrange se escribe por separado en el programa y luego se llama.

2. Interpolación bidimensional

El comando de interpolación bidimensional es interp2 y el formato básico es zi = interp2 (x, y, z, xi, yi, 'método'). El uso del comando de interpolación bidimensional es más complicado. x, y, z son puntos de interpolación conocidos y z
puede entenderse como el valor de la función interpolada en (x, y); xi e yi son los puntos interpolados y zi es el resultado de la interpolación de salida, que puede entenderse como el valor de la función de interpolación en (xi, yi); x e y son vectores, xi, yi son vectores o matrices, mientras que z y zi son matrices.
'método' representa el método de interpolación:
'más cercano' - interpolación del vecino más cercano,
'lineal' - interpolación bilineal,
'spline' - interpolación spline bicúbica,
interpolación bicúbica 'cúbica' y
el valor predeterminado es la interpolación bilineal.
práctica procesal

x=1:5;
y=1:3;%表示三行五列的数据,x在此表示列数,y在次表示行数
temps=[82 81 80 82 84;79 63 61 65 81;84 84 82 85 86];
figure(1);
mesh(x,y,temps);
xi=1:0.2:5;
yi=1:0.2:3;
zi=interp2(x,y,temps,xi,yi','cubic');
figure(2);
mesh(xi,yi,zi);
figure(3);
contour(xi,yi,zi,20,'r');%画出20条等高线
[i,j]=find(zi==min(min(zi)));
%==表示判断或者寻找位置,
% min(zi)寻找每一列最小值,min(min(zi))在得到的最小值中继续寻找最小值
x=xi(j),y=yi(i),zmin=zi(i,j)
[i,j]=find(zi==max(max(zi)));
x=xi(j),y=yi(i),zmax=zi(i,j)

Resultados de la ejecución
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
(1) xi en interp2 es un vector de fila y yi es un vector de columna. De hecho, las filas y columnas de xi y yi pueden ser diferentes.
(2) plot3 (curva espacial),
malla (superficie espacial),
surf (superficie espacial),
contorno (contorno) son comandos de uso común en el dibujo 3D.
La diferencia entre malla y surf es que la malla dibuja un mapa de cuadrícula de superficie, que simplemente está conectado con una cuadrícula. Surf dibuja un mapa de superficie curva.
La función de contorno(x,y,z,n) es hacer n curvas de nivel de la superficie interpoladas desde los puntos (x,y,z).
Puedes usar meshc y surfc para dibujar líneas de contorno debajo de la superficie.
meshz y surfz se usan para dibujar diagramas de cortina vertical
. Si se elimina la figura, solo se dibujará la última imagen, que es similar al
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
programa de retención.

x=0:400:5600;
y=0:400:4800;
z=[370 470 550 600 670 690 670 620 580 450 400 300 100 150 250;...
    510 620 730 800 850 870 850 780 720 650 500 200 300 350 320;...
    650 760 880 970 1020 1050 1020 830 900 700 300 500 550 480 350;...
    740 880 1080 1130 1250 1280 1230 1040 900 500 700 780 750 650 550;...
    830 980 1180 1320 1450 1420 1400 1300 700 900 850 840 380 780 750;...
    880 1060 1230 1390 1500 1500 1400 900 1100 1060 950 870 900 930 950;...
    910 1090 1270 1500 1200 1100 1350 1450 1200 1150 1010 880 1000 1050 1100;...
    950 1190 1370 1500 1200 1100 1550 1600 1550 1380 1070 900 1050 1150 1200;...
    1430 1430 1460 1500 1550 1600 1550 1600 1600 1600 1550 1500 1500 1550 1550;...
    1420 1430 1450 1480 1500 1550 1510 1430 1300 1200 980 850 750 550 500;...
    1380 1410 1430 1450 1470 1320 1280 1200 1080 940 780 620 460 370 350;...
    1370 1390 1410 1430 1440 1140 1110 1050 950 820 690 540 380 300 210;...
    1350 1370 1390 1400 1410 960 940 880 800 690 570 430 290 210 1501];
figure(1);
meshz(x,y,z);%带帷幕的网格曲面图
xlabel('X'),ylabel('Y'),zlabel('Z');
[xi,yi]=meshgrid(0:50:5600,0:50:4800);%基于向量 x 和 y 中包含的坐标返回二维网格坐标
figure(2);
z1i=interp2(x,y,z,xi,yi,'nearest');%最邻近插值法
surfc(xi,yi,z1i);%画垂帘图
xlabel('X'),ylabel('Y'),zlabel('Z');
figure(3);
z2i=interp2(x,y,z,xi,yi);%默认双线性插值法
surfc(xi,yi,z2i);
xlabel('X'),ylabel('Y'),zlabel('Z');
figure(4);
z3i=interp2(x,y,z,xi,yi,'cubic');%双立方插值法
surfc(xi,yi,z3i);
xlabel('X'),ylabel('Y'),zlabel('Z');
figure(5);
subplot(1,3,1),contour(xi,yi,z1i,10,'r');
subplot(1,3,2),contour(xi,yi,z2i,10,'r');
subplot(1,3,3),contour(xi,yi,z3i,10,'r');%画出三个图的等高线

El programa utiliza "[xi,yi]=meshgrid(0:50:5600,0:50:4800);" para generar puntos de cuadrícula (xi,yi), lo que equivale a "xi=0:50:5600;yi =0 :50:4800;"Pero xi y yi generados por meshgrid(x,y) son matrices de la misma dimensión. Las filas de xi son todas x, y las columnas de yi son todas y.
Resultados de ejecución:
Insertar descripción de la imagen aquí
interpolación del vecino más cercano,
Insertar descripción de la imagen aquí
interpolación bilineal,
Insertar descripción de la imagen aquí
interpolación bicúbica
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Interpolación de puntos dispersos

Los puntos de interpolación (x, y) del problema de interpolación discutido anteriormente son todos puntos de cuadrícula. Cuando (x,y) es un punto disperso, el comando griddata(x,y,z,xi,yi,'method') se puede utilizar para realizar una interpolación bidimensional.

ejemplo

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
programa

x=[129 140 103.5 88 185.5 195 105 157.5 107.5 77 81 162 162 117.5];
y=[7.5 141.5 23 147 22.5 137.5 85.5 -6.5 -81 3 56.5 -66.5 84 -33.5];
z=[-4 -8 -6 -8 -6 -8 -8 -9 -9 -8 -8 -9 -4 -9];
[xi,yi]=meshgrid(75:0.5:200,-70:0.5:150);%基于向量 x 和 y 中包含的坐标返回二维网格坐标
zi=griddata(x,y,z,xi,yi,'cubic');%对二维或三维散点数据插值,双立方插值法
figure(1);
meshz(xi,yi,zi);%带帷幕的网格曲面图
xlabel('X'),ylabel('Y'),zlabel('Z');
figure(2);
contour(xi,yi,zi,[-5 -5], 'b');%画出高度-5的等高线
grid;%显示或隐藏坐标区网格线
hold on;
plot(x,y,'+');
xlabel('X'),ylabel('Y');

resultado de la operación
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí

Problema de ajuste

ejemplo

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
La primera pregunta en el Ejemplo 1 es una pregunta de interpolación típica, pero la segunda pregunta no es adecuada para usar el método de interpolación porque 13.5 ha excedido el rango de datos dado. El uso de la función de interpolación para extrapolar los datos fuera del rango de interpolación producirá un gran error. Utilice Matlab para calcular la altura
. Resultados de subinterpolación, interpolación spline y extrapolación.

El fenómeno de Runge apareció en la interpolación de alto orden y hubo un gran error en la extrapolación de los datos cuando t>12.
El primer gráfico de interpolación spline muestra que la interpolación spline puede resolver muy bien el primer problema, pero el segundo gráfico muestra que extrapolar los datos en t>12 con interpolación spline también produce grandes errores.
En resumen, el método de interpolación no es adecuado para la segunda pregunta.
El método habitual para resolver la segunda pregunta es calcular la relación funcional aproximada f(t) entre temperatura y tiempo basándose en los datos de temperatura entre los puntos 1 y 12, e inferir la temperatura en t = 13,5 a partir de f(t). El método de encontrar la relación funcional aproximada entre datos se llama problema de ajuste de curvas.
La diferencia entre el problema de ajuste y el problema de interpolación es:
(1) La función de interpolación pasa por un punto conocido , pero la función de ajuste no necesariamente pasa por un punto conocido;
( 2) Interpolación Se utiliza principalmente para encontrar el valor de la función , y el objetivo principal del ajuste es encontrar la relación de la función , a fin de realizar análisis adicionales, como la predicción.
Por supuesto, para ciertos problemas se pueden utilizar tanto la interpolación como el ajuste.
El ejemplo 2 también es un problema de ajuste.

2. Cálculo del ajuste

(1) Selección de tipo de línea:
(2) Cálculo de parámetros en tipo de línea. La elección del tipo de línea es el punto clave y difícil del cálculo de ajuste. Generalmente, el tipo de línea se determina principalmente basándose en conocimientos profesionales y diagramas de dispersión. El método de mínimos cuadrados se puede utilizar para calcular parámetros en un ajuste lineal, mientras que el método de iteración de Gauss-Newton se debe utilizar para calcular parámetros en un ajuste no lineal.

3.Ajuste de Matlab

El formato del comando de ajuste de polinomios de Matlab es:
[a,S]=polyfit(x,y,n) donde x e y son las variables independientes y dependientes de los datos que se están ajustando; n es el grado del polinomio de ajuste; a es el ajuste Un vector compuesto de coeficientes polinomiales; S es el indicador (se puede omitir) requerido para analizar el efecto de ajuste.
El código muestra el ajuste de un conjunto de datos.

%拟合
x=1:12;
y=[5, 8, 9, 15,25, 29, 31, 30, 22, 25, 27, 24];
a=polyfit(x,y,9);%进行9次多项式拟合
xp=1:0.1:12;
yp=polyval(a,xp);%计算多项式 a 在 xp 的每个点处的值。
% 参数 a 是长度为 n+1 的向量,其元素是 n 次多项式的系数(降幂排序)
plot(x,y,'.k',xp,yp,'r');

Los resultados son los siguientes
Insertar descripción de la imagen aquí
(2) Ajuste no lineal
El formato del comando de ajuste no lineal de Matlab es: [b,r]=polyfit(x,y,fun,b0,option)
donde xey son la suma de las variables independientes de los datos que se están ajustando Variable dependiente; fun es la función de ajuste; b0 es el valor de iteración inicial de los parámetros de ajuste; opción es la opción de ajuste; b es el parámetro de ajuste; r es el residuo de ajuste.
Utilice el ejemplo 2 para la práctica de MATLAB

x=1:16;
y=[4.00 6.40 8.00 8.80 9.22 9.50 9.70 9.86 10.00 10.20 10.32 10.42 10.50 10.55 10.58 10.60];
y1=@(b,t)b(1)*exp(-t/b(2))+b(3)*exp(-t/b(4))+b(5);%此关系式可以写的更简单一些,作用只是确定拟合函数的类型
b0=[-1 1 -1 1 1];%初值
a=nlinfit(x,y,y1,b0);%nlinfit非线性回归拟合,此处等效polyfit。
xp=1:0.1:16;
yp=y1(a,xp);%带插点的坐标
plot(x,y,'.k',xp,yp,'r');

Existen muchos inconvenientes al adaptarse a la programación de MIatlab
(1) Se requiere programación. Por ejemplo, en el programa del Ejemplo 2 se utilizan funciones anónimas, lo cual no es fácil para los principiantes.
(2) Los resultados del ajuste están incompletos. Los comandos de ajuste de Matlab generalmente solo proporcionan resultados básicos, como coeficientes de ajuste. A veces se requieren cálculos adicionales para obtener estadísticas que indiquen buenos o malos ajustes.
(3) No se puede garantizar la convergencia iterativa del ajuste no lineal. Dado que los parámetros de iteración iniciales del ajuste no lineal deben determinarse manualmente, no se puede garantizar que la iteración converja.
Para que pueda utilizar la caja de herramientas MATLAB cftool (ajustador de curvas)

cftool (ajustador de curvas)

Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Utilice la caja de herramientas cftool para ajustar los datos en el Ejemplo 2.
Insertar descripción de la imagen aquí
Insertar descripción de la imagen aquí
Salida bajo ajuste polinómico de séptimo orden
Insertar descripción de la imagen aquí
. Una vez completado el ajuste, se evaluarán los resultados del ajuste.
SSE-error cuadrático medio/error residual de suma de cuadrados
Correlación R-cuadrado coeficiente
RMSE: la desviación estándar residual
generalmente considera SSE y RMSE, que no debe exceder 0,1.
Seleccione Exportar en la esquina superior derecha para exportar el código.
Esta caja de herramientas funciona muy bien.

Supongo que te gusta

Origin blog.csdn.net/Luohuasheng_/article/details/128589612
Recomendado
Clasificación