Está en la página 1de 18

AJUSTE DE CURVAS

UNIVERSIDAD SURCOLOMBIANA - INGENIERIA ELECTRONICA


Asignatura:
Métodos Numéricos

RAICES DE ECUACIONES

Trabajo aplicaciones sobre ajustes de curvas con spline cúbicos con


matrices tridiagonales.

Presenta:
Sergio Andrés Perdomo Aguirre
20172163214

Shuraldy Garrido Moya


20172162933

Docente
Ing. YAMIL ARMANDO CERQUERA ROJAS MSc.

Neiva, Mayo 17 de 2018


Tabla de contenido

1. Planteamiento del Problema ....................................................................................................... 4


2. Análisis de la situación planteada ................................................................................................ 5
3. Revisión bibliográfica ................................................................................................................... 5
4. Planteamiento de la solución ....................................................................................................... 8
5. Solución del problema.................................................................................................................. 9
6. Conclusiones............................................................................................................................... 13
7. Bibliografía ................................................................................................................................. 13
8. Anexos: Códigos ......................................................................................................................... 13
1. Planteamiento del Problema
En una empresa piscícola, se cultiva tilapia en lagos convencionales, la empresa desea obtener la
fórmula que describe el crecimiento diario del pez durante 36 semanas, por esto deciden sacar una
muestra de peces y pesar semanalmente cada pez.

(Nicovita Tilapia, 2014)


Tabla 1.Crecimiento de Tilapia (cultivo semi-intensivo)

crecimiento del pez promedio


semanas
(gr/día)
1 0,27
2 0,27
3 0,34
4 0,36
5 0,46
6 0,58
7 0,71
8 0,93
9 1,14
10 1,29
11 1,51
12 1,79
13 2,07
14 2,43
15 2,85
16 2,86
17 3,14
18 3,14
19 3,29
20 3,43
21 3,57
22 3,71
23 3,85
24 4
25 4
26 4
27 4,14
28 4,14
29 4,14
30 4,14
31 4,14
32 4,14
33 4,14
34 4,14
35 4,14
36 4,14
2. Análisis de la situación planteada

Luego de la obtención de datos de la Tabla 1.Crecimiento de Tilapia (cultivo semi-intensivo), se


procede a realizar la gráfica, logrando ver el comportamiento del crecimiento de la tilapia. Se
propone realizar el ajuste de curvas del comportamiento del crecimiento de la tilapia por medio
del método spline cubico (matriz tridiagonal).

Crecimiento de Tilapia
4.5

4
CRECIMIENTO DEL PEZ (GR/DIA)

3.5

2.5

1.5

0.5

0
0 5 10 15 20 25 30 35 40
SEMANAS

Ilustración 1. Crecimiento de Tilapia.

3. Revisión bibliográfica
Splines Cúbicos.
Es conocido que una función se puede aproximar mediante una interpolación polinómica así
como también son conocidas algunas técnicas para mejorar dicha aproximación, por ejemplo la
interpolación polinómica a trozos (del grado que sea) o la interpolación de Hermite a trozos en
la que se emplearían no solo los valores de la función sino también los de las derivadas de dicha
función. Esta última interpolación suele proporcionar buenos resultados pues al tener en cuenta
no solo los valores puntuales de la función sino también los valores de las derivadas, se obtiene
una función polinómica a trozos con derivada continua. Hay que observar eso sí, que para
calcular una interpolación de Hermite a trozos se necesita que la función sea derivable hasta el
orden de las derivadas que aparecen (e incluso más regularidad para alcanzar el orden óptimo
de convergencia).
Sin embargo las interpolaciones de Hermite a trozos no son calculables cuando lo que queremos
aproximar es una simple tabla de datos, es obvio que en este caso no podemos hablar de
derivadas. En esta situación lo que viene a ser de utilidad son los polinomios interpoladores a
trozos conocidos como Splines cúbicos (en adelante solamente Splines) que no son más que
funciones interpoladoras a trozos en los que, además de los valores de la tabla (o de la función),
se aplican unas condiciones de compatibilidad en los nodos comunes de sub–intervalos
adyacentes que lleva a una construcción similar a la de los polinomios interpoladores de Hermite
a trozos.

