Notas de estudio-algoritmo de Matlab-artículos-algoritmo de interpolación

Algoritmo de interpolación

01 Interpolación polinomial de Lagrange

 

Y luego obtén el polinomio lagrangiano:

Resolución de Matlab : no hay una función de resolución incorporada en matlab , debe implementarla usted mismo.

function f = Language(x,y,x0)
    syms t;
    if(length(x) == length(y))
        n = length(x);    
    else
        disp('x和y的维数不相等!');
        return;
    end                                      %检错
    f = 0.0;
    for i = 1:n
        l = y(i); 
        for j = 1:i-1
            l = l*(t-x(j))/(x(i)-x(j));      
        end
        for j = i+1:n
            l = l*(t-x(j))/(x(i)-x(j));      %计算拉格朗日基函数
        end
        f = f + l;                           %计算拉格朗日插值函数      
        simplify(f);                         %化简
        if(i==n)
            if(nargin == 3)
                f = subs(f,'t',x0);          %计算插值点的函数值
            else
                f = collect(f);          %将插值多项式展开
                f = vpa(f,6);                %将插值多项式的系数化成6位精度的小数
            end
        end
    end
end

Ejemplo (e01) : utilice la interpolación polinomial de Lagrange para calcular los datos

x=-5:0.2:5;
y=-3*x.^2+2*x+x.^3-2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;

