Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Codigo Matlab Interpolacion de Lagrange
Codigo Matlab Interpolacion 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 **
%*********************************************************
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
%******************************************************
%** Enseguida se grafican los puntos que se dieron al**
%** Principio del programa **
%******************************************************
plot(x,xi)
grid
xlabel('x');ylabel('y')
MODELO 2
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:
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
Para Ejecutar:
clc
clear
X=-3:2:3;
Y=4./(1+X.^2);
[C, L] =lagrange(X,Y)
%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.
% 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
====================================================================
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';
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
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
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
else
end
end
% Presentacion de resultados
disp(xa);
disp(ya);
====================================================
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')
===============================================================================