Una forma para la construcción de del Spline cúbico con matriz tridiagonal es la siguiente:
Aplicando las condiciones de continuidad del Spline S y de las derivadas primera S' y segunda
S'', es posible encontrar la expresión analítica del Spline.
Suponga:
𝑥1 < 𝑥2 < 𝑥3 < ⋯ < 𝑥𝑛 𝑓𝑖 = 𝑓(𝑥𝑖 )
ℎ𝑖 = 𝑥𝑖+1 − 𝑥𝑖
Para
𝑖 = 1,2, … , 𝑛 − 1
Sea 𝑆𝑖 (𝑥) la restricción de 𝑆(𝑥) a [𝑥𝑖 , 𝑥𝑖+1]. Si 𝑆𝑖 (𝑥) es cúbico entonces 𝑆𝑖′′ es lineal, tal que si
𝑆𝑖′′(𝑥𝑖 ) = 𝑧𝑖 y 𝑆𝑖′′(𝑥𝑖+1) = 𝑧𝑖+1, se puede escribir:

O se puede considerar como:

Integrando dos veces la Ecuación 1, la expresión resultante es:


Si se procede a integrar para el caso de la Ecuación 2, la expresión resultante sería:

Esto garantiza que 𝑆(𝑥) es continua y coincide con 𝑓 en todos los puntos 𝑥𝑖,𝑖=1,2,...,𝑛

Se definen los polinomios cúbicos que forman la función Spline cúbica S, como:

En la expresión mostrada como Ecuación 3, ℎ𝑖=(𝑥𝑖+1−𝑥𝑖) y el conjunto de {𝑧0,𝑧1,...,𝑧𝑛} son


incógnitas. Para determinar sus valores, se utilizan las condiciones de continuidad que deben
cumplir estas funciones. El resultado es:

La Ecuación 4, con 𝑖=1,2,..,𝑛−1 genera un sistema de 𝑛−1 ecuaciones lineales con 𝑛+1
incógnitas 𝑧0,𝑧1,𝑧2,…,𝑧𝑛, Se puede elegir 𝑧0 y 𝑧𝑛 de forma arbitraria y resolver el sistema de
ecuaciones resultante para obtener los valores de 𝑧1,𝑧2,…,𝑧𝑛−1. Una elección especialmente
adecuada es hacer 𝑧0=𝑧1=0. La función Spline resultante se denomina Spline cúbico natural y
el sistema de ecuaciones lineal expresado en forma matricial es:
El sistema visto como una ecuación de la forma 𝑚∗𝑧=Δ𝑖, sería:

En donde:

También podemos usar para hallar los coeficientes tomando en cuenta esta ecuación.

4. Planteamiento de la solución
Se pretende realizar un código en lenguaje c++ utilizando dev c++ 5.11 para que por medio del pc
se puedan hallar los coeficientes de los trozos de la función spline cubica que describe el
comportamiento del crecimiento de la tilapia. Para ello se aplica el método enseñado en clase y
el cual se puede encontrar en el libro (Cerquera Rojas, MATRICES TRIDIAGONALES SPLINES
CÚBICOS, 2017). Del ingeniero Yamil Armando Cerquera. Para realizar el código se usa como base
uno suministrado por el ingeniero nombrado anteriormente.

Se ejecuta el programa diseñado para hallar los coeficientes y la matriz.


5. Solución del problema

Ilustración 3. tabla de datos obtenida por el codigo C++

Ilustración 2. Resultados obtenidos con el código C++


coeficientes de los trozos de spline cubica:

Ilustración 4.coeficientes de los trozos de spline cubica triadiagonal.


Matriz de datos:

Ilustración 5.Matriz de datos


obtenida por el código en lenguaje
C++
Obteniendo estos datos, se ingresan al Scilab y se genera la gráfica del spline cubico

Ilustración 6. Resultados obtenidos Scilab, crecimiento de tilapia

(Scilab, Version 6.0.1)


6. Conclusiones
 Las implementaciones de los métodos de ajuste de curvas spline cubicas solucionadas con
matrices tridiagonales son muy útiles en el análisis de datos experimentales ya que gracias
a estos métodos podemos interpolar cualquier dato en el dominio del tiempo de los datos y
a su vez obtener ecuaciones que describen dicho comportamiento.
 Este método de ajuste de curva es mucho más preciso, pero requiere un poco más de
conocimiento para su uso.
 El código que se generó gracias a este programa nos permite conocer el peso promedio de
cada pez (tilapia) en cualquier instante de tiempo, (cualquier día o semana), siendo así una
ventaja muy grande para dichos productores que desean saber o medir las condiciones de
sus cultivos.
 El pc es una herramienta muy importante en el análisis de datos ya que por medio del
lenguaje universal de programación (C++) se pueden hacer códigos donde al ejecutarlos
realizan operaciones rápidamente ahorrando tiempo y dinero.

7. Bibliografía

Cerquera Rojas, Y. A. (2017). MATRICES TRIDIAGONALES SPLINES CÚBICOS. Neiva, Huila, Colombia:
Universidad Surcolombiana.

Nicovita Tilapia. (2014). Manual de Crianza de Tilapia. Manual, Lima, Av. Argentina 4695 Carmen
de la Legua - Callao 3. Obtenido de
http://www.industriaacuicola.com/biblioteca/Tilapia/Manual%20de%20crianza%20de%20
tilapia.pdf

Scilab. (Version 6.0.1).

8. Anexos: Códigos
#include <iostream>

#include <math.h>

//#include <h://metodos//datos.txt>

/* run this program using the console pauser or add your own getch, system("pause") or
input loop */

#define PI 3.1415924

FILE *arc;

#define z1 36
long double
x[z1]={1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,3
1,32,33,34,35,36};

long double
yc[z1],y[z1]={0.27,0.27,0.34,0.36,0.46,0.58,0.71,0.93,1.14,1.29,1.51,1.79,2.07,2.43,2.85,2.8
6,3.14,3.14,3.29,3.43,3.57,3.71,3.85,4,4,4,4.14,4.14,4.14,4.14,4.14,4.14,4.14,4.14,4.14,4.1
4,};

long double
hi[z1],delta[z1],sum[1000],o[500][500],m[500][500],v[500],ti[500],A,B,C,D,P,Q,PF;

void cmatriz();void ematriz();void rmatriz();void cterind();void eterind();

void exy();void enc_var();void esc_var();void lim_arc();void enc_coe();

int i,j,f,c,n,N,tm;

long PE;

long double s,a,b,ym;

int main()

