Está en la página 1de 51

UNIVERSIDAD NACIONAL MAYOR DE SAN MARCOS

(Universidad del Perú, Decana de América)

FACULTAD DE QUÍMICA E INGENIERÍA QUÍMICA


DEPARTAMENTO DE ANÁLISIS Y DISEÑO DE PROCESOS
ESCUELA PROFESIONAL DE INGENIERÍA
AGROINDUSTRIAL

LABORATORIO N°4

CURSO: Métodos Numéricos para la Ingeniería

DOCENTE: Juana Sandivar Rosas

Grupo: 1

Integrantes:

• Alarcon Aguilar, Paul Angel


• Zuñiga Collana Monica Giovanna

2022
Problema 1
Construya la tabla de diferencia finita e indique si es perfecta o hay propagación de errores.
x f(x) 𝛥1 𝑓𝑖 𝛥2 𝑓𝑖 𝛥3 𝑓𝑖 𝛥4 𝑓𝑖

k 1 1 - - - -

k+1 2 8 7 - - -

k+2 3 27 19 12 - -

k+3 4 64 37 18 6 -

k+4 5 125 61 24 6 0

Existe una relación polinomial exactamente entre x y f(x).


No hay error, terminación en 0.
Tabla perfecta.

Verificar si dados los puntos (1,1), (1.4, 1.1832), (2.2, 1.4832), (2.6, 1.6125), (3, 1.7321).
¿Es una tabla perfecta? De lo contrario explicar porque no lo es.

x f(x) 𝛥1 𝑓𝑖 𝛥2 𝑓𝑖 𝛥3 𝑓𝑖 𝛥4 𝑓𝑖

k 1 1 - - - -

k+1 1.4 1.1832 0.1832 - - -

k+2 2.2 1.4832 0.3 0.1168 - -

k+3 2.6 1.6125 0.1293 -0.1701 -0.2869 -

k+4 3 1.7321 0.1196 -0.0097 0.1604 -0.4473

h= no es cte. → para que sea perfecta h=cte.


No es una tabla perfecta

En Scilab:

function problema1()

a = [1; 8; 27; 64; 125]

d = zeros(length(a) - 1, 1);

disp(a)

for j = 1:length(a) - 1;

d(j) = a(j + 1) - a(j);

disp(d)
end

d2 = zeros(length(d) - 1, 1);

for k = 1:length(d) - 1;

d2(k) = d(k+1) - d(k);

disp(d2)

end

d3 = zeros(length(d2) - 1, 1);

for m = 1:length(d2) - 1;

d3(m) = d2(m+1) - d2(m);

disp(d3)

end

d4 = zeros(length(d3) - 1, 1);

for n = 1:length(d3) - 1;

d4(n) = d3(n+1) - d3(n);

disp(d4)

end

endfunction
Problema 2:

Problema 2: Estime el logaritmo natural de 10 por medio de interpolación lineal:


a) Interpole entre log 8= 0.9030900 y log 12=1.0791812.
b) Interpole entre log 9=0.9542425 y log 11= 1.0413927. Para cada una de las
interpolaciones calcule el error relativo porcentual con base en el valor verdadero.

a) 8= 0.9030900 y log 12=1.0791812.

x f(X)

8 0.9030900

12 1.0791812.

usaremos la siguiente fórmula:

xo = 8
f(xo) = 0.9030900
x1 = 12
f(x1) = 1.0791812
x = 10

1.0791812 − 0.9030900
f(x) = 0.9030900 + ∗ (10 − 8)
12 − 8
f(x) = 0.9030900 + 0.0880456
f(x) = 0.9911356
log (10) = 1 valor verdadero

1 − 0.9911356
𝜉v =
1
∗ 100% = 0.0088644% error relativo porcentual verdadero

b) 9=0.9542425 y log 11= 1.0413927

x f(X)

9 0.9542425

11 1.0413927

xo = 9
f(xo) = 0.9542425
x1 = 11
f(x1) = 1.0413927
x = 10

1.0413927 − 0.9542425
f(x) = 0.9542425 + ∗ (10 − 9)
11 − 9
f(x) = 0.9542425 + 0.0435751
f(x) = 0.9978176

log (10) = 1 valor verdadero

1 − 0.9978176
𝜉v =
1
∗ 100% = 0.0021824% error relativo porcentual verdadero

// función para interpolar dados dos vectores y un valor de x

