Está en la página 1de 14

PROGRAMA EN MATLAB INTERPOLACIÓN DE LAGRANGE

MODELO 1

%******************************************************
%** Interpolacion con el Metodo **
%** del Polinomio de Lagrange UdeG **
%** Maestria en Electronica **
%** Ing. Jesus Norato Valencia **
%** Materia: Metodos Numericos **
%** Maestro: MC J.Gilberto Mateos Suarez 6/Dic/99 **
%******************************************************
clear;
clc;

%*********************************************************
%** Se ingresan los puntos de referencia para realizar la*
%** interpolacion, asi como el numero para el que se desea
%** interpolar **
%*********************************************************

fprintf('Interpolacion con el Metodo del Polinomio de Lagrange\n\n');

n=input('grado del polinolio: ');

for i=1:n+1
x(1,i)=input('dame los valores de xi:');
end

for i=1:n+1
xi(1,i)=input('dame los valores de f(xi):');
end

x
xi
xint=input('Numero para el que desea interpolar x: ');

%**********************************************************
%** En la siguiente seccion se realizan los calculos para *
%** determinar el valor aproximado resultado de la interpo*
%** lacion. **
%**********************************************************

fxint=0;
i=1;
while i<=n+1
L=1;
J=0;
while J<=n
if i~=J+1
L=L*(xint-x(1,J+1))/(x(1,i)-x(1,J+1));
end
J=J+1;
end
fxint=fxint+L*xi(1,i);
i=i+1;
end