{ system("color f5");

n=sizeof x / sizeof *x; //Numero de terminos del vector

tm=n-2;

lim_arc();

cmatriz();exy();

ematriz(); // calcula y escribe la matriz con base en los


terminos independientes

cterind();eterind(); // calcula terminos independientes


y los escribe

rmatriz();ematriz();eterind();

enc_var();esc_var();enc_coe();

return 0;

void lim_arc()

{ arc=fopen("C:/Users/MELISSA SERRATO/Downloads/metodos (1)/matriz.txt","w");

fclose(arc);

void exy()

{ long double sx=0,sy=0;

printf("El numero de terminos es : %d\n",n);


int w=1;printf("\nDatos Discretos\n x y h(i) delta(i)\n");

while (w<=n)

{ printf("%6.1Lf \t %9.5Lf \t %9.5Lf \t %9.5Lf\n",x[w-1],y[w-1],hi[w-1],delta[w-1]);

sx+=x[w-1];sy+=y[w-1];

w++;

ym=sy/n;

printf("\nEx=%7.4Lf Ey=%7.4Lf YMedia %7.4Lf \n",sx,sy,ym);

void cterind() //Calcula terminos independientes

{ i=1;

while (i<=n-2)

{ ti[i-1]=6*(delta[i]-delta[i-1]);

i++;

void eterind()

{ i=1;printf("\n Ter ind =");

arc=fopen("C:/Users/MELISSA SERRATO/Downloads/metodos
(1)/matriz.txt","a");fprintf(arc,"\nti=[\n");

while (i<=n-2)

{ printf("\n%20.5Lf ",ti[i-1]);

fprintf(arc,"%20.5Lf\n",ti[i-1]);

i++;

fprintf(arc,"];");

fprintf(arc,"\n v=inv(m)*ti");

fclose(arc);

}
void cmatriz()

{ int i=1;

while (i<=n-1)

{ hi[i-1]=x[i]-x[i-1];

delta[i-1]=(y[i]-y[i-1])/hi[i-1];

i++;

i=1;

while (i<=n-2)

{ m[i-1][i-1]=2*(hi[i-1]+hi[i]);

m[i-1][i]=hi[i];

m[i][i-1]=hi[i];

i++;

void ematriz()

{ f=1;printf("\nLa matriz del spline es:\n",N);

arc=fopen("C:/Users/MELISSA SERRATO/Downloads/metodos
(1)/matriz.txt","a");fprintf(arc,"m=[\n");

while (f<=n-2)

{ c=1;

while (c<=n-2)

{ printf("%7.2Lf ",m[f-1][c-1]);

fprintf(arc,"%7.2Lf ",m[f-1][c-1]);

c++;

//printf("%20.4Lf ",ti[f-1]);

printf("\n");fprintf(arc,"\n");

f++;

}
fprintf(arc,"];");

fclose(arc);

void rmatriz()

{ int f,c;

long double is,ii,ds,di,det; //para tomar los valores para el


determinante;

int k=0;

while (k<=tm-1) //N-1)

{ f=k+1;

while (f<=tm)

{ c=k;is=m[k][k];ii=m[f][k]; //printf("\n %Lf \n %Lf\n",is,ii);

while (c<=tm)

{ ds=m[k][c];di=m[f][c]; //printf("\n %Lf \n %Lf\n",ds,di);

det=is*di-ii*ds;

if (k==0) m[f][c]=det;

else m[f][c]=det/m[k][k];

c++;

ds=ti[k];di=ti[f];det=is*di-ii*ds;

if (k==0) ti[f]=det;

else ti[f]=det/m[k][k];

f++;

k++;

void enc_var()

{ long double s,temp;

int k,i=n-3;v[0]=0;v[n-1]=0;

while (i>=0)

{ s=0;
j=i+1;

while (j<=n-3)

{ s=s+m[i][j]*v[j+1];

j++;

temp=(ti[i]-s)/m[i][i];

v[i+1]=temp;

i--;

void esc_var()

{ int j=1;printf("\nLos valors de las variables son:");

while (j<=n)

{ printf("\nv[%d]=%10.3Lf",j-1,v[j-1]);

j++;

void enc_coe()

{ long double ai,bi,ci,di;

int j=1;printf("\nLos valors de las variables son:");

while (j<=n-1)

{ ai=(v[j]-v[j-1])/(6*hi[j-1]);

bi=v[j-1]/2;

ci=delta[j-1]-(2*v[j-1]+v[j])*hi[j-1]/6;

di=y[j-1];

printf("\n a[%d]=%8.3Lf b[%d]=%8.3Lf c[%d]=%8.3Lf d[%d]=%8.3Lf",j-1,ai,j-1,bi,j-1,ci,j-


1,di);

j++;