function y=Lineal(X, Y, x)
n=length(X);
val=x
for i=1:n
if X(i)==val then
valy=Y(i)
break
else

if X(i)>val then
cota_sup=i;
cota_inf=i-1;
deltaX=X(cota_sup)-X(cota_inf);
deltaY=Y(cota_sup)-Y(cota_inf);
m=deltaY/deltaX;
valy=Y(cota_inf)+m*(val-X(cota_inf));

break
end
end
end
y=valy
endfunction

Problema 3
//Función utilizando interpolacion lineal y calculando un valor de x
clc;
clear all;
close all;
function Inter()
x=input('Ingrese el vector x: ');
y=input('Ingrese el vector y: ');
x=[0.10377, 0.11144, 0.1254];
y=[6.4147, 6.5453, 6.7664];
xi=input('Introducir un valor a interpolar : ');
n=length(x)-1;
S=0;
for k=0:n
n=k;
S=0;
for i=1:n+1
P=y(i);
for j=1:n+1
if i~=j
P=P*(xi-x(j))/(x(i)-x(j));
end

end
S=S+P;
end
sol(k+1)=S;
end
sol;
printf('\nLa interpolacion para x= %5.5f es:\n',xi)
printf(' Grado Yint');
u=0;
for t=1:n
printf('\n %d %5.8f \n',u,sol(t));
u=u+1;
end
printf('\n %d %5.8f \n',u,sol(t+1));
endfunction
EJERCICIO 4

X 1.6 2 2.5 3.2 4 4.5

F(x) 2 8 14 15 8 2

a) Calcule f (2.8) con el uso de polinomios de interpolación de Newton de órdenes 1 a


3.

Elija la secuencia de puntos más apropiada para alcanzar la mayor exactitud posible para

sus estimaciones

b) Utilice la ecuación Rn= f [xn+1, xn, xn-1, ... , x0](x – x0)(x – x1)... (x – xn) (Ver
errores de la

interpolación de Newton), para estimar el error de cada predicción.

ORDEN 1

Se eligieron los siguientes puntos asociados:

· 𝑥0 = 2.5

· 𝑥1 = 3.2

· 𝑥2 = 4→ Punto asociado para estimar el error

Tabla de diferencias divididas finitas

i Xi fi DD1 DD2

0 2.5 14 1.4285 -6.785714

1 3.2 15 -8.75

2 4 8
F (x1, x0) = 15 - 14 / 3.2 – 2.5 = 1.4285

F (x2, x1) = 8 – 15 / 4 – 3.2 = -8.75

F (x2, x1, x0) = -8.75 – 1.428571 / 4 – 2.5 = -6.785714

Para 𝑓1(2.8):

𝑓1 (2.8) = 𝑓0 + 𝐹 [𝑥1; 𝑥0] (𝟐.𝟖−𝒙𝟎)

Remplazando:

𝑓1 (2.8) = 14 + 1.43 (𝟐. 𝟖 − 𝟐. 𝟓)

Hallamos el error

𝑅1 = 𝐹 [𝑥2; 𝑥1; 𝑥0] (𝒙−𝒙𝟎) (𝒙−𝒙𝟏)

Remplazando:

𝑅1 = (−6.78571) (𝟐. 𝟖 − 𝟐. 𝟓)(𝟐.𝟖 − 𝟑. 𝟐)

𝑅1 = 0.8143

Si se eligieran puntos asociados más distantes del valor a interpolar obtendríamos:

· 𝑥0 = 2

· 𝑥1 = 3.2

· 𝑥2 = 4→ Punto asociado para estimar el error

Tabla de diferencias divididas finitas

I Xi fi DD1 DD2

0 2 8 5.83 -7.291

1 3.2 15 -8.75

2 4 8
F (x1, x0) = 15-8 / 3.2-2 = 5.83

F (x2, x1) = 15 - 8 / 4 - 3.2 = -8.75

F (x2, x1, x0) = -8.75- 5.83 / 4-2 = -7.291

Luego para 𝑓1(2.8)

𝑓 ∗1 (2.8) = 𝑓0 + 𝐹 [𝑥1; 𝑥0] (𝟐.𝟖−𝒙𝟎)

Remplazando:

𝑓1 (2.8) = 8 + 5.83 (2.8 − 𝟐)

𝑓 ∗1 (2.8) = 12.664

Hallamos el error

𝑅1 = 𝐹 [𝑥2; 𝑥1; 𝑥0] (𝒙−𝒙𝟎) (𝒙−𝒙𝟏)