x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=Language(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;

resultado:

>> e01
时间已过 35.958879 秒。
理论值:7.3130,实际值-1.1030

02 Interpolación del método de Newton

Entonces puedes obtener:

function f = Newton(x,y,x0)
syms t;

if(length(x) == length(y))
    n = length(x);
    c(1:n) = 0.0;
else
    disp('x和y的维数不相等!');
    return;
end

f = y(1);
y1 = 0;
l  = 1;
 
for(i=1:n-1)   
    for(j=i+1:n)
        y1(j) = (y(j)-y(i))/(x(j)-x(i));
    end
    c(i) = y1(i+1);     
    l = l*(t-x(i));  
    f = f + c(i)*l;
    simplify(f);
    y = y1;
    
    if(i==n-1)
        if(nargin == 3)
            f = subs(f,'t',x0);
        else
            f = collect(f);                %将插值多项式展开
            f = vpa(f, 6);
        end
    end
end



x=-5:0.2:5;
y=3*x+2*x.^2-x.^3+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;

x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=Newton(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;

resultado:

>> e02
时间已过 16.260375 秒。
理论值:7.3130,实际值7.3130

03 interpolación lineal por partes

Implementación de Matlab : use la función y = interp1 (x, y, x0, 'método')

método especifica el método de interpolación, el valor predeterminado es la interpolación lineal. Su valor puede ser:

interpolación del término más cercano ' más cercano'

interpolación lineal 'lineal'

'spline' pieza a pieza interpolación de tercera spline

'cubic' conserva la convexidad y la convexidad de la interpolación.

Todos los métodos de diferencia requieren que x0 sea ​​monótono.

Ejemplo (e03) : utilice la interpolación lineal por partes para calcular los datos

x=-5:0.2:5;
y=3*x+2*x.^2-3*x.^3+2*x.^4+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;

x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
tic
yl=interp1(x,y,2.3);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;

resultado:

>> e03
时间已过 0.025925 秒。
理论值:7.3130,实际值39.3952

 

04 Interpolación de Emil

Definición: Si no solo se requiere que una función de interpolación tenga el mismo valor que la función en el nodo, sino que también se requiere que tenga el mismo valor derivado de primer, segundo o incluso mayor orden con la función, este es el problema de interpolación de Hermite . cual es:

El polinomio de interpolación de Emilt es:

 

Matlab no tiene una función de Hermite lista para usar, debe escribirla manualmente: Hermite

Ejemplo (e04) : utilice la interpolación de Emilt para calcular los datos

function f = Hermite(x,y,y_1,x0)
syms t;
f = 0.0;

if(length(x) == length(y))
    if(length(y) == length(y_1))
        n = length(x);
    else
        disp('y和y的导数的维数不相等!');
        return;
    end
else
    disp('x和y的维数不相等!');
    return;
end

for i=1:n
    h = 1.0;
    a = 0.0;
    for j=1:n
        if( j ~= i)
            h = h*(t-x(j))^2/((x(i)-x(j))^2);
            a = a + 1/(x(i)-x(j));
        end
    end
    
    f = f + h*((x(i)-t)*(2*a*y(i)-y_1(i))+y(i));
    
    if(i==n)
        if(nargin == 4)
            f = subs(f,'t',x0);
        else
            f = vpa(f,6);
        end
    end
end
x=-5:0.2:5;
y=3*x+5*x.^2-4*x.^3+2*x.^5+2;
figure,plot(x,y,'-.b+','linewidth',2);hold on;

x0=2.3;
y0=3*x0+2*x0.^2-x0.^3+2;
y01=3+4*x0-9*x0.^2-8*x0.^3;
tic
y1=Hermite(x,y,y01,x0);
toc
fprintf('理论值:%.4f,实际值%.4f\n',y0,yl);
plot(x0,y0,'r*','markersize',12);hold off;

resultado: 

>> e04
y和y的导数的维数不相等!
时间已过 0.071891 秒。
理论值:7.3130,实际值39.3952

05 interpolación spline 

Definición: En matemáticas, un polinomio a trozos con cierta suavidad se llama función spline.

Definición de función spline de segundo orden:

Se define la función 3 spline:

La función spline de tercer orden en Matlab :

y = interp1 (x0, y0, x, 'spline')

y = spline (x0, y0, x)

pp = csape (x0, y0, conds) y = ppval ( pp, x )

Se recomienda la función csape .

pp = csape (x0, y0) : utilice las condiciones de contorno predeterminadas, es decir, las condiciones de contorno de Lagrange . = PP csape (X0, yO, conds) en conds condiciones de contorno interpolación especificada, cuyo valor puede ser:

El límite 'completo' es la primera derivada, que es la condición de límite predeterminada

condición de no nudo ' no un nudo'

condición de período 'periódico'

El "segundo" límite es la segunda derivada, y el valor de la segunda derivada es [0, 0] .

'variacional' establece el valor de la segunda derivada del límite en [0,0] .

Ejemplo (e05) : La forma de la parte a procesar se dada por un conjunto de datos ( x, y ) de acuerdo con los requisitos del proceso (en el caso de un avión) Al procesar con una máquina fresadora controlada por programa, cada herramienta sólo puede. Ir muy pequeña en los x y Y direcciones Un paso, que requiere la obtención de coordenadas ( x, y ) con un pequeño paso requerido para procesar a partir de datos conocidos . Los datos xey dados en la tabla están ubicados en la línea de contorno inferior de la sección del ala Se asume que se requiere la coordenada y cuando la coordenada x cambia en 0.1 . Intente completar los datos de procesamiento, dibuje la curva y encuentre la pendiente de la curva en x = 0 y el valor mínimo de y en el rango de 13≤x≤15 . Requisitos para LAGRANGE , interpolación lineal por partes y spline cúbico: tres tipos de métodos de cálculo.

0

3

5

7

9

11

12

13

14

15

0

1.2

1,7

2.0

2.1

2.0

1.8

1.2

1.0

1,6

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=Language(x0,y0,x); %调用前面编写的Lagrange插值函数
y2=interp1(x0,y0,x);
y3=interp1(x0,y0,x,'spline');
pp1=csape(x0,y0); y4=ppval(pp1,x);
pp2=csape(x0,y0,'second'); y5=ppval(pp2,x);
fprintf('比较一下不同插值方法和边界条件的结果:\n')
fprintf('x y1 y2 y3 y4 y5\n')
xianshi=[x',y1',y2',y3',y4',y5'];
fprintf('%f\t%f\t%f\t%f\t%f\t%f\n',xianshi')
subplot(2,2,1), plot(x0,y0,'+',x,y1), title('Lagrange')
subplot(2,2,2), plot(x0,y0,'+',x,y2), title('Piecewise linear')
subplot(2,2,3), plot(x0,y0,'+',x,y3), title('Spline1')
subplot(2,2,4), plot(x0,y0,'+',x,y4), title('Spline2')
dyx0=ppval(fnder(pp1),x0(1)) %求x=0处的导数
ytemp=y3(131:151);
index=find(ytemp==min(ytemp));
xymin=[x(130+index),ytemp(index)]

%% 结果分析
%可以看出,拉格朗日插值的结果根本不能应用,分段线性插值的光滑性较差(特别
%是在 14 = x 附近弯曲处),建议选用三次样条插值的结果。

resultado:

Comparación de varios métodos de interpolación: https://blog.csdn.net/f2157120/article/details/80371214

 

 

Supongo que te gusta

Origin blog.csdn.net/seek97/article/details/108322553
Recomendado
Clasificación