fprintf('\nresultado xi: %d',fxint');

%******************************************************
%** Enseguida se grafican los puntos que se dieron al**
%** Principio del programa **
%******************************************************

plot(x,xi)
grid
xlabel('x');ylabel('y')

MODELO 2

% INTERPOLACION "POLINOMIO DE LAGRAGE"

clc %permite borrar el area de trabajo


clear %permite borrar las variables almacenadas
format long %permite utilizar la maxima capacidad de la maquina

fprintf(' INTERPOLACION "POLINIMIO DE


LAGRAGE"\n\n\n');
%fprintf me permite ingresar comentarios de manera textual que pueden
%orientar al usuario en el uso del programa

xi=input('Ingrese los puntos pertenecientes a las x: ');


yi=input('Ingrese los puntos pertenecientes a las y: ');
%input es un comando de solicitud de entrada de datos del usuario.
n=length(xi);
x=sym('x'); %esta funcion nos permite dejar la variable 'x' como
simbolica
% y asi poder trabajar con ella, sin tener que asignarle un valor.
for j=1:n
producto=1;
for i=1:j-1
producto=producto*(x-xi(i)); %calculo del producto 1 superior de
L
end
producto2=1;
for i=j+1:n
producto2=producto2*(x-xi(i)); %calculo del producto 2 superior
de L
end
producto3=1;
for i=1:j-1
producto3=producto3*(xi(j)-xi(i)); %calculo del producto 3
inferior de L
end
producto4=1;
for i=j+1:n
producto4=producto4*(xi(j)-xi(i)); %calculo del producto 4
inferior de L
end
L(j)=(producto*producto2)/(producto3*producto4); %calculos de las L
para
fprintf('\n L%d:\n',j-1) %poder hallar el polinomio
disp(L(j)) %la funcion dispo nos permite visualizar varibles o texto
% en el workspace
end
pn=0;
for j=1:n
pn=pn+L(j)*yi(j); %calculo del polinomio interpolante
end
fprintf('\n POLINOMIO INTERPOLANTE: \n')
%disp(pn) % esta ejecucion la podemos utilizar cuando no necesitamos
%simplicar la expresion
pn = simple(pn); %este comando nos permite simplificar toda la
expresion
disp(pn)

opc=input('\nDesea aproximar un valor (si/no): ','s');


%este comando nos permite saber si el usuario quiere obtener una
%aproximacion de un punto dado, en el polinomio que se acaba de obtener
if opc=='si'
x=input('\nIngrese el punto a aproximar: ');
y=eval(pn); %evaluar el punto en el polinomio
disp('\nLa aproximacion a f(x) es:')
disp(y)
end

MODELO 3

function y1=lagrange(x,y,x1)
%este programa obtiene el valor interpolado y1 correspondiente al valor
x1
%empleando el polinomio interpolador de Lagrange de grado n, obtenido a
%partir de los vectores x e y (de longitud n)
%obtenemos el tama~no del conjunto de datos,
n=length(x);
%inicializamos la variable de salida
y1=0;
%construimos el valor a partir de los polinomios de Lagrange,
for j=1:n
%inicializamos el polinomio de Lagrange correspondiente al dato i
lj=1;
%y lo calculamos...
for i=1:j-1
lj=lj*(x1-x(i))/(x(i)-x(j));
end
for i=j+1:n
lj=lj*(x1-x(i))/(x(i)-x(j));
end
%sumamos la contribución del polinomio de Lagrange lj
y1=y1+lj*y(j);
end

MODELO 4

clear all;
clc;
fprintf('Interpolacion con el Metodo del Polinomio de Lagrange\n\n');
n=input('grado del polinolio: ');
for i1:n+1
x(1,i)=input('dame los valores de xi:');
end
for i=1:n+1
xi(1,i)=input('dame los valores de f(xi):');
end
x
xi
xint=input('Numero para el que desea interpolar x: ');
fxint=0;
i=1;
while i<=n+1
L=1;
J=0;
while J<=n
if i~=J+1
L=L*(xint-x(1,J+1))/(x(1,i)-x(1,J+1));
end
J=J+1;
end
fxint=fxint+L*xi(1,i);
i=i+1;
end
fprintf('\nresultado xi: %d',fxint');
plotx,xi)
grid
title('Polinomio de Lagrange');xlabel('x');yhabel('y')

MODELO 5

function [l,L]=lagrang_int(x,y)
% Calcula el polinomio de interpolación de Lagrange
% x e y vectores de datos; l, coeficientes polinomio resultante,
% L polinomio base
N=length(x)-1; l=0;
for m=1:N+1
P=1;
for k=1:N+1
if k~=m, P=conv(P,poly(x(k)))/(x(m)-x(k)); end
end
L(m,:)=P; % Polinomios de Lagrange base
l=l+y(m)*P; % Coeficientes el polinomio resultante
end
% do_Lagrange_int
x = [-2 -1 1 2]; y=[-6 0 0 6];
l = lagrang_int(x,y)
xx = [-2:0.02:2]; yy = polyval(l,xx);
plot(xx,yy,’b’,x,y,’o’)

EJERCICIOS RESUELTOS:

%Programa que calcula el polinomio interpolador


n=9;
syms x;
xn=[-5 -3 -2 -1 0 1 2 3 4 5];
yn=1./(1.+xn.^2);
plot(xn,yn,'*r')
hold on
p=0;
for i=1:n
L=1;
for j=1:n
if j~=i
L=L*(x-xn(j))/(xn(i)-xn(j));
end
end
p=p+L*yn(i);
end
p=simplify(p)
pretty(p)
x=-5:0.01:5;
f=1./(1+x.^2);
plot(x,f);

%Programa que calcula el polinomio interpolador con comentarios

n=9; % número de puntos


syms x; % define la variable simbólica para crear el polinomio
xn=[-5 -3 -2 -1 0 1 2 3 4 5]; % abscisas de los puntos a interpolar
yn=1./(1.+xn.^2); % ordenadas de estas abscisas
plot(xn,yn,'*r') % dibuja los puntos a interpolar
hold on
p=0; % inicializa el polinomio de interpolación que empezará a calcular
for i=1:n
L=1;
for j=1:n
if j~=i
L=L*(x-xn(j))/(xn(i)-xn(j));
end
end
p=p+L*yn(i); % forma de Lagrange
end
p=simplify(p)
pretty(p) % muestra el polinomio en pantalla
x=-5:0.01:5;
f=1./(1+x.^2);
plot(x,f); % dibuja la función a interpolar

%Programa que calcula varios polinomios interpoladores de n+1 puntos

a=-5; b=5;
syms x;

t=-5:0.01:5;
f=1./(1+t.^2);
plot(t,f,'g.'); hold on;

for n=2:4
h=(b-a)/n;
for k=1:n+1
xn(k)=a+(k-1)*h; yn(k)=1/(1+xn(k)^2);
plot(xn,yn,'*r')
end
hold on

p=0;

for i=1:n+1
L=1;
for j=1:n+1
if j~=i
L=L.*(x-xn(j))./(xn(i)-xn(j));
end
end
p=p+L*yn(i);
end

ezplot(p);
hold on

end
EJERCICIOS RESUELTOS EN CLASE:
clc
clear
P=[1 -5 6 -2];
x=-1:0.02:1;
y=polyval(P,x);
plot(x,y)
grid on

-2

-4

-6

-8

-10

-12

-14
-1 -0.8 -0.6 -0.4 -0.2 0 0.2 0.4 0.6 0.8 1

Funcion genral de Lagrange


function [C, L] = LAGRANGE (X,Y)
% X ES UN VECTOR QUE CONTIENE LAS LISTAS DE ABSISAS
% Y ES UN VECTOR QUE CONTIENE LAS LISTAS DE ORDENADAS
% C ES LA MATRIZ QUE CONTIENE LOS COEFICIENTES DEL POLINOMIO
% Li ES LA MATRIZ QUE CONTIENE LOS COEFICIENTES DDEL POLINOMIO DE
LAGRANGE
w=length(X);
n=w-1;
L=zeros(w,w);
%FORMACION DE LOS POLINOMIO Li LAGRANGE
for k=1:n+1
V=1;
for r=1:n+1;
if k~=r
V=conv(V,poly(X(r)))/(X(k)-X(r));
end
end
L(k,:)=V;
end
% CALCULO DE LOS POLINOMIOS INTERPOLADOR
C=Y*L;

Para Ejecutar:

clc
clear
X=-3:2:3;
Y=4./(1+X.^2);
[C, L] =lagrange(X,Y)

INTERPOLACIÓN POLINÓMICA DE NEWTON CON MATLAB

%Interpolacion de newton
clear;clc;
disp('metodos numericos');
disp('interpolacion');
disp('interpolacion');
n=input('ingrese el grado del polinomio, n=');
fprintf('Se necesitan %.0f puntos\n',n+1);
disp('ingrese los puntos');
for i=1:n+1
fprintf('x%.0f=',i-1);
X(i)=input(' ');
fprintf('y%.0f=',i-1);
Y(i)=input(' ');
end
DD=zeros(n+1);
DD(:,1)=Y;
for k=2:n+1
for J=k:n+1
DD(J,k)=[DD(J,k-1)-DD(J-1,k-1)]/[X(J)-X(J-k+1)];
end
end
disp('La matriz de diferencias divididas es:');
disp(DD);
disp('El polinomio de newton es');
syms x;
polnew=DD(1,1);
P=1;
for i=1:n
P=P*(x-X(i));
polnew=polnew+P*DD(i+1,i+1);
end
polnew=expand(polnew);
pretty(polnew);
x=input('ingrese el valor de x a interpolar,x=');
vi=eval(polnew);
fprintf('el valor interpolado es %.2f\n',vi);
hold on;
ezplot(polnew,[X(1) X(n+1)]);
plot(x,vi,'r+');

=================================================================

clear;clc
x=[0 1 2 3];y=[1 2 2.5 4]; % entrada de datos.
% No tienes que digitar modificar más nada.

%Cuerpo del programa


xa=x;ya=y;
% Formacion de las diferencias divididas
d=zeros(length(y));
d(:,1)=y';
for k=2:length(x)
for j=1:length(x)+1-k
d(j,k)=(d(j+1,k-1)-d(j,k-1))/(x(j+k-1)-x(j));
end
end
% Formacion del polinomio
for w=1:length(x)
ds=num2str(abs(d(1,w)));
if w>1
if x(w-1)<0
sg1='+';
else
sg1='-';
end
end
if d(1,w)<0
sg2='-';
else
sg2='+';
end
if w==1
acum=num2str(d(1,1));
elseif w==2
polact=['(x' sg1 num2str(abs(x(w-1))) ')' ];
actual=[ds '*' polact];
acum=[acum sg2 actual];
else
polact=[polact '.*' '(x' sg1 num2str(abs(x(w-1))) ')' ];
actual=[ds '*' polact];
acum=[acum sg2 actual];
end
end

% Presentacion de resultados
fprintf('n Valores de X y Y n ');
disp(xa);
disp(ya);
fprintf('n Polinomio interpolación Newton : %s n',acum);
x=input(' X interp = ');
if x>max(xa)|x<min(xa)
fprintf('t Punto fuera de rango. El resultado puede ser equivocado
n');
end
xinterp=x;
yinterp=eval(acum);
fprintf(' Y(%g) = %g n',x,yinterp);
% Grafica de los puntos
fprintf(' Pulse cualquier tecla para ver la grafica de los puntos n');
pause
xg=linspace(min(xa),max(xa));
x=xg;yg=eval(acum);
plot(xg,yg,xa,ya,'.r',xinterp,yinterp,'or');
grid

====================================================================

>> % ingreso de datos.

x=[-1 0 1 2 3];y=[3 0 -1 1 2];

xa=x;ya=y;

%se le dan los valores de xa e ya a las variables x e y que serán utilizadas mas adelante.
% Formacion de las diferencias divididas a través de ciclos “for” e “if”.

d=zeros(length(y));

%zeros(n) genera una matriz de nxn con todos sus valores iguales a cero, en este caso utiliza el
largo del arreglo y

d(:,1)=y';

%Se asigna valor de y’ a la columna de la matriz creada anteriormente

for k=2:length(x)

%se hacen dos ciclos, uno dentro de otro, donde van variando los valores de j y k, y va entregando
cuales son los valores que se utilizaran en

for j=1:length(x)+1-k

d(j,k)=(d(j+1,k-1)-d(j,k-1))/(x(j+k-1)-x(j));

end

end

for w=1:length(x)

ds=num2str(abs(d(1,w)));

%los valores numericos de la matriz “ds” en las coordenadas (1,w) se transforman en “string”,
cuyos valores no serán modificados después, y serán mostrados al final en “presentación de
resultados”

if w>1

%si w es mayor que 1…

if x(w-1)<0

%si la multiplicación de x por (w-1)es menor a cero, se agrega un símbolo “+” al polinomio de
resultado.

sg1='+';

else

%en caso contrario, el símbolo matemático es “-“.


sg1='-';

end

end

if d(1,w)<0

sg2='-';

else

sg2='+';

end

if w==1

acum=num2str(d(1,1));

%se crea un contador de nombre “acum” que irá almacenando el polinomio obtenido, y lo
mostrará el final del codigo

elseif w==2

polinact=['(x' sg1 num2str(abs(x(w-1))) ')' ];

actual=[ds '*' polinact];

acum=[acum sg2 actual];

else

polinact=[polinact '.*' '(x' sg1 num2str(abs(x(w-1))) ')' ];

actual=[ds '*' polinact];

acum=[acum sg2 actual];

end

end

% Presentacion de resultados

fprintf('los valores de X e Y son');

disp(xa);
disp(ya);

%imprimir en pantalla el polinomio obtenido

fprintf('El polinomio interpolación Newton obtenido es: %s ',acum);

====================================================

clear all;
clc;
fprintf('Interpolacion con el Metodo de Aproximacion Polinomial Simple\n\n');
n=input('Numero de puntos que se tienen: ');

for i=1:n
x(1,i)=input('dame los valores de xi:');
end

for i=1:n
xi(1,i)=input('dame los valores de f(xi):');
end
%imprimiendo los Valores x, xi
x
xi
xint=input('Numero para el que desea interpolar x: ');
%determinando los parametros a0,1,2
i=1;
while i<=n
a(i,1)=1;
j=2;

while j<=n
a(i,j)=a(i,j-1)*x(1,i);
j=j+1;
end
a(i,n+1)=xi(1,i);
i=i+1;
end
%Resolviendo mediante el metodo de Gauss-jordan
c=n+1;
f=n;
for k=1:c-1
a(k,:)=a(k,:)/a(k,k);
for j=k+1:f
a(j,:)=a(j,:)-a(k,:)*a(j,k);
j=j+1;
end
k=k+1;
end
for k=f:-1:2
for j=k-1:-1:1
a(j,:)=a(j,:)-a(k,:)*a(j,k);
j=j-1;
end
k=k-1;
end
r=0;
for m=1:n-1
r=r+(a(m+1,n+1))*xint^m;
end
r=r+a(1,n+1);
fprintf('\n\nresultado xi: %d\n',r);
%Graficando Resultados
plot(x,xi)
grid
xlabel('x');ylabel('y')

===============================================================================

También podría gustarte