Remplazando:

𝑅1 = (−7.291) (𝟐.𝟖 − 𝟐) (𝟐. 𝟖 − 𝟑. 𝟐)

𝑅1 = 2.33312

ORDEN 2

Para el polinomio de interpolación de Newton de 2° grado Se eligieron los siguientes puntos


asociados:

· 𝑥0 = 2

· 𝑥1 = 2.5

· 𝑥2 = 3.2

· 𝑥3 = 4→ Punto asociado para estimar el error

Tabla de diferencias divididas finitas

I Xi Fi DD1 DD2 DD3

0 2 8 12 -8.81 1.01

1 2.5 14 1.43 -6.79


2 3.2 15 -8.75

3 4 8

Luego para 𝑓2(2.8)

𝑓2 (2.8) = 𝑓0 + 𝐹 [𝑥1; 𝑥0] (𝟐. 𝟖−𝒙𝟎) + 𝐹 [𝑥2; 𝑥1; 𝑥0] (𝟐. 𝟖−𝒙𝟎) (𝟐. 𝟖−𝒙𝟏)

Remplazando:

𝑓2 (2.8) = 8 + 12 (𝟐. 𝟖 − 𝟐) + (−8.81) (𝟐. 𝟖 − 𝟐) (𝟐. 𝟖 − 𝟐. 𝟓)

𝑓2 (2.8) = 15.4856

Hallamos el error

𝑅2 = 𝐹 [𝑥3; 𝑥2; 𝑥1; 𝑥0] (𝒙−𝒙𝟎) (𝒙−𝒙𝟏) (𝒙−𝒙𝟐)

Reemplazando:

𝑅2 = 1.01(𝟐. 𝟖 − 𝟐) (𝟐. 𝟖 − 𝟐. 𝟓)(𝟐. 𝟖 − 𝟑. 𝟐)

𝑅2 = −0.09696

ORDEN 3

Para el polinomio de interpolación de Newton de 3° grado Se eligieron los siguientes puntos


asociados:

· 𝑥0 = 2

· 𝑥1 = 2.5

· 𝑥2 = 3.2

· 𝑥3 = 4

· 𝑥4 = 2 → Punto asociado para estimar el error

Tabla de diferencias divididas finitas


i xi fi DD1 DD2 DD3 DD4 DD5

0 2 8 12 -8.81 1.01 0.45 0.23

1 2.5 14 1.43 -6.79 2.14

2 3.2 15 -8.75 -2.50

3 4 8 -12

4 4.5 2

Luego para 𝑓3(2.8)

𝑓3 (2.8) = 𝑓0 + 𝐹 [𝑥1; 𝑥0] (𝟐. 𝟖−𝒙𝟎) + 𝐹 [𝑥2; 𝑥1; 𝑥0] (𝟐. 𝟖−𝒙𝟎) (𝟐. 𝟖−𝒙𝟏) + 𝐹 [𝑥3; 𝑥2; 𝑥1; 𝑥0]
(𝟐.𝟖−𝒙𝟎) (𝟐. 𝟖−𝒙𝟏) (𝟐. 𝟖−𝒙𝟐)

Remplazando:

𝑓3 (2.8) = 8 + 12 (𝟐. 𝟖 − 𝟐) + (−8.81) (𝟐. 𝟖 − 𝟐) (𝟐. 𝟖 − 𝟐. 𝟓) + 1.01(𝟐. 𝟖 − 𝟐) (𝟐. 𝟖 − 𝟐. 𝟓)(𝟐.


𝟖 − 𝟑. 𝟐)

𝑓3 (2.8) = 15.38864

Hallamos el error

𝑅3 = 𝐹 [𝑥4; 𝑥3; 𝑥2; 𝑥1; 𝑥0] (𝒙−𝒙𝟎) (𝒙−𝒙𝟏) (𝒙−𝒙𝟐) (𝒙−𝒙𝟑)

Reemplazando: 𝑅3 = 0.45(𝟐.𝟖 − 𝟐) (𝟐. 𝟖 − 𝟐. 𝟓)(𝟐. 𝟖 − 𝟑. 𝟐)(𝟐.𝟖 − 𝟒)

𝑅3 = 0.05184

Scilab:

//CODIGO POLINOMIO DE INTERPOLACION DE NEWTON


function new()
printf("\tInterpolacion polinomial de Newton\n\n")
g=input("Ingrese el grado del polinomio: ")
printf("\tEntonces se necesitan %d puntos: ",g+1)
for i=1:g+1
printf("x%d, ",i-1)
end
printf("\n\tTambien se necesita un punto extra(x%d) para evaluar el error(Rn)\n",g+1)
n=g+2
//INGRESO DE LOS VALORES DE Xi
printf("\n\tIngreso de los valores de Xi\n\n")
for i=1:n
if i==n
x(i)=input('Ingrese el valor extra para el error x'+string(i-1)+': ')
else
x(i)=input('Ingrese x'+string(i-1)+': ')
end
end
//INGRESO DE LOS VALORES DE fi
printf("\tIngreso de los valores de fi\n\n")
for i=1:n
if i==n
f(i)=input('Ingrese el valor extra para el error f'+string(i-1)+': ')
else
f(i)=input('Ingrese f'+string(i-1)+': ')
end
end
//Construimos las diferencias dividadas finitas
fdd=zeros(n,n)//Creamos una matriz nxn que tendra los valores de las DDF
//Remplazamos los valores de la matris fdd por las DDF
for i=1:n
fdd(i,1)=f(i)
end
for j=2:n
for i=1:n-(j-1)
fdd(i,j)=(fdd(i+1,j-1) - fdd(i,j-1))/(x(i+j-1)-x(i))
end
end
//disp(fdd)
//Muestra los valores de fdd -TABLA
printf("\n\n\t\tTABLA DE DIFERENCIAS DIVIDIDAS FINITAS\n\n")
printf("\ti\txi\tfi\t")
for i=1:n-1
printf("DD%d\t",i)
end
for j=1:n
printf("\n\t%d\t%f\t%f", j-1,x(j),f(j))
for i=1:n-1
printf("\t%f",fdd(j,i+1) )
end
end
//Ingreso del valor a interpolar
printf('\n\nIngresarmos el valor de X a interpolar\n')
X=input("X= ")
//Hallamos f(X)
xterm=1
yint=fdd(1,1)
for i=1:n-1
xterm= xterm*(X-x(i))
yintt=yint+xterm*fdd(1,i+1)
resp=yint
yint=yintt
end
//Se muestran las respuestas
printf('\n\tLuegos f%d(%f)=%f\n',g,X,resp)
printf('\tError de interpolacion para el polinomio de %d° grado de Newton: \n',g)
printf('\tR%d=%f\n',g,yintt-resp)
endfunction

RESULTADOS EN SCILAB
Scilab:
clc
clear
opc = input('Ingrese el grado polinomial de 1 a 4 en el que desea trabajar: ')
x1 = input('Ingrese qué valor de X desea conocer: ')
select(opc)
//Grado 1
case 1
for i=1:2
v(i)=input('Ingrese los valores X: ')
fv(i)=input('Ingrese los valores Y: ')
end
fog1 = (fv(2)-fv(1))/(v(2)-v(1)) // F[X1,X0]
function y1=f1(x)
y1=fv(1)+ f0g1*(x-v(1))
endfunction
u = f1(x1)
//Grado 2
case 2
for i=1:3
v(i)=input('Ingrese los valores X: ')
fv(i)=input('Ingrese los valores Y: ')
end
f0g2=(fv(2)-fv(1))/(v(2)-v(1)) // F[X1,X0]
f1g2=(fv(3)-fv(2))/(v(3)-v(2)) // F[X2,X1]
f2g2=(f1g2-f0g2)/(v(3)-v(1)) // F[X2,X1,X0]
function y2=f2(x)
y2 = fv(1)+f0g2*(x-v(1))+f2g2*(x-v(1))*(x-v(2))
endfunction
u = f2(x1)
//Grado 3
case 3
for i=1:4
v(i)=input('Ingrese los valores X: ')
fv(i)=input('Ingrese los valores Y: ')
end
f0g3=(fv(2)-fv(1))/(v(2)-v(1)) // F[X1,X0]
f1g3=(fv(3)-fv(2))/(v(3)-v(2)) // F[X2,X1]
f2g3=(fv(4)-fv(3))/(v(4)-v(3)) // F[X3,X2]
f3g3=(f1g3-f0g3)/(v(3)-v(1)) // F[X2,X1,X0]
f4g3=(f2g3-f1g3)/(v(4)-v(2)) // F[X3,X2,X1]
f5g3=(f4g3-f3g3)/(v(4)-v(1)) // F[X3,X2,X1,X0]
function y3 = f3(x)
y3 = fv(1)+f0g3*(x-v(1))+f3g3*(x-v(1))*(x-v(2))+f5g3*(xv(1))*(x-v(2))*(x-v(3))
endfunction
u = f3(x1)
//Grado 4
case 4
for i=1:5
v(i)=input('Ingrese los valores X: ')
fv(i)=input('Ingrese los valores Y: ')
end
f0g4=(fv(2)-fv(1))/(v(2)-v(1)) // F[X1,X0]
f1g4=(fv(3)-fv(2))/(v(3)-v(2)) // F[X2,X1]
f2g4=(fv(4)-fv(3))/(v(4)-v(3)) // F[X3,X2]
f3g4=(fv(5)-fv(4))/(v(5)-v(4)) // F[X4,X3]
f4g4=(f1g4-f0g4)/(v(3)-v(1)) // F[X2,X1,X0]
f5g4=(f2g4-f1g4)/(v(4)-v(2)) // F[X3,X2,X1]
f6g4=(f3g4-f2g4)/(v(5)-v(3)) // F[X4,X3,X2]
f7g4=(f5g4-f4g4)/(v(4)-v(1)) // F[X3,X2,X1,X0]
f8g4=(f6g4-f5g4)/(v(5)-v(2)) // F[X4,X3,X2,X1]
f9g4=(f8g4-f7g4)/(v(5)-v(1)) // F[X4,X3,X2,X1,X0]
function y4=f4(x)
y4=fv(1)+f0g4*(x-v(1))+f4g4*(x-v(1))*(x-v(2))+f7g4*(xv(1))*(x-v(2))*(x-v(3))+f9g4*(x-
v(1))*(x-v(2))*(x-v(3))*(x-v(4))
endfunction
u = f4(x1)
end
GRADO 4
Problema 6
6. Ajuste un polinomio de interpolación de Newton de segundo grado para estimar el log

10, con los datos siguientes: a) Interpole entre log 8= 0.9030900 y log 12=1.0791812.

b) Interpole entre log 9=0.9542425 y log 11= 1.0413927. Para cada una de las

interpolaciones calcule el error relativo porcentual con base en el valor verdadero. En x= 8, 9

y 11. Calcule el error relativo porcentual verdadero.


En x= 8, 9 y 11. Calcule el error relativo porcentual verdadero.

F(x1,x0) = F(x1) - F(x0) / x1 - x0

F(x1;x0) = 0.9542425 - 0.9030900 / 9 - 8 = 0.0511525

F(x2,x1) = F(x2) - F(x1) / x2 - x1

F(x2;x1) = 1.0791812−0.9542425 / 11 - 9 = 0.435751

F(x2,x1;x0) = F(x2;x1) - F(x1;x0) / x2 - x1

F(x2;x1;x0) = 0.04335751 − 0.0511525 / 11-8 = −0.0025258


x F(X) 1°Dif 2°Dif

X0 8 0.9030900

X1 9 0.9542425 0.0511525

X2 11 1.0413927 0.0435751 -0.0025258

Polinomio de Newton de segundo grado:

P2(x)=0.9030900+0.051125(x-8)-0.0025258(x-8)(x-9)

=1.0003428

Ev=(1-1.0003428/1)*100=0.03428

CÓDIGO SCILAB:
clc
resp = 'S'
while resp == 'S'
for i=1:3
v(i)=input('Ingrese entre qué valores de X desea interpolar: ')
loga(i)=log10(v(i))
end
f0=(loga(2)-loga(1))/(v(2)-v(1))
f1=(loga(3)-loga(2))/(v(3)-v(2))
f2=(f1-f0)/(v(3)-v(1))
function y=f(x)
y = loga(1)+f0*(x-v(1))+f2*(x-v(1))*(x-v(2))
endfunction
x1=input('Ingrese el valor a conocer: ')
m = f(x1)
Ev = abs(log10(x1)-m)*100/log10(x1)
printf('El valor de Log(%.2f) es %.8f\n',x1,m)
printf('\nEl error relativo porcentual verdadero es %.8f\n',Ev)
resp = input('¿Desea hacer otra interpolación? Ingrese S o N: ','s')
while resp <> 'S' & resp <> 'N'
resp = input('\nIngrese S o N: \n','s')
end
end

Problema 7:

Una aplicación útil de la interpolación de Lagrange se denomina búsqueda en la tabla.


