Beruflich Dokumente
Kultur Dokumente
INTRODUCCIN
CAPITULO I
JUSTIFICACIN
CAPITULO II
PROCESOS DEL TRABAJO
6
1 - ECUACIONES LINEALES
1.1.- Definicin y clasificacin
11
1.2.3.- Pseudocdigo
13
1.2.4.- Programas en C
13
15
16
17
19
1.3.3.- Pseudocdigo
20
1.3.4.- Programas en C
21
23
25
25
28
1.4.3.- Pseudocdigo
30
1.4.4.- Programas en C
32
33
34
34
2.2.- Biseccin
35
36
39
2.2.3.- Pseudocdigo
40
2.2.4.- Programas en C
41
42
43
45
47
2.3.3.- Pseudocdigo
48
2.3.4.- Programas en C
49
51
2.4.- Newton-Raphson
52
53
55
2.4.3.- Pseudocdigo
56
2.4.4.- Programas en C
56
57
58
58
3.2.- Euler
59
60
64
3.2.3.- Pseudocdigo
65
3.2.4.- Programas en C
66
67
68
3.3.-Runge-Kutta
3.3.1.- Ejemplo propuesto
69
71
3.3.3.- Pseudocdigo
72
3.3.4.- Programas en C
74
75
4 - INTEGRACIN
76
76
76
77
80
4.2.3.- Pseudocdigo
81
4.2.4.- Programas en C
82
83
COSTOS
84
CAPITULO III
APORTACIONES Y CONTRIBUCIONES AL DESARROLLO
86
BIBLIOGRAFA
87
ANEXOS
88
INTRODUCCIN
Los mtodos numricos son tcnicas mediante las cuales es posible resolver
problemas mediante el uso de operaciones aritmticas. Este manual tiene como
meta dejar plasmados los mtodos ms importantes que abarca la experiencia
educativa de mtodos numricos para la solucin de sistemas de ecuaciones
lineales, no lineales y a su vez de derivadas e integrales. Cabe destacar que el
objetivo fundamental de este trabajo es ofrecer una gua prctica para que los
estudiantes puedan seguir paso a paso la elaboracin de los programas desde el
desarrollo de los algoritmos a travs de los diagramas de flujo hasta la realizacin
del cdigo fuente pasando por las etapas de compilacin y ejecucin exitosa del
programa.
CAPITULO I
JUSTIFICACIN
La funcin principal de este trabajo, ser proporcionar al alumno las bases para
conocer y aplicar los fundamentos de los mtodos numricos para la solucin de
problemas de ingeniera, implementando diversos algoritmos a travs de un
lenguaje de programacin como el Lenguaje C y de esta manera obtener por
consecuencia programas que permitan mejorar el entendimiento de los mtodos
numricos.
CAPITULO II
PROCESO
DEL
TRABAJO
1 - ECUACIONES LINEALES
1.1.- Definicin y clasificacin
En este captulo estudiaremos las tcnicas de solucin de sistemas de ecuaciones
lineales cuadrados Ax = b.
Un sistema de ecuaciones lineales, tambin conocido como sistema lineal de
ecuaciones o simplemente sistema lineal, es un conjunto de ecuaciones lineales
sobre un cuerpo o un anillo conmutativo.
El problema consiste en encontrar los valores desconocidos de las variables x 1, x 2 y
X3 que satisfacen las tres ecuaciones.
Para establecer la velocidad de clculo y el "trabajo computacional" en los mtodos
directos, se analiza el nmero de operaciones de stos y con base en ello se
determinan sus necesidades de memoria. Como consecuencia de lo anterior, se da
particular atencin a los sistemas especiales: simtricos, bandeados y dispersos,
entre otros. As, estudiaremos los mtodos que aprovechan estas caractersticas
para lograr reducir con esto el nmero de operaciones y los requerimientos de
mquina.
Posteriormente se exponen y se desarrollan tres mtodos numricos aplicados a las
ecuaciones lineales como son: Gauss Simple, Gauss Seidel y Gauss Jordan.
Dado que el mundo real puede verse como un grupo de objetos o partes trabajando
en conjunto o bien conectadas de alguna manera formando un todo, brindar al
alumno una mejor comprensin de la extraordinaria cantidad de situaciones que
pueden representarse con los sistemas o grupos de ecuaciones donde cada una de
ellas corresponde a alguna de sus partes, por ejemplo: en circuitos, estructuras.
anx1+a12x2+a13x3+....+a1nxn=b1
(Ec. 1.1a)
a21x1+a22x2+a23x3+....+a2nxn=b2
(Ec. 1.1b)
an1x1+an2x2+an3x3 + . + annxn=bn
(Ec. 1.1c)
11
(Ec. 1.2)
22x 2 + - + 2nx n = b 2
Donde el superndice prima indica que los elementos han cambiado sus valores
originales
a ll
a 12
a 13
c P
a 21
a 22
a 23
C2
a 31
a 32
a 33
C3
J
>
l
a ll
a 12
a 13
Cl
a 22
a 23
c '2
x3 = c
x2 =
X1 =
33
3/
Eliminacin
hacia adelante
C ^3
33
( c 23x 3 ) / a 22
>
Sustitucin
hacia atrs
( C1 ~ a 12x 2 ~ a 13x 3 ) / a ll
Figura 1.1
(Ec. 1.3a)
a'22X2+a'23X3+....+a'2nXn=b'2
(Ec. 1.3b)
a'32X2+a'33X3+--.+a'3nXn=b'3
(Ec. 1.3c)
(Ec. 1.3d)
En los pasos anteriores, la ecuacin (Ec. 1.1a) se llama la ecuacin pivote, y a11 se
denomina el coeficiente o elemento pivote. Observe que el proceso de multiplicacin
del primer rengln por
es equivalente a dividirla entre
y multiplicarla por
a21. Algunas veces la operacin de divisin es referida a la normalizacin. Se hace
esta distincin porque un elemento pivote cero llega a interferir con la normalizacin
al causar una divisin entre cero. Ms adelante se regresar a este punto
importante, una vez que se complete la descripcin de la eliminacin de Gauss
simple.
Ahora se repite el procedimiento antes descrito para eliminar la segunda incgnita
en las ecuaciones (Ec. 1.3c) hasta (Ec. 1.3d). Para realizar esto, multiplique la
ecuacin (Ec. 1.3b) por a '32/ a'22 y reste el resultado de la ecuacin (Ec. 1.3c). Se
realiza la eliminacin en forma similar en las ecuaciones restantes para obtener.
a11X1+a12X2+a13X3+....+a1nXn=b1
a'22X2+a'23X3+--.+a'2nXn=b'2
a"33X3+...+a"3nXn=b"3
Donde el superndice biprima indica que los elementos se han modificado dos
veces.
El procedimiento puede continuar usando las ecuaciones pivote restantes. La ltima
manipulacin en esta secuencia es el uso de la (n - 1) sima ecuacin para eliminar
el trmino xn_ xde la n-sima ecuacin. Aqu el sistema se habr transformado en un
sistema triangular superior
d
)
.4
c.
E
(n -1)
n
Yn = b
unn
u n(n " x)
(Ec. 1.4a)
(Ec.
(Ec.
)b c)
.4 .4
(Ec.1.5)
(Ec.1.6)
(Ec.1.7)
0.1x2
0.2x 3 = 7.8 5
(Ec.1.8)
(Ec.1.9)
(Ec.1.10)
- 0 .l x 2
- 0 .2x 3 = 7.8 5
(Ec.1.11)
(Ec.1.12)
(Ec.1.13)
Ahora se pueden resolver estas ecuaciones por sustitucin hacia atrs. En primer
lugar, de la ecuacin (Ec.1.13) se despeja x3
x 3 = too843 = 7.00 00 3
10.0200
(Ec.1.14)
v
'
7 .0 0 3 33
(Ec.1.15)
v
'
7.85
+ 0.1(2.50000) + 0.2(7.00003)
-----------^ -------- ------------ - = 3.00000
10
11
12
1.2.3.- Pseudocdigo
a) DO k = 1, n - 1
DO i = k + 1, n
factor = ax(k / ak kk
DO j = k + 1 to n
aij = aij - factor . akj
en d do
bi = bi - factor k
END DO
END DO
b) xn _ bn/ an,n
DO i=n-1, 1,-1
sum = O
DO j = i + 1, n
sum = sum + aij . Xj
END DO
xi = (bi - sum) / ai i
END DO
1.2.4.- Programas en C
Gauss Simple
#include <math.h>
#include <stdio.h> /*para printf(),scanf()*/
#include <conio.h> /*para getch(),clrscr()*/
//#include <stdlib.h>/*para exit()*/
//#include <dos.h>
#define NUMEL
20
#define INTERVALOS 0
float A[25][25], B[25], S[25],X[25];
MAIN
printf("\n METODO DE GAUSS SIMPLE");
printf("\n Numero de Ecuaciones = ");
scanf("%d",&n);
printf("\n Inserte cada uno de los coeficientes\n");
for(i= 1;i<=n;ii++)
printf("\n Fila
il %d \n",i);
for(j=1 ;j<=n;';j++)
{
printf("
(" Inc
Ingrese A(%d,%d) = ",i,j);
scanf("%f^',&A[i][jj);
("%f",
}
}
printf("\n Inserte cada uno de los terminos independientes\n");
for(i= 1;i<=n;i++){
{
printf(" Ingrese B(%d) = ",i);
scanf("%f^',&B[i]);
13
*/
*er = 0 ;
for (i= 1;i<=n;i++){
~[il = abs(AN][1]);
for(j=2 ;j<=n;j++)
14
cada
B<1)
B<2)
B<3>
15
[A]{x} = {B}
Suponga que se limita a un conjunto de ecuaciones de 3 x 3. Si los elementos de la
diagonal no son todos cero, la primera ecuacin se puede resolver para X1 la
segunda para
y la tercera para , para obtener
X1 = b a12x2- ai 3x3
an
(Ec.1.16a)
(Ec.1.16b)
a22
(Ec.1.16c)
a3 3
Dn
^a.i
xi~xi
100% < ,
(Ec.1.17)
son
Solucin. Primero, despeje la incgnita sobre la diagonal para cada una de las
ecuaciones.
(Ec.1.18a)
x2 =
(Ec.1.18b)
x 3 = 71.4- 0.3X1+0.2X2
(Ec.1.18c)
xx =
7.85
+ 0+ 0
-------- = 2.616667
17
en la
10
=
5
= g g1%
=
I u
2.990557
100% = 12.5%
Para x 2 y x 3, los errores estimados son |a<2| = 11.8% y |a3 | = 0.076%. Observe
que, como cuando se determinaron las races de una sola ecuacin, las
formulaciones como la ecuacin (Ec.1.17) de Error relativo porcentual, usualmente
ofrecen una valoracin conservativa de la convergencia. As, cuando estas se
satisfacen aseguran que el resultado se conozca con al menos, la tolerancia
especificada por .
18
cHiilKiHln
19
1.3.3.- Pseudocdigo
SUBROUTINE Gseid (a, b, n, x, imax, es, lambda)
DO i = 1,n
dummy = aii
DO j = 1,n
ai,j = ai,j / dummy
END DO
bi = ai / dummy
END DO
DO i = 1, n
sum = bi
DO j = 1, n
IF i * j THEN sum =sum - ai,j *Xj
END DO
xi = sum
END DO
iter =1
DO
centinela = 1
DO i = 1, n
old = xi
sum = bi
DO j = 1, n
IF i * j THEN sum =sum - ai,j *Xj
END DO
xi = lambda * sum +( 1 - lambda) * old
IF centinela = 1 AND x 1 * 0 . THEN
ea=ABS (( xi -old) / xi )*100.
IF ea > es THEN centinela = 0
END IF
END DO
iter = iter + 1
IF centinela = 1 OR (iter > I max) EXIT
END DO
END Gseid
20
1.3.4. - Programas en C
GAUSS SEIDEL
#include <stdio.h>
#include <math.h>
#include <iostream.h>
#include <conio.h>
#define L 10
#define P L
MAIN
cout<<"\n\n METODO DE GAUSS SEIDEL ";
cout<<"\n\n Numero de incognitas Posibles en el sistema: ";
scanf("%d",&n);
Gauss Seidel(n);
titulo(nj;
resultados();
cout<<"\n\nLos resultado son ";
for(x= 0 ;x<n;x++)
{
^
RESULTADOS[x]=X[x];
cout<<"\nX["<<x<<"]= "<<RESULTADOS[x];
getch();
void resultados()
{
int q=0,i=1,t=3,s=n,r=0;
int sw=0 ,w=0 ,ite=0 ,h=0 ;
while((sw==0 )&&(w<20 ))
{
h=0 ;
while(h<n)
{
if(tabla[r]==tabla[r+s])
cont++;
if(cont==n)
sw= 1;
r++;
s++;
h++;
ite++;
w++;
w=ite-1;
for(int j= 0 ;j<w;j++)
{
t=t+2 ;
if((i% 10==0 ))
{
textcolor(LIGHTRED+BLINK);
gotoxy(5,t-2);
cprintf("\n\n Presione una tecla para ingresar ala tabla!!! ");
textcolor(GREEN);
clrscr();
t=5;
titulo(n);
gotoxy(15,t);cout<<i<<"0";
int y=20 ,z=0 ;
for(int r=0 ;r<n;r++)
21
gotoxy(y+z,t);cout<<tabla[q];
q++;
z=z+ 10 ;
>++;
>
>
void main()
22
Numero de incgnitas
A[ 0 H 0 ] = 3
A C 0 H 1 ] = -0.1
A[ 0 H 2 ] = -0.2
Y la constante CC01 s
ft[l][0] = 0.1
AC 1 H 1 ] * 7
AC 1 H 2 ] * -0.3
V la constante C [1] =
A [2][0] = 0.3
A [2][1 ] * -0.2
A C21C2 ] = 10
Y la constante CC21 =
Posibles en el sistena: 3
7.85
-19.3
71.4
23
XI
X2
X3
2.61667
-2.79452
7.00561
2.99056
-2.49962
7.00029
3.00003
-2.49999
-2.5
-2.5
-2.5
X [2 3= 7
24
a 12
a 13
Cl
a 21
a 22
a 23
c2
a 31
a 32
a 33
C3
fi
\
0
0
0
1
0
0
0
1
-7 1
-71
-71
-71
x2
2
3
Cn 2
v
Figura 1.2
0.1
-0.2
-0.3
10
-19.3
71.4
25
0.1
0.3
-0.3
-0.2
-19.3
10
71.4
El trmino
se elimina del segundo rengln restando 0.1 veces al primer rengln del
segundo. En forma similar, restando 0.3 veces el primer rengln del tercero, se
eliminar el trmino
del tercer rengln:
1
-0.0333333 -0.066667
7.00333
-0.190000
2.61667
-0.293333 -19.5617
10.0200
70.6150
1
0
-0.0333333
1
-0.190000
-0.066667
2.61667
-0.0418848 - 2.79320
10.0200
70.6150
1
0
0
0
1
0
-0.0680629
-0.0418848
10.01200
2.52356
-2.79320
70.0843
0 -0.0680629
2.52356~^
-0.0418848 -2.79320
7.00003 ^
26
1 0 0
3.00000
0 1 0
-2.50001
0 0 1
7.00003
27
/
\
c
\
GAUSS (N,M ,A) /
y
I (A (I,M ),I= 1N )
28
SUBROUTINE
GAUSS
(N,M,A)
I
I,PIVOTE,A,J,K,N,
M,CERO
29
1.4.3.- Pseudocdigo
30
END DO
END Substitute
31
1.4.4.- Programas en C
GAUSS JORDAN
#include <math.h>
#include <stdio.h> /*para printf(),scanf()*/
#include <conio.h> rp ara getch(),clrscr()*/
//#include <stdlib.h>/*para exit()*/
//#include <dos.h>
#define NUMEL
20
#define INTERVALOS 0
float A[25][25], B[25], S[25],X[25];
MAIN
printf("\n METODO DE GAUSS JORDAN);
printf("\n\n Ingrese el numero de incognitas \n\n Numero de Ecuaciones = ");
scanf(M%dM,&n);
printf('\n Inserte cada uno de los coeficientes\n");
for(i= 1;i<=n;i++)
{
printf("\n Fila %d \n",i);
or(j=
for(j
=11;j<=n+
;<=r 1;j++)
{
printf(" Ingrese
Ingre: a(%d,%d) = ",i,j);
scanf("%f^^,&a[i][jj);
("%f",
m=n+1 ;
do
{
if<a[ 1j[ 1f r= =m0-)1 ;
for(i=2 ;i<=k;i++)
{if(a[i][1l= 0 )
{for(j=1 ;j<=m;j++)
{
apoyo=a[i][j];
a[iir^l=a[1]];
a[ 1][j]=apoyo;
else
{for(j=2 ;j<=mjj++)
{for(i=2 ;i<=n;i++)
{b[i-1 ][j-1]=a[i][j]-a [1][j]*a[i][1]/a[1][1];}
for(j=2 ;j <=m;j++)
{b[n][j-1 ]=a [1][j]/a [1][1];}
m=m-1;
for(j=1 ;j<=m;j++)
{for(i=1 ;i<=n;i++)
}
{a[i][j]=b[i][j];}
while(m> 1);
printf("\n\n RAICES DEL SISTEMA\n ");
for(i= 1;i<=n;i++)
{printf("\n X(%d) = %1.4f",i,a[i][1]);}
printf("\n\n Fin del programa");
getch();
} }
32
METODO DE GAUSS-JORDAN
Ingrese el numero de incgnitas
Numero de Ecuaciones =
Fila 1
Ingrese
Ingrese
Ingrese
Ingrese
a<ll>
a<l2>
a<l,.3>
a<l4>
=
=
=
=
3
-.1
-.2
7.85
Fila 2
Ingrese
Ingrese
Ingrese
Ingrese
a<2,l>
a<22>
a<23>
a<24>
=
=
=
=
.1
7
-.3
-19.3
Fila 3
Ingrese
Ingrese
Ingrese
Ingrese
a<3l>
a<3J.2)
a<33>
a<34>
=
=
=
=
0
-.2
10
71.4.
2 - ECUACIONES NO LINEALES
2.1.- Definicin y tipos de ecuaciones no lineales
En este captulo estudiaremos diversos mtodos para resolver ecuaciones no lineales
en una incgnita / (x) = 0 , aprovechando los conceptos bsicos del clculo y las
posibilidades grficas y de cmputo de la tecnologa moderna. Sistemticamente a la
interpretacin grfica de los mtodos, a fin de mostrar visualmente su funcionamiento y
de enriquecer las imgenes asociadas con ellos; de igual manera, se generan tablas
en la aplicacin de cada tcnica para analizar el comportamiento numrico y
eventualmente detener el proceso.
Se ha organizado el material como mtodos de uno y dos puntos, de los segundos el
de posicin falsa. Esto, junto con el concepto de orden de convergencia, nos permitir
tener los elementos suficientes para seleccionar la tcnica ms adecuada para una
situacin dada. Finalizamos el captulo con las tcnicas para resolver ecuaciones
polinomiales. El propsito de este captulo es que el estudiante cuente con los
elementos bsicos, computacionales y de criterio, apropiados para resolver el
problema algebraico clsico de encontrar las races reales y complejas de la ecuacin
, en donde las tcnicas algebraicas de "despejar" la incgnita no sean
aplicables, como es el caso de cosx - 3x = 0 o ex - 3x = 0, o bien resulten imprcticas.
Por ltimo, es importante sealar lo difcil que resulta pensar en un tpico de
matemticas o ingeniera que no involucre ecuaciones de esta naturaleza.
La solucin de este sistema consta de un conjunto de valores
hacen que todas las ecuaciones sean iguales a cero.
que simultneamente
Presentamos los mtodos, para el caso en que las ecuaciones simultneas son
lineales, es decir, que se puedan expresar en la forma general
f(x) =
+ a2x 2 + + anxn - b = 0
34
2.2.- Biseccin
Al aplicar las tcnicas grficas se observa que f(x) cambia de signo a ambos lados
de la raz. En general, si f(x) es real y contina en el intervalo que va desde X[ hasta
y
y
tienen signos opuestos, es decir,
f (*i) f ( * ) < 0
(Ec.2.1)
Paso I : Elija valores iniciales inferior, xl( y superior xJ( que encierren la raz, de forma tal
que la funcin cambie de signo en el intervalo Esto se verifica comprobando
que fa j /(xy) < 0.
Paso 2: Une aproximacin de la raz xr se determina mediante:
*i + \
bl
c|
Figura 2.1
35
Figura 2.2
12 + 16
Xr
14
36
que es mayor a cero y, por lo tanto, no ocurre cambio de signo entre el lmite
inferior y el punto medio. En consecuencia, la raz debe estar localizada entre 14 y
16.
Figura 2.3
37
Por lo tanto, la raz est entre 14 y 15. El lmite superior se redefine como 15 y la
raz estimada para la tercera iteracin se calcula as:
14+15
. . r
xr = ------ = 14.5
38
39
2.2.3.- Pseudocdlgo
FUNCTION Bisect(xl, xu, es, imax, xr, iter, ea)
iter = 0
fl = f(xl)
DO
xrold = xr
xr = (xl + xu) / 2
fr = f( xr )
iter = iter + 1
IF xr * 0 THEN
ea = ABS((xr - xrold) / xr) * 100
END IF
test = fl * fr
IF test < 0 THEN
xu = xr
ELSE IF test > 0 THEN
xl = xr
fl= fr
ELSE
ea = 0
END IF
IF ea < es OR iter > imax EXIT
END DO
Bisect = xr
END Bisect
4G
2.2.4.- Programas en C
BISECCIN
#include <math.h>
#include <stdio.h> /*para printf(),scanf()*/
#include <conio.h> /p a ra getch(),clrscr()*/
//#include <stdlib.h>/*para exit()*/
//#include <dos.h>
#define NUMEL
20
#define INTERVALOS 0
float A[25][25], B[25], S[25],X[25];
printf("\n METODO DE BISECCION\n");
printf( " Teclea valor minimo = ");
scanf("%f",&xmin);
printf("\n");
printf( " Teclea valor maximo = ");
scanf("%f",&xmax);
printf("\n");
printf( " Teclea valor de error esperado = ");
scanf("%f",&error);
printf("\n");
printf( " Teclea iteraciones maximas = ");
scanf("%f",&iteraciones);
printf("\n");
c1 = Bisect(xmin, xmax, error, iteraciones);
printf( " Resultado = %f", c1);
^
getch();
METODO DE BISECCION
Teclea valor ninino * 12
Teclea valor naxino = 16
METODO DE BISECCION
Teclea valor ninino = 12
Teclea valor naxino = 16
Teclea valor de error esperado = S.3
Teclea iteraciones naxinas = 3
42
(Ec 2 2)
( . . )
en el cual se despeja
_
xu
f ( Xu ) ( X l
Xu )
f(x)-f(xu)
r
/p _
ry q \
(Ec. 2.3)
43
Figura 2.4
~ / (* u )] = Xu / (X ) -
X j/ ( X U)
(Ec. 2.3a)
f(X !)-f(X u )
'
sta es una de las formas del mtodo de la falsa posicin. Observe que permite el
clculo de la raz xr como una funcin de los valores iniciales inferior x y
superior
. sta puede ponerse en una forma alternativa al separar los trminos:
_
xuf(xQ_______ x jf(x u)
Xr f(x j) - f(x u)
f(x j) - f(x u)
X u f(Xj)
Xr = X + '
f(x j) - f(x u)
X j f (x u)
f(Xj) - f(x u)
44
xuf(xu)
xu +
f(xj) - f(xu)
X[f(xu)
f(Xj) - f(xu)
f(xu)(xi - x u)
f(xj) - f(xu)
La cual es la misma ecuacin (Ec. 2.3). Se utiliza esta forma porque implica una
evaluacin de la funcin y una multiplicacin menos que la ecuacin (Ec. 2.3a).
f(x j) = 6.0699
x u =16
f(xu) = -2.2688
-2.2688(12 - 16)
= 1 6 ---------------- ----------- =1 49113
r
6.0669 - (-2.2688)
'
f(x j ) = 6.0699
x u= 14.9113
f (xu) = -0.2543
xr = 14.9113 r
-0.2543(12-14.9113)
= 14.7942
6.0669 - (-0.25439
45
el cual tiene errores relativos y verdadero y aproximado de 0.09 y 0.79 por ciento.
Es posible realizar iteraciones adicionales para hacer una mejor aproximacin de
las races.
Se obtiene una idea ms completa de la eficiencia de los mtodos de biseccin y
de falsa posicin al observar la figura 3.5 donde se muestra el error relativo
porcentual verdadero de los ejemplos 3.3 y 3.3.1. Observe cmo el error decrece
mucho ms rpidamente en el mtodo de la falsa posicin que en el de la
biseccin, debido a un esquema ms eficiente en el mtodo de la falsa posicin
para la localizacin de races.
Recuerde que en el mtodo de biseccin el intervalo entre
y
se va
haciendo ms pequeo durante los clculos. Por lo tanto, el intervalo, como se
define para la primera iteracin, proporciona una medida del error en este mtodo.
ste no es el caso con el mtodo de la falsa posicin, ya que uno de los valores
iniciales puede permanecer fijo durante los clculos, mientras que el otro converge
hacia la raz. Como en el caso del ejemplo, el extremo inferior xi permanece en 12,
mientras que xi converge a la raz. En tales casos, el intervalo no se acorta, sino
que se aproxima a un valor constante.
Figura 2.5
46
47
2.3.3.- Pseudocodigo
END DO
modFalsepos = xr
END Modfalsepos
48
2.3.4.- Programas en C
#include <math.h>
#include <stdio.h> /*para printf(),scanf()*/
#include <conio.h> /*para getch(),clrscr()*
//#include <stdlib.h>/*para exit()*/
//#include <dos.h>
#define NUMEL
20
#define INTERVALOS 0
float A[25][25], B[25], S[25],X[25];
MAIN
printf("\n METODO DE FALSA POSICION\n");
printf( " Teclea valor minimo = ");
scanf("%f",&xmin);
printf("\n");
printf( " Teclea valor maximo = ");
scanf("%f",&xmax);
printf("\n");
printf( " Teclea valor de error esperado = ");
scanf("%f",&error);
printf("\n");
printf( " Teclea iteraciones maximas = ");
scanf("%f",&iteraciones);
printf("\n");
c1 = Bisect(xmin, xmax, error, iteraciones);
c1 = FalsePos( xmin, xmax, error, iteraciones);
printf( " Resultado = %f", c1);
getch();
.
49
5G
M E T O D O DE FALSA P O S I C I O N
T e c l e a v a l o r ninino = 12
T e c l e a v a l o r mximo = 1 6
T e c l e a va l o r mnimo = 12
T ec l ea va l o r mximo = 16
T e c l e a va l o r de e rror esperado = .89
T ec l ea iteraciones maximas = 3
No
XI
ea
Xu Xr
1 14.000
16.000 14.000
No
XI
Xu Xr
ea
2 14.000
15.000 15.000
No
XI
ea
Xu Xr
3 14.500
15.000 14.500
Resultado = 14.801608
51
2.4.- Newton-Raphson
Tal vez, de las frmulas para localizar races, la frmula de Newton-Raphson
(figura 2.6) sea la ms ampliamente utilizada. Si el valor inicial para la raz es xi ,
entonces se puede trazar una tangente desde el punto [xi,f(xi ) ] de la curva. Por lo
comn, el punto donde esta tangente cruza al eje x representa una aproximacin
mejorada de la raz.
/(-O
Figura 2.6
(Ec.2.4)
f \ x ) = -e ~ x - l
que se sustituye, junto con la funcin original en la ecuacin (2.5), para tener
x+i = x
e Xl - x
-e-xl - 1
e_x - x 0
xi
xo
-z
e 0- 0
X1 = 0 -
x2 = X i
_ e -o
= 0 5
e Xl - Xj
- e _xi - 1
e -0-5 - 0.5
x2 = 0.5------ t = 0.566311
e
e Xz - x 2
e 0.566311 _ 0.566311
x3
=
0.566311
--------------------- = 0.567143
D
__0 U.5 6 6 3 1 1 __ "j
e Xs - x 3
~ -e ~ x3 - 1
g 0 .5 6 7 1 4 3 _ 0.567143
x4 = 0.567143 -----_ e _o,567143 _ 1
= 0.567143
53
Xt
r ( % )
100 '
0.500000000 11.8
0.566311003 0.147
0.567143165 0.0000220
54
INICIO
~T ~
NGRAD,N,M,I,A,A
PROX,NRAIZ,X,N
MI,B,C,Y,REL
'
NMI. APR0X.
NGRAD
X - 01
- o
NM!
*<E>
A l) - B 11
B ili-A .li
N-NGRAD
N - i-l
'
I8
M - N+l
M = M-l
'
f (Al , I l.Mi
t
(A(I), I-I.M)
t-2.N y L i1*
C th -B D + X Crl-1)
Y *X
REl-
B M
CM
r-fi
55
2.4.3.- Pseudocdigo
function newtonlterationFunction(x) {
return x - (cos(x) - xA3) / (-sin(x) - 3*xA2)
}
var x := 0,5
for i from 0 to 99 {
print "Iteraciones: " i
print "Valor aproximado: " x
xold := x
x := newtonlterationFunction(x)
if x = xold {
print "Solucin encontrada!"
break
}
}
2.4.4.- Programas en C
NEWTON RAPHSON
#include <conio.h>
#include <stdio.h>
#include <math.h>
MAIN
printf("\t\tMETODO DE NEWTON RAPHSON);
printf("\n\nintruce valor inicial");
printf("\n\nX=");
scanf("%f",&x1);
printf('\nIteraciones=");
scanf("%d",&I);
do
y=exp(-x 1)-x 1;
y2=-1 *exp(-x 1)-1;
xr=x 1 - (y/y2);
a=((xr-x 1)/xr)*100 ;
e=fabs(a);
x 1=xr;
i++;
} c++;
while(i<I);
printf("\n\n\n\nLa raiz aproximada es x%d = %.12f ",c,xr);
printf("\n\nError = %.3f",e);
getch();
56
Iteraciones=4
57
Esta gran utilidad de las ecuaciones diferenciales es fcil de explicar; recurdese que
si se tiene la funcin
su derivada
puede interpretarse como la
velocidad de cambio de y con respecto a . En cualquier proceso natural, las variables
incluidas y sus velocidades de cambio se relacionan entre s mediante los principios
cientficos que gobiernan el proceso. El resultado de expresar en smbolos
matemticos estas relaciones, a menudo es una ecuacin diferencial.
58
3.2.- Euler
Este tema se refiere a la solucin de ecuaciones diferenciales ordinarias de la forma
y+i = y i + 0h
(Ec.3.2)
De acuerdo con esta ecuacin, la pendiente estimada 0 se usa para extrapolar desde
un valor anterior y a un nuevo valor y +1 en una distancia h (figura 3.1). Esta frmula
se aplica paso a paso para calcular un valor posterior y, por lo tanto, para trazar la
trayectoria de la solucin.
En otras palabras, se toma la pendiente al inicio del intervalo como una aproximacin
de la pendiente promedio sobre todo el intervalo.
= y + <{>h
Pendiente = 4>
x
Y
Tamao de paso = h
Figura 3.1
59
(Ec.3.2)
Figura 3.2
Mtodo de Euler.
60
Solucin.
Euler:
y ( 0.5) = y ( 0) + /( 0 ,1)0.5
donde
y la pendiente estimada en
es
Por lo tanto,
y(0.5) = 1.0 + 8 .5(0.5) = 5.25
La solucin verdadera en
es
As, el error es
61
Tabla 3.2.1
Error relativo
porcentual
verdadero
Global
euler
Local
0.0
1 .00000
1 .00000
0.5
3.21875
5.25000
-63.1
-63.1
1.0
3.00000
5.87500
-95.8
-28.0
1.5
2.21875
5.12500
131.0
-1.41
2.0
2.00000
4.50000
-125.0
20.5
2.5
2.71875
4.75000
-74.7
17.3
3.0
4.00000
5.87500
46.9
4.0
3.5
4.71875
7.12500
-51.0
-11.3
4.0
3.00000
7.00000
-133.3
-53.0
Figura 3.3
El ejemplo anterior usa un polinomio simple como ecuacin diferencial con el objetivo
de facilitar el siguiente anlisis de error. De esta forma,
dx
Ty = f M
En efecto, un caso ms general (y ms comn) implica EDO, donde aparece una
funcin que depende tanto de como de ,
dy
Tx = n x y )
Conforme avancemos en esta parte del texto, nuestros ejemplos comprendern EDO
que dependen de variables independientes y dependientes.
63
64
3.2.3.- Pseudocdigo
interva Io de inte grac in
xi = 0
xf = 4
vari ab Ies in ici a Ies
x = xi
y=1
estab Ie ce e I tamao de paso y determi na e I
nmero de pasos d e c Icu Io
dx = 0.5
nc= (xf - xi) /dx
cond ici ones d e sa Iida
PRINT x,y
'ciclo para implementar el mtodo de Euler
sp
r s ta os
DO i = 1, nc
dydx = -2x3 +12x2 - 20x + 8.5
y = y + dydx . dx
x= x + dx
PRINT x, y
END DO
65
3.2.4.- Programas en C
EULER
#include
#include
#include
#include
#include
#include
<iostream.h>
<iomanip.h>
<conio.h>
<math.h>
<stdlib.h>
<dos.h>
MAIN
return (-2*pow(x,3))+(12*pow(x,2))-(20*x)+8.5;
case EULER: Lee(x0,xf,y0,h);
Euler(x0,xf,y0,h);
getch();
break;
case SALIR: gotoxy(34,20);
default:
cout<<MFin de "<<__FILE__;
gotoxy(34,2l);
cout<<"Espere un momento...";
sleep( 1);
exit(0 );
break;
gotoxy(34,15);
cout<<"Opcion no permitida";
getch();
break;
}while}op!=
:SALIR);
return 0 ;
cout<<" METODO DE EULER ";
gotoxy(10,4);
cout<<"Xo = "<<setw(10)<<setprecision(5)<<x0;
gotoxy(10,5);
cout<<"Xf = "<<setw(10)<<setprecision(5)<<xf;
gotoxy(10,6 );
cout<<"Yo = "<<setw(10)<<setprecision(5)<<y0;
gotoxy(10,7);
cout<<"h = "<<setw(10)<<setprecision(5)<<h;
gotoxy(10,9);
cout<<" x
y";
gotoxy(9,10);
cout<<"---------------------- ";
cout<<endl;
cout<<setw(10) <<setprecision(5) << setiosflags(ios::fixed) << x;
cout<<setw(20) <<setprecision(5) << setiosflags(ios::fixed) << y << endl;
while(x<xf){
y+=h*f(x,y);
x+=h;
cout<<setw(10) <<setprecision(5) << setiosflags(ios::fixed) << x
<<setw(20) <<setprecision(5) << setiosfags(ios::fixed) << y <<
endl;
}
}
void Heun(float x0,float xf,float y0,float h)
66
METODO DE EULER
Xo
Xf
Vo
h
X
0.00000
0.50000
1.00000
1.50000
2.00000
2.50000
3.00000
3.50000
4.00000
=
=
=
=
0.00000
4.00000
1.00000
0.50000
1.00000
5.25000
5.87500
5.12500
4.50000
4.75000
5.87500
7.12500
7.00000
67
3.3.-Runge-Kutta
El mtodo de Runge-Kutta (RK) logra la exactitud del procedimiento de la serie
Taylor sin necesitar el clculo de derivadas de orden superior. Existen muchas
variantes, pero todas tienen la forma generalizada de la siguiente ecuacin.
y+i = y + 0 (x,y,/0 h
(Ec.3.3)
donde
se conoce como la funcin incremento, la cual puede interpretarse
como una pendiente representativa en el intervalo. La funcin incremento se escribe
en forma general como
0 = a1/c1 + a2k 2 + !ankn
donde las
(Ec.3.4)
son
h = /(x,y)
(Ec.3.4a)
k2 = / 0 + P i K y i + q n h h )
(Ec.3.4b)
k2 = / 0 + P2^.y +
K = f (x + pn_ 1h,y +
donde las
(Ec.3.4c)
+ R22k2h
1 ifcih +
_i, 2h + +
_i <n_ifcn_i h) (Ec.3.4d)
Es decir,
aparecen en la ecuacin
, la cual aparece en la ecuacin
, etctera.
Como cada k es una evaluacin funcional, esta recurrencia vuelve eficiente al mtodo
de RK para clculos en computadora.
68
y +1 = y + (
+ 2^ 2) h
(Ec.3.5)
donde
k 1 = / (x,y)
k 2 = / (x + p
(Ec.3.5a)
3/j + q11k
(Ec.3.5b)
Como se describe a continuacin, los valores de a1, a2,p 1y q11 se evalan al igualar
la ecuacin (Ec.3.5) con la expansin de la serie de Taylor hasta el trmino de
segundo.
0.0
0.5
1.0
1.5
yverdadero
1
3.21875 ^
3.00000
2.21875
2.0
2.00000
2.5
3.0
3.5 .
4.0
2.71875
4.00000
4.71875
3.00000
1.00000
3.277344
3.101563
2.347656
2.140625
2.855469
4.117188
4.800781
3.031250
k t l(% )
0
1.8
3.4..
5.8
7.0
5.0
2.9
1.7
1.0
69
En el primer intervalo
1
2
0 = -(8 .5 ) -(2.58203125) = 4.5546875
que se utiliza para predecir
y(0.5) = 1 + 4.5546875(0.5) = 3.27734375 et = -1.82%
2.0000000
2.0000000
0.00
2.0000000
0.00
6.1946314
6.7010819
8.18
6.3608655
2.68
14.8439219
16.3197819
9.94
15.3022367
3.09
33.6771718
37.1992489
10.46
34.7432761
3.17
75.3389626
83.3377674
10.62
77.7350962
3.18
70
3.3.2.-Diagrama de flujo
71
3.3.3.- Pseudocdigo
x = xi
m= 0
xpm = x
DO I = 1, n
ypi,m = yi
END DO
DO
xend = x + xout
IF (xend > xf) THEN xend = xf
h= dx
CALL Integrador (x, y, n, h, xend)
m=m+1
xpm = x
DO i = 1, n
ypi,m = yi
END DO
IF (x > xf) EXIT
LOOP
DISPLAY RESULTS
END
72
73
3.3.4.- Programas en C
RUNGE KUTTA
#include <iostream.h>
#include <iomanip.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
#include <dos.h>
MAIN
return 4*exp(0.8*x)-(0.5*y);
case RK2: Lee(x0,xf,y0,h);
Heun(x0,xf,y0,h);
getch();
break;
case SALIR: gotoxy(34,20);
default:
cout<<"Fin de "<<__FILE__;
gotoxy(34,21);
cout<<"Espere un momento...";
sleep( 1);
exit(0 );
break;
gotoxy(34,15);
cout<<"Opcion no permitida";
getch();
break;
}while}op!=SALIR);
return 0 ;
cout<<"METODO DE HEUN (RK Orden 2)"<<endl;
gotoxy(10,4);
cout<<"Xo = "<< setw(10) << setprecision(5) <<x0;
gotoxy(10,5);
cout<<"Xf = "<< setw(10) << setprecision(5) <<xf;
gotoxy(10,6 );
cout<<"Yo = "<< setw(10) << setprecision(5) <<y0;
gotoxy(10,7);
cout<<"h = "<< setw(10) << setprecision(5) <<h;
gotoxy(10,9);
cout<<"x
y";
gotoxy(9,10);
cout<<"---------------------- ";
cout<<endl;
cout<<setw(10) << setprecision(5) << setiosflags(ios::fixed) << x;
cout<<setw(20) << setprecision(5) << setiosflags(ios::fixed) << y <<endl;
while(x<xf){
k 1=h*f(x,y);
k2 =h*f(x+h,y+k1);
y+=(k 1/ 2 .0 +k2/ 2 .0 );
x+=h;
cout<<setw(10) << setprecision(5) << setiosflags(ios::fixed) << x
<<setw(20) << setprecision(5) << setiosflags(ios::fixed) << y
<<endl;
<<}endl ; }
74
0
4
2
1
2.00000
6.70108
16.31978
37.19925
83.33777
75
4 - INTEGRACIN
4.1.- Concepto y clasificacin
En este captulo se abordar el tema clsico de integracin definida. Para ello se
utilizarn procesos finitos, en los que a diferencia de los mtodos analticos, donde
el concepto de lmite es central y por tanto los procesos infinitos se manejan
conjuntos de puntos discretos y haremos pasar por ellos o entre ellos un polinomio,
para despus integrar o derivar dicho polinomio. Con esta tcnica podremos
integrar y derivar funciones dadas tabularmente o bien funciones analticas muy
complejas e, incluso, integrar aq u IIas cuya integra I "no ex iste, como es en e I caso
de
TT
Figura 4.1a
b)
Figura 4.1 b
(x2 -X q ) (x 2 - x ! ) f (X2)
Despus de la integracin y de las manipulaciones algebraicas, se obtiene la
siguiente frmula:
l = j - [ f ( x o ) + 4 f (x ! ) + f (x 2) ]
(Ec.4.1)
77
I s ( a - b ) f(xo)+4f(X1)+f(X2)
(Ec.4.2)
"V"
Ancho
Altura promedio
Et = - hf 4 ) ( 0
o como h = ( b - a)/ 2
Et = - S
(Ec.4.3)
78
/ ( x ) = 0.2
/(0 .4 ) = 2.456
/(0 .8 ) = 0.232
et = 16.6%
( 0 .8 )5
Eci = - ^ ^ - ( - 240) = 0.2730667
79
IN IC IO
n_s, n_p, h, b,
a, x_j, j, k, i
80
4.2.3. - Pseudocdigo
a)
FUNCTION Simp13 (h, f0, fl, f2)
simp13 = 2* h * (f0+4*f1 +f2) /6
END Simp13
b)
FUNCTION Simp38 (h, f0, fl, f2)
simp38 = 3*h* (f0+3*(f1 +f2)+f3) /8
END Simp38
c)
FUNCION Simp13m (h, n, f)
sum = f( 0 )
DO i = 1, n- 2, 2
sum = sum + 4 * fi + 2 * fi+1
END DO
sum = sum + 4 * fn-1 + 2 * fn
simp13m = h * sum / 3
END Simp13m
d)
FUNCTION SimpInt (a, b, n, f)
h = (b - a) / n
IF n = 1 THEN
sum = trap (h, fn-1,fn)
ELSE
m=n
odd = n / 2 - INT(n / 2)
IF odd > 0 AND > 1 THEN
sum = sum + simp38(h, fn-3, fn-2, fn-1, fn)
m = n- 3
END IF
IF m > 1 THEN
sum = sum + simp13m(h,m,f)
END IF
END IF
SimpInt =sum
END SimpInt
Bl
4.2.4.- Programas en C
#include <stdio.h> /*para printf(),scanf()*/
#include <conio.h> /*para getch(),clrscr()*/
#include <stdlib.h>/*para exit()*/
#include <dos.h>
#include <math.h>
#define NUMEL
20
#define INTERVALOS 0
float f(float);
void _error(int n);
MAIN
}
h=(b-a)/(2 *n);
S0=S1=0;
for(i= 1;i<=(2 *n -1 );++i){
x=a+((double)i)*h;
if(!(i%2 ))
S0+=f(x);
else
S1+=f(x);
}
*Area=(h*(f(a)+4*S1+2*S0+f(b))/3.0);
printf(\n El area es -> %5.6fM,*Area);
getch();
}
void LeeDatos(int opc)
{
if(opc==SIMPSON1_3){
clrscr();
printf(\n Metodo de Integracion por 1/3 de Simpson");
printf("\n ========================================");
putchar('\n');
printf("\n Numero de intervalos (PAR) -> ");
}
scanf("%d",&n);
if(n< 1){
_error(INTERVALOS);
exit(1);
}
else
printf("\n Valor de a =>");
scanf("%f",&a);
printf("\n Valor de b =>");
scanf("%f",&b);
}
82
83
COSTOS
Para la elaboracin de este manual de programas aplicados a mtodos numricos
se recopil informacin de diferentes fuentes: libros e internet pero como
herramienta principal, el programa borland c++ versin 5.0 y el costo de operacin
de este software fue gratuito ya que la facultad cuenta con esta herramienta y est
instalado en el centro de cmputo en nuestra facultad de ingeniera mecnica
elctrica.
84
CAPITULO III
86
BIBLIOGRAFA
MTODOS NUMRICOS
APLICACIN
PARA
INGENIEROS
CON
PROGRAMAS
DE
STEVEN C. CHAPRA
RAYMOND P. CANALE
MTODOS NUMRICOS
LUTHE OLVERA SCHUTZ
87
ANEXOS
Anexo A
DIAGRAMAS DE FLUJO
TERMINAL:
Indica el inicio y el fin de un Diagrama de Flujo.
DEFINICIN DE VARIABLES:
Define todas y cada una de las variables que sern
utilizadas en el programa representado en el diagrama
de flujo.
PROCESO:
Cualquier tipo de operacin que pueda originar cambio
de valor, formato o posicin de la informacin
almacenada en memoria, operaciones aritmticas, de
transferencia, etc.
DECISIN:
ENTRADA:
Indica la asignacin de un valor de una variable tomando
este valor desde un dispositivo de entrada.
SALIDA:
Indica que el resultado ser presentado ya sea por
pantalla o por impresora.
88
Anexo B
CICLOS
89
Anexo C
PRINCIPIOS DE C
En este anexo se ofrece una breve historia del desarrollo del lenguaje C y se
consideran tambin sus caractersticas.
ORGENES DEL C
El proceso de desarrollo del lenguaje C se origina con la creacin de un lenguaje
llamado BCPL, que fue desarrollado por Martin Richards. El BCPL tuvo influencia
en un lenguaje llamado B, el cual se us en 1970 y fue inventado por Ken
Thompson y que permiti el desarrollo de C en 1971, el cual lo invent e
implement Dennis Ritchie. Para 1973 el sistema operativo UNIX estaba casi
totalmente escrito en C.
Durante muchos aos el estndar para C fue la versin 5 del sistema operativo
UNIX, documentada en ''The C Programming Language'' escrito por Brian W.
Kernighan and Dennis M. Ritchie in 1978 comnmente referido como K&R.
Posteriormente se hicieron varias implementaciones las cuales mostraban las
siguientes tendencias:
Nuevas caractersticas
Diferencias de mquinas
Diferencias de productos
Errores en los compiladores
Malas implementaciones
Esto origin que en el verano de 1983 se estableciera un comit para resolver
estas discrepancias, el cual empez a trabajar en un estndar ANSI C, la cual fue
completada en 1988.
CARACTERSTICAS DE C
Algunas de las caractersticas ms importantes que definen el lenguaje y que han
permitido que sea tan popular, como lenguaje de programacin son:
Tamao pequeo.
Uso extensivo de llamadas a funciones.
Comandos breves (poco tecleo).
Lenguaje estructurado.
Programacin de bajo nivel (nivel bit)
Implementacin de apuntadores - uso extensivo de apuntadores para la memoria,
arreglos, estructuras y funciones
Las diversas razones por la cual se ha convertido en un lenguaje de uso
profesional son:
El uso de constructores de alto nivel.
El poder manejar actividades de bajo-nivel.
El generar programas eficientes.
La posibilidad de poder ser compilado en una variedad de computadoras, con
90
.1
.. 2
... 3
91
VARIABLES
C tiene los siguientes tipos de datos simples:
Tabla: Tipos de C
Tipo
Lmite superior
Char
--
unsigned char
short int
--
32768
in
+32767
165536
(long) int
Float
3.2 x 108S
+ 3,2 x 10aH
double
-1 .7 X 1 0 * *
-1-1,7 x io 3
4 *> -l
Los tipos de datos bsicos tiene varios modificadores que les preceden. Se usa un
modificador para alterar el significado de un tipo base para que encaje con las
diversas necesidades o situaciones. Los modificadores son: signed, unsigned, long
y short.
En los sistemas UNIX todos los tipos int son long int, a menos que se especifique
explcitamente short int.
Nota: no hay un tipo booleano en C -- se deber usar char, int o an mejor
unsigned char.
signed, unsigned, long y short pueden ser usados con los tipos char e int. Aunque
es permitido el uso de signed en enteros, es redundante porque la declaracin de
entero por defecto asume un nmero con signo.
Para declarar una variable en C, se debe seguir el siguiente formato:
tipo lista_variables;
tipo es un tipo vlido de C y lista_variables puede consistir en uno o ms
identificadores separados por una coma. Un identificador debe comenzar con una
letra o un guin bajo.
Ejemplo:
int i, j, k;
float x,y,z;
char ch;
92
}
Dentro de C tambin se permite la asignacin mltiple usando el operador =, por
ejemplo:
a = b = c = d = 3;
...que es lo mismo, pero ms eficiente que:
a = 3;
b = 3;
c = 3;
93
d = 3;
La asignacin mltiple se puede llevar a cabo, si todos los tipos de las variables
son iguales.
Se pueden redefinir los tipos de C usando typedef. Como un ejemplo de un simple
uso se considera como se crean dos nuevos tipos real y letra. Estos nuevos tipos
pueden ser usados de igual forma como los tipos predefinidos de C.
typedef float real;
typedef char letra;
/* Declaracin de variables usando el nuevo tipo */
real suma=0 .0 ;
letra sig_letra;
Es usual inicializar una constante con un valor, ya que no puede ser cambiada de
alguna otra forma.
OPERADORES ARITMTICOS
Lo mismo que en otros lenguajes de programacin, en C se tienen los operadores
aritmticos ms usuales (+ suma, - resta, * multiplicacin, / divisin y % mdulo).
El operador de asignacin es =, por ejemplo: i=4; ch='y';
Incremento ++ y decremento -- unario. Los cuales son ms eficientes que las
respectivas asignaciones. Por ejemplo: x++ es ms rpido que x=x+1.
Los operadores ++ y -- pueden ser prefijos o postfijos. Cuando son prefijos, el valor
es calculado antes de que la expresin sea evaluada, y cuando es postfijo el valor
es calculado despus que la expresin es evaluada.
En el siguiente ejemplo, ++z es prefijo y -- es postfijo:
int x,y,z;
main()
{
x=( ( ++z ) - ( y-- ) ) % 100 ;
}
Que es equivalente a:
int x,y,z;
main()
{
z++;
x = ( z-y ) % 100 ;
y-- ;
}
El operador % (mdulo o residuo) solamente trabaja con enteros, aunque existe
una funcin para flotantes.
El operador divisin / es para divisin entera y flotantes. Por lo tanto hay que tener
cuidado. El resultado de x = 3 / 2; es uno, an si x es declarado como float. La
regla es: si ambos argumentos en una divisin son enteros, entonces el resultado
es entero. Si se desea obtener la divisin con la fraccin, entonces escribirlo como:
x = 3.0 / 2; o x = 3 / 2.0 y an mejor x = 3.0 / 2.0.
Por otra parte, existe una forma ms corta para expresar clculos en C. Por
ejemplo, si se tienen expresiones como: i = i + 3; o x = x * (y + 2); , pueden ser
95
reescritas como:
OPERADORES DE COMPARACIN
El operador para probar la igualdad es ==, por lo que se deber tener cuidado de
no escribir accidentalmente slo =, ya que:
if ( i = j ) ..
Es una sentencia legal de C (sintcticamente hablando aunque el compilador avisa
cuando se emplea), la cual copia el valor de " j" en ''i'', lo cual ser interpretado
como VERDADERO, si j es diferente de cero.
Diferente es !=, otros operadores son: < menor que, > mayor que, <= menor que o
igual a y >= (mayor que o igual a).
OPERADORES LGICOS
Los operadores lgicos son usualmente usados con sentencias condicionales o
relacionales, los operadores bsicos lgicos son:
&& Y lgico, || O lgico y! negacin.
ORDEN DE PRECEDENCIA
Es necesario ser cuidadosos con el significado de expresiones tales como a + b *
c, dependiendo de lo que se desee hacer
(a + b) * c
o
a + (b * c)
Todos los operadores tienen una prioridad, los operadores de mayor prioridad son
evaluados antes que los que tienen menor prioridad. Los operadores que tienen la
misma prioridad son evaluados de izquierda a derecha, por lo que:
a-b-c
es evaluado como
(a - b) - c
Prioridad Operador(es)
Ms alta
( ) [ ] ->
! ~ ++ -- - (tipo) * & sizeof
*/ %
+96
<< >>
< <= > >=
== !=
&
A
1
&&
II
?
= += -= *= /=
Ms baja ,
De acuerdo a lo anterior, la siguiente expresin:
a < 10 && 2 * b < c
Es interpretada como:
(a < 10) && ( (2 * b) < c )
y
a=
b=
10 / 5
+ 2;
como
a=
(b=
( 10 / 5 )
+ 2 );
ESTRUCTURAS CONDICIONALES
En este captulo se revisan los distintos mtodos con los que C controla el flujo
lgico de un programa.
Como se revis en el captulo anterior, los operadores relaciones binarios que se
usan son:
==, !=, <, <=, > y >=
adems los operadores lgicos binarios:
||, &&
y el operador lgico unario de negacin !, que slo toma un argumento.
Los operadores anteriores son usados con las siguientes estructuras que se
muestran.
97
LA SENTENCIA IF
Las
tres
formas
como
se
puede
emplear
la
sentencia
if
son:
if (condicin)
sentencia;
... o
if (condicin)
sentencia 1;
else
sentencia2 ;
... o
if (condicion1)
sentencia 1;
else if (condicion2 )
sentencia 2 ;
else
sentencian;
El flujo lgico de esta estructura es de arriba hacia abajo. La primera sentencia se
ejecutar y se saldr de la estructura if si la primera condicin es verdadera. Si la
primera condicin fue falsa, y existe otra condicin, se evala, y si la condicin es
verdadera, entonces se ejecuta la sentencia asociada. Si existen ms condiciones
dentro de la estructura if, se van evaluando stas, siempre y cuando las
condiciones que le precedan sean falsas.
La sentencia que est asociada a la palabra reservada else, se ejecuta si todas las
condiciones de la estructura if fueron falsas.
Por ejemplo:
main()
{
int x, y, w;
if (x>0 )
{
z=w;
}
else
{
z=y;
}
}
98
EL OPERADOR ?
El operador ternario condicional ? es ms eficiente que la sentencia if. El
operador ? tiene el siguiente formato:
expresin1 ? expresin 2 : expresion3;
Que es equivalente a la siguiente expresin:
if (expresin1) then expresin2 else expresin3;
Por ejemplo, para asignar el mximo de a y b a la variable z, usando ?,
tendramos:
z = (a>b) ? a : b;
que es lo mismo que:
if (a > b)
z = a;
else
z = b;
El uso del operador ? para reemplazar las sentencias if ... else no se restringe
slo a asignaciones, como en el ejemplo anterior. Se pueden ejecutar una o ms
llamadas de funcin usando el operador ? ponindolas en las expresiones que
forman los operandos, como en el ejemplo siguiente:
f 1(int n)
{
printf("%d ",n);
}
f2 ()
{
printf("introducido\n");
}
main()
{
int t;
printf(": ");
scanf("%d",&t);
/* imprime mensaje apropiado */
t ? f1 (t) + f2() : printf("Se dio un cero\n");
}
99
LA SENTENCIA SWITCH
Aunque con la estructura if ... else if se pueden realizar comprobaciones mltiples,
en ocasiones no es muy elegante, ya que el cdigo puede ser difcil de seguir y
puede confundir incluso al autor transcurrido un tiempo. Por lo anterior, C tiene
incorporada una sentencia de bifurcacin mltiple llamada switch. Con esta
sentencia, la computadora comprueba una variable sucesivamente frente a una
lista de constantes enteras o de carcter. Despus de encontrar una coincidencia,
la computadora ejecuta la sentencia o bloque de sentencias que se asocian con la
constante.
La
forma
general
de
la
sentencia
switch
es:
switch (variable) {
case constantel:
secuencia de sentencias
break;
case constante2 :
secuencia de sentencias
break;
case constante3:
secuencia de sentencias
break;
default:
secuencia de sentencias
}
Donde la computadora ejecuta la sentencia default si no coincide ninguna
constante con la variable, esta ltima es opcional. Cuando se encuentra una
coincidencia, la computadora ejecuta las sentencias asociadas con el case hasta
encontrar la sentencia break con lo que sale de la estructura switch.
Las limitaciones que tiene la sentencia switch ... case respecto a la estructura if
son:
Slo se tiene posibilidad de revisar una sola variable.
Con switch slo se puede comprobar por igualdad, mientras que con if puede ser
con cualquier operador relacional.
No se puede probar ms de una constante por case.
La forma como se puede simular el ltimo punto, es no teniendo sentencias
asociados a un case, es decir, teniendo una sentencia nula donde slo se pone el
caso, con lo que se permite que el flujo del programa caiga al omitir las sentencias,
como se muestra a continuacin:
switch (letra)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
numvocales++;
break;
100
LA SENTENCIA FOR
La sentencia for tiene el siguiente formato:
for ( expresin1; expresin2; expresin3)
sentencia;
o { bloque de sentencias }
En donde expresin1 se usa para realizar la inicializacin de variables, usando una
o varias sentencias, si se usan varias sentencias deber usarse el operador, para
separarlas. Por lo general, establece el valor de la variable de control del ciclo.
expresin2 se usa para la condicin de terminacin del ciclo y expresin3 es el
modificador a la variable de control del ciclo cada vez que la computadora lo repite,
pero tambin puede ser ms que un incremento.
Por ejemplo:
int X;
main()
{
for( X=3; X>0; X--)
{
printf("X=%d\n",X);
}
}
101
Todos las siguientes sentencias for son vlidas en C. Las aplicaciones prcticas de
tales sentencias no son importantes aqu, ya que tan slo se intenta ilustrar
algunas caractersticas que pueden ser de utilidad:
for ( x=0; ( (x>3) && (x<9) ); x++ )
for ( x=0, y=4; ( (x>3) && (x<9) ); x++, y+=2)
for ( x=0, y=4, z=4000; z; z/=10)
En el segundo ejemplo se muestra la forma como mltiples expresiones pueden
aparecer, siempre y cuando estn separadas por una coma ,
En el tercer ejemplo, el ciclo continuar iterando hasta que z se convierta en L l
LA SENTENCIA WHILE
La sentencia while es otro ciclo o bucle disponible en C. Su formato es:
while ( expresin) sentencia;
donde sentencia puede ser una sentencia vaca, una sentencia nica o un bloque
de sentencias que se repetirn. Cuando el flujo del programa llega a esta
instruccin, primero se revisa si la condicin es verdad para ejecutar la(s)
sentencia(s), y despus el ciclo while se repetir mientras la condicin sea
verdadera. Cuando llega a ser falsa, el control del programa pasa a la lnea que
sigue al ciclo.
En el siguiente ejemplo se muestra una rutina de entrada desde el teclado, la cual
se cicla mientras no se pulse A:
main()
{
char carac;
carac = '\0 ';
while( carac != 'A') carac = getchar();
}
Antes de entrar al ciclo se inicializa la variable carac a nulo. Despus pasa a la
sentencia while donde se comprueba si carac no es igual a 'A', como sea verdad
entonces se ejecuta la sentencia del bucle (carac = getchar();). La funcin getchar()
lee el siguiente carcter del flujo estndar (teclado) y lo devuelve, que en nuestro
ejemplo es el caracter que haya sido tecleado. Una vez que se ha pulsado una
tecla, se asigna a carac y se comprueba la condicin nuevamente. Despus de
pulsar A, la condicin llega a ser falsa porque carac es igual a A, con lo que el ciclo
termina.
De lo anterior, se tiene que tanto el ciclo for, como el ciclo while comprueban la
condicin en lo alto del ciclo, por lo que el cdigo dentro del ciclo no se ejecuta
siempre.
102
1 seleccionada\n\n");
2 seleccionada\n\n");
3 seleccionada\n\n");
no disponible\n\n");
104
}
}
Finalmente se considera el siguiente ejemplo donde se leen valores enteros y se
procesan de acuerdo a las siguientes condiciones. Si el valor que sea ledo es
negativo, se desea imprimir un mensaje de error y se abandona el ciclo. Si el valor
es mayor que 100 , se ignora y se contina leyendo, y si el valor es cero, se desea
terminar el ciclo.
main()
{
int valor;
while( scanf("%d", &valor) == 1 && valor != 0 )
{
if ( valor<0 )
{
printf("Valor no valido\n");
break;
/* Salir del ciclo */
}
if ( valor> 100)
{
printf("Valor no valido\n");
continue;
/* Pasar al principio del ciclo nuevamente */
}
printf("Se garantiza que el valor leido esta entre 1 y 100");
}
}
ARREGLOS UNIDIMENSIONALES Y MULTIDIMENSIONALES
Los arreglos son una coleccin de variables del mismo tipo que se referencian
utilizando un nombre comn. Un arreglo consta de posiciones de memoria
contigua. La direccin ms baja corresponde al primer elemento y la ms alta al
ltimo. Un arreglo puede tener una o varias dimensiones. Para acceder a un
elemento en particular de un arreglo se usa un ndice.
El formato para declarar un arreglo unidimensional es:
tipo nombre_arr [ tamao ]
Por ejemplo, para declarar un arreglo de enteros llamado listanum con diez
elementos se hace de la siguiente forma:
int listanum[10];
En C, todos los arreglos usan cero como ndice para el primer elemento. Por tanto,
el ejemplo anterior declara un arreglo de enteros con diez elementos desde
listanum[0] hasta listanum[9].
La forma como pueden ser accesados los elementos de un arreglo, es de la
siguiente forma:
106
107
CADENAS
A diferencia de otros lenguajes de programacin que emplean un tipo denominado
cadena string para manipular un conjunto de smbolos, en C, se debe simular
mediante un arreglo de caracteres, en donde la terminacin de la cadena se debe
indicar con nulo. Un nulo se especifica como '\0'. Por lo anterior, cuando se declare
un arreglo de caracteres se debe considerar un carcter adicional a la cadena ms
larga que se vaya a guardar. Por ejemplo, si se quiere declarar un arreglo cadena
que guarde una cadena de diez caracteres, se har como:
char cadena[11];
Se pueden hacer tambin inicializaciones de arreglos de caracteres en donde
automticamente C asigna el carcter nulo al final de la cadena, de la siguiente
forma:
char nombre_arr[ tam ]="cadena";
Por ejemplo, el siguiente fragmento inicializa cadena con ''hola'':
char cadena[5]="hola";
El cdigo anterior es equivalente a:
char cadena[5]={'h','o','l','a','\0'};
Para asignar la entrada estndar a una cadena se puede usar la funcin scanf con
la opcin %s (observar que no se requiere usar el operador &), de igual forma para
mostrarlo en la salida estndar.
Por ejemplo:
main()
{
char nombre[15], apellidos[30];
printf("Introduce tu nombre: ");
scanf("%s",nombre);
printf("Introduce tus apellidos: ");
scanf("%s",apellidos);
printf("Usted es %s %s\n",nombre,apellidos);
}
El lenguaje C no maneja cadenas de caracteres, como se hace con enteros o
flotantes, por lo que lo siguiente no es vlido:
main()
{
char nombre[40], apellidos[40], completo[80];
nombre="Jos Mara";
/* Ilegal */
apellidos="Morelos y Pavn";
/* Ilegal */
completo="Gral."+nombre+apellidos; /* Ilegal */
}
Funciones
Una funcin es un conjunto de declaraciones, definiciones, expresiones y
sentencias que realizan una tarea especfica.
108
cuadrados();
}
En la funcin cuadrados no est definido ningn parmetro, y por otra parte
tampoco se emplea la sentencia return para regresar de la funcin.
FUNCIONES Y ARREGLOS
Cuando se usan un arreglo como un argumento a la funcin, se pasa slo la
direccin del arreglo y no la copia del arreglo entero. Para fines prcticos podemos
considerar el nombre del arreglo sin ningn ndice como la direccin del arreglo.
Considerar el siguiente ejemplo en donde se pasa un arreglo a la funcin imp_rev,
observar que no es necesario especificar la dimensin del arreglo cuando es un
parmetro de la funcin.
void imp_rev(char s[])
{
int t;
for( t=strlen(s)-1; t>=0 ; t--)
printf("%c",s[t]);
}
main()
{
char nombre[]="Facultad";
imp_rev(nombre);
}
Observar que en la funcin imp_rev se usa la funcin strlen para calcular la
longitud de la cadena sin incluir el terminador nulo. Por otra parte, la funcin
imp_rev no usa la sentencia return ni para terminar de usar la funcin, ni para
regresar algn valor.
Se muestra otro ejemplo,
float enconprom(int tam, float lista[])
{
int i;
float suma = 0 .0 ;
for ( i=0 ; i<tam; i++)
suma += lista[i];
return(suma/tam);
}
main()
{
float numeros[]={2.3, 8.0, 15.0, 20.2, 44.01, -3.0, -2.9};
printf("El promedio de la lista es %f\n", enconprom(7,numeros) );
}
110
Para el caso de que se tenga que pasar un arreglo con ms de una dimensin, no
se indica la primera dimensin pero, el resto de las dimensiones deben sealarse.
Se muestra a continuacin un ejemplo:
void imprtabla(int tamx,int tamy, float tabla[][5])
{
int x,y;
for ( x= 0 ; x<tamx; x++ )
{
for ( y=0 ; y<tamy; y++ )
printf("t[%d][%d]=%f",x,y,tabla[x][y]);
printf("\n");
}
}
PROTOTIPOS DE FUNCIONES
Antes de usar una funcin C debe tener conocimiento acerca del tipo de dato que
regresar y el tipo de los parmetros que la funcin espera.
El estndar ANSI de C introdujo una nueva (mejor) forma de hacer lo anterior
respecto a las versiones previas de C.
La importancia de usar prototipos de funciones es la siguiente:
Se hace el cdigo ms estructurado y por lo tanto, ms fcil de leer.
Se permite al compilador de C revisar la sintaxis de las funciones llamadas.
Lo anterior es hecho, dependiendo del alcance de la funcin. Bsicamente si una
funcin ha sido definida antes de que sea usada (o llamada), entonces se puede
usar la funcin sin problemas.
Si no es as, entonces la funcin se debe declarar. La declaracin simplemente
maneja el tipo de dato que la funcin regresa y el tipo de parmetros usados por la
funcin.
Es una prctica usual y conveniente escribir el prototipo de todas las funciones al
principio del programa, sin embargo esto no es estrictamente necesario.
Para declarar un prototipo de una funcin se indicar el tipo de dato que regresar
la funcin, el nombre de la funcin y entre parntesis la lista del tipo de los
parmetros de acuerdo al orden que aparecen en la definicin de la funcin. Por
ejemplo:
int longcad(char []);
Lo anterior declara una funcin llamada longcad que regresa un valor entero y
acepta una cadena como parmetro.
111