Como el nombre lo indica, involucra “buscar” un valor intermedio en una tabla. Para
desarrollar dicho
algoritmo, en primer lugar, se almacena la tabla de los valores de x y f(x) en un par de
arreglos
unidimensionales. Después, dichos valores se pasan a una función junto con el valor de x
que se desea
evaluar. La función hace luego dos tareas. En primer lugar, hace un ciclo hacia debajo de la
tabla
hasta que encuentra el intervalo en el que se localiza la incógnita. Después aplica una
técnica como la interpolación de Lagrange para determinar el valor apropiado de f(x).
Desarrolle una función así con
el uso de un polinomio cúbico de Lagrange para ejecutar la interpolación. Para intervalos
intermedios
ésta es una buena elección porque la incógnita se localiza en el intervalo a la mitad de los
cuatro
puntos necesarios para generar la expresión cúbica. Para los intervalos primero y último,
use un
polinomio cuadrático de Lagrange. Asimismo, haga que el código detecte cuando el usuario
pida un
valor fuera del rango de las x. Para esos casos, la función debe desplegar un mensaje de
erro. Pruebe
su programa para f(x)= ln x con los datos x=1, 2, .., 10.
Scilab:

function problema5()
resp='s';
while resp=='s'|resp=='S' // estructura while
printf("\t\t\tINTERPOLACION POLINOMIAL DE LAGRANGE\n")
printf("\n");
n=input("Ingrese el numero de datos:")
x=zeros(n,1);
y=zeros(x);
printf("Introduzca los datos: ")
for i=1:n
x(i)=input("x"+string(i-1)+"=");
y(i)=log(x(i))
printf("y%d=%f",(i-1),y(i));
end
printf("\n");
xint=input("Ingrese el valor a interpolar:");
vv=log(xint);
if x(1)<xint & xint<x(n) then
printf("El valor de x=%0.2f se encuentra dentro del rango de las x, siendo este de:
[%0.2f,%0.2f],\n",xint,x(1),x(n));
elseif x(1)>xint | xint>x(n)
printf("ERROR\n")
printf("x=%0.2f se encuentra fuera del rango de las x\n",xint);
end
printf("\n");
for i=1:n
if x(1)>xint | xint>x(n) then
break
elseif x(i)<xint & xint<x(i+1)
printf("El valor de x=%0.2f se encuentra en el intervalo [%0.2f,%0.2f]\n",xint,x(i),x(i+1));
end
end
//calculo de los factores de interpolacion
//se toma valor inicial 1 porque es un producto
printf("\n");
if x(1)>xint | xint>x(n) then
break
else
printf('\t %s\t\t %s%d%s\t\t %s\t %s\n','x:','P',(n-1),"(x)","Ln(x)","%ERROR")
end
L=ones(x);
for i=1:n
37
for j=1:n
if j<>i then
L(i)=L(i)*(xint-x(j))/(x(i)-x(j));
end
end
end
//calculando el valor a interpolar
suma=0;
for i=1:n
if x(1)>xint | xint>x(n) then
break
else
suma=suma+L(i)*y(i);
end
end
et=((vv-suma)/vv)*100;
if x(1)>xint | xint>x(n) then
printf("No se puede interpolar\n")
break
else
printf('\t%0.2f\t\t%0.6f\t %0.6f\t %0.2f\n',xint,suma,vv,et);
end
printf("\n");
resp=input('Si desea repetir otra opcion del MENU general, precione s/S : ','s');
end//fin del while
endfunction

Codigo Scilab:
Problema 8:
Scilab:

function ocho()

printf('\t\tSolución mediante Interpolación lineal\n');

printf('\tPara este método se necesitará 2 datos como mínimo\n')

//x0 y x1 son los extremos del intervalo que encierran al valor buscado

x0=input('Ingrese el valor de x0: ')

y0=input('Ingrese el valor de y0: ')

x1=input('Ingrese el valor de x1: ')

y1=input('Ingrese el valor de y1: ')

V=input('Valor a interpolar: ')

F=y0+((V-x0)/(x1-x0))*(y1-y0)

printf('Mediante interpolación lineal se tiene que para una T de 27°C la concentración de O es %3.3f\n',F)

endfunction
function ochob()

printf('\t\tInterpolación mediante el polinomio de newton\n')

printf('\tEl valor a interpolar debe estar en un rango cercano x0 y x1\n')

n=input('Ingrese el grado del polinomio: ')

x0=input('Ingrese el valor de x0: ')

f0=input('Ingrese el valor de y0: ')

x1=input('Ingrese el valor de x1: ')

printf('Revisando la tabla de diferencias divididas')

f1=input('Ingrese el valor de f1 de la tabla: ')

f2=input('Ingrese el valor de f2 de la tabla: ')

f3=input('Ingrese el valor de f3 de la tabla: ')

f4=input('Ingrese el valor de f4 de la tabla: ')

f5=input('Ingrese el valor de f5 de la tabla: ')


V=input('Ingrese el valor a interpolar: ')

x=poly(0,'x')

r=((x-x0)/(x1-x0))

F=0

for i=0:n

if i==0

F=F+f0

elseif i==1

F=F+(f1*r)/factorial(i)

elseif i==2

F=F+((f2*r*(r-1))/factorial(i))

elseif i==3

F=F+((f3*r*(r-1)*(r-2))/factorial(i))

elseif i==4

F=F+((f4*r*(r-1)*(r-2)*(r-3))/factorial(i))

elseif i==5

F=F+((f5*r*(r-1)*(r-2)*(r-3)*(r-4))/factorial(i))

end

end

disp(F)

I=horner(F,V)

printf('El valor interpolado para 27°C será de %3.4f\n',I)

endfunction
Tendriamos:

function ochoc()

printf('\t\tMétodo de interpolación por Trazados cúbicos')

printf('Previamente se formarán las ternas y evaluarán las variables')

//x(i-1) y x(i) son los extremos del intervalo que encierran al valor buscado

fx0=input('Ingrese la segunda derivada de x(i-1): ')

fx1=input('Ingrese la segunda derivada de x(i): ')

x0=input('Ingrese el valor de x(i-1): ')

x1=input('Ingrese el valor de x(i): ')

y0=input('Ingrese el valor de f(x(i-1)): ')

y1=input('Ingrese el valor de f(x(i)): ')

V=input('Ingrese el valor a interpolar: ')

F=((fx0)*((x1-V)^3)/(6*(x1-x0)))+((fx1)*((V-x0)^3)/(6*(x1-x0)))+((y0/(x1-x0))-((fx0*(x1-

x0))/6))*(x1-V)+((y1/(x1-x0))-((fx1*(x1-x0))/6))*(V-x0)

printf('El valor interpolado para T=27°C será de %3.4f\n',F)


endfunction

problema 9

Genere ocho puntos igualmente espaciados de la función f(t)= sen 2


.
De t=0 a 2 π. Ajustes estos datos con
a) un polinomio de interpolación de séptimo grado
b) Un trazador cúbico.

a)un polinomio de interpolación de 7 grado

x f(xi) f1(xi) f2(xi) f3(xi) f4(xi) f5(xi) f6(xi) f7(xi)

0 0

0.8975 0.6112 0.6809

1.7995 0.9504 0.3779 0.1688

2.6927 0.1882 0.8491 0.6835 0.1911

3.5903 0.1882 2.1645 0.4730 0.4295 0.1728

4.4879 0.9504 0.8491 0.4730 1.2369 0.1196 0.0651

5.3855 0.6112 0.3779 0.6835 0.4295 0.1196 1.5461 0.0121

6.2831 6.004 0.6809 0.1688 0.1911 0.1728 0.0651 0.0211 0


Código Scilab:
function intern()
printf('interpolacion de una con conjunto de 8 datos para un rango de <0,2π>')
funcion=input('Ingresar la función: ','s')//sin(x)^2
deff('y=fun(x)','y='+funcion)
printf('\n\tIngreso de los datos en la frontera\n')
x(1)=input('Ingresar limite inferior del rango: ')//0
x(8)=input('Ingresar limite superior del rango: ')//2%pi
h=(x(8)-x(1))/(7)
printf('\n\tLos valores exactos evaluados en f(x) son:\n\n')
printf('\n\t\txi\tf(xi)\n')
// Cálculo de los valores reales
for i=1:8
f(i)=fun(x(i))
printf('\n\t%.7f\t%.7f\n',x(i),f(i))
x(i+1)=x(i)+h
end
//generacion de menu
resp='s'
while resp=='s' | resp=='S'
printf('\n\t\tMENU DE OPCIONES\n\n')
printf('\t1.Interpolación de Newton 7\n')
printf('\t2.Interpolación por un splin/trazador cúbico\n')
orden=input('Seleccione el método: ')
switch orden
case 1 then
for i=1:7
dfd1(i)=(f(i+1)-f(i))/(x(i+1)-x(i))
end
for i=1:6
dfd2(i)=(dfd1(i+1)-dfd1(i))/(x(i+2)-x(i))
end
for i=1:5
dfd3(i)=(dfd2(i+1)-dfd2(i))/(x(i+3)-x(i))
end
for i=1:4
dfd4(i)=(dfd3(i+1)-dfd3(i))/(x(i+4)-x(i))
end
for i=1:3
dfd5(i)=(dfd4(i+1)-dfd4(i))/(x(i+5)-x(i))
end
for i=1:2
dfd6(i)=(dfd5(i+1)-dfd5(i))/(x(i+6)-x(i))
end
for i=1
dfd7(i)=(dfd6(i+1)-dfd6(i))/(x(i+7)-x(i))
end
dfd1(8)=0;dfd2(7:8)=0;dfd3(6:8)=0;dfd4(5:8)=0;dfd5(4:8)=0;dfd6(3:8)=0;dfd7(2:8)=0
// tabla de las diferencias divididas infinitas
printf('\n\t xi f(xi) 1DFD 2DFD 3DFD 4DFD 5DFD 6DFD 7DFD\n')
for i=1:8
printf('\n\t%.7f %.7f %.7f %.7f %.7f %.7f %.7f %.7f %.7f
\n',x(i),f(i),dfd1(i),dfd2(i),dfd3(i),dfd4(i),dfd5(i),dfd6(i),dfd7(i))
end
t=poly(0,'t')
53
p(1)=t
for i=2:7
p(i)=p(i-1)*(t-x(i))
end
// Determinación del polinomio de grado 7
printf('\nLa función polinómica de grado siete ajustado es: \n')
poli=f(1)+dfd1(1)*p(1)+dfd2(1)*p(2)+dfd3(1)*p(3)+dfd4(1)*p(4)+dfd5(1)*p(5)+dfd6(1)*p(6)
disp(poli)
case 2 then
d2f_x0=0;d2f_xn=0
// Cálculo de las incógnitas - Matriz ampliada
for i=1:6
x0=x(i); x1=x(i+1); x2=x(i+2)
y0=f(i); y1=f(i+1); y2=f(i+2)
if i==1 // por condicion de trazador natural f''(x0)=0
A(i,i)=2*(x2-x0) ;A(i,i+1)=x2-x1
B(i)=(6/(x2-x1))*(y2-y1)+(6/(x1-x0))*(y0-y1)
elseif i==6 // por condicion de trazador natural f''(xn)=0
A(i,i-1)=x1-x0 ; A(i,i)=2*(x2-x0)
B(i)=(6/(x2-x1))*(y2-y1)+(6/(x1-x0))*(y0-y1)
else
A(i,i-1)=x1-x0 ; A(i,i)=2*(x2-x0) ;A(i,i+1)=x2-x1
B(i)=(6/(x2-x1))*(y2-y1)+(6/(x1-x0))*(y0-y1)
end
end
//Cálculo de las incógnitas mediante metodos matriciales
C=A
C(:,7)=B
for i=1:6
C(i,:)=C(i,:)/C(i,i)
for j=1:6
if i<>j
C(j,:)=C(j,:)-(C(i,:)*C(j,i))
end
end
end
d2f(2:7)=C(:,7);d2f(1)=0;d2f(8)=0
t=poly(0,'t')
for i=1:7
fc(i)=(d2f(i)/(6*(x(i+1)-x(i))))*(x(i+1)-t)^3+(d2f(i+1)/(6*(x(i+1)-x(i))))*(t-x(i))^3+(f(i)/(x(i+1)-x(i))-
d2f(i)*(x(i+1)-x(i))/6)*(x(i+1)-t)+(f(i+1)/(x(i+1)-x(i))-d2f(i+1)*(x(i+1)-x(i))/6)*(t-x(i))
end
printf('\n\tTrazadores cubicos: \n\n')
for i=1:7
if i<>7
printf('\n\tf%d(t)=%s\t\t%.7f<=t<%.7f\n',i,string(fc(i)),x(i),x(i+1))
else
printf('\n\tf%d(t)=%s\t\t%.7f<=t<=%.7f\n',i,string(fc(i)),x(i),x(i+1))
end
end
otherwise
disp('Error en el ingreso de opción')
end
printf('\n')
resp=input('Si desea repetir el programa, presiones s/S: ','s')
end
endfunction

También podría gustarte