Application Center - Maplesoft

App Preview:

Programación I

You can switch back to the summary page by clicking here.

Learn about Maple
Download Application


 

Programacion I.mws

MATEMTICASPLE

CON MAPLE

Para Estudiantes y Profesores

MAPLE V Versin...:. 5.1

Captulo VII - Programacin I

Documento: Maple Manual Programacin

Captulo: VII - Programacin I

Elabor: Csar Ivn Tinoco.

Versin: 26 de Junio del 2.000

Introduccin:

Una vez reconocidos algunos de los comandos bsicos de Maple , vamos a profundizar en el aspecto ms importante de los lenguajes y simuladores, La Programacin.

Programar es adelantar un conjunto de rdenes, sentencias y comandos de tal forma que produzcan un resultado. Programar es un Arte, que requiere destreza y mucha creatividad, es posible lograr un objetivo usando diferentes procedimientos.

Para programar slo se necesitan dos cosas: La primera es tener un problema que resolver bajo un conjunto de rdenes e instrucciones y segundo, traducir un algoritmo al lenguaje escogido, en este caso el lenguaje Maple.

Condicionales:

La posibilidad de tomar tomar una decisin sobre el valor de verdad de una sentencia, nos permite acercar los lenguajes de programacin a los procesos lgicos de los seres humanos, realmente lo que hacemos con el software es ejecutar sentencias de tipo boleano.

Orden ........: if then if

Sintxis ......: if condicin then sentencias else condiciones

Propsito ...: Ejecuta las sentencias si c ondicin es cierta, en caso contrario ejecuta otro grupo de sentencias..

Vamos a definir la funcin valor absoluto.

> restart:
f:=x->if x<0 then -x else x fi;

f := proc (x) options operator, arrow; if x < 0 the...

Habremos definido la funcin por medio de un procedimiento

> f(4),f(-8),f(-.012),f(-12.52);

4, 8, .12e-1, 12.52

Supongamos que deseamos hacer una nueva definicin de la funcin seno y hacer que esta slo tome valores positivos.

> sen:=x->
if
sin(x)<0 then
-sin(x);
else
sin(x);
fi;

sen := proc (x) options operator, arrow; if sin(x) ...

> sin(Pi),sen(Pi);
sin(Pi/2),sen(Pi/2);
sin(3*Pi/2),sen(3*Pi/2);

0, 0

1, 1

-1, 1

Veamos la grafica de dicha funcin.

> plot(sen,-2*Pi..2*Pi,title=`Un nuevo Seno`);

[Maple Plot]

Las condiciones pueden tener expresions compuestas con operadores lgicos. S, No y O.

Vamos a definir una funcin a trozos bajo la siguiente ley:

> f1:=x->
if x<0 then
2*x+1
elif x>0 and x>1 then
x+1
else
2
fi;

f1 := proc (x) options operator, arrow; if x < 0 th...

> plot(f1,-4..4,discont=true,axes=frame,color=magenta);

[Maple Plot]


Definamos la funcin mayor entero. Para esta definicin usaremos el comando
frac(x) que devuelve la parte fracionaria del argumento.

> fme:=x->
if x>=0 then
x-frac(x)
else
x-frac(x)-1
fi:

> a:=-1/5;
fme(a),evalf(a);;

a := -1/5

-1, -.2000000000

> plot(fme,-4..4,discont=true,color=red,axes=frame);

[Maple Plot]

Definir la siguiente funcin:

f(x) = abs(x-1) S x < -1

x^2 S -1 <= x <= 1

2x S x>1

> restart:
f:=x->
if x<-1 then x-1
elif -1<=x and x<=1 then x^2
else 2*x
fi:

> f(-5),f(1/2),f(5);

-6, 1/4, 10

Ciclos:

Un ciclo es un conjunto de ordenes y sentencias, que se repiten un determinado nmero de veces.

Existen varias formas de representar un ciclo Los ciclos for y seq se usan cuando se conoce el nmero de interacciones necesarias, mientras que el ciclo while se usa cuando las interacciones dependen de los resultados.

for:

Orden ........: for

Sintxis ......: for variable from inicio by incremento to final do sentencias od

Propsito ...: Repite sentencias una cantidad de veces igual a fin-inicio a intervalos representados por incremento .

Primeros nmeros naturales

> restar:
for i from 1 to 5 do i od;

1

2

3

4

5

Los 5 primeros nmeros primos.

> for i from 1 to 5 do ithprime(i) od;

2

3

5

7

11

Los primos comprendidos entre 100 y 150.

> restart:
for i from 100 to 150 do
if isprime(i) then print(i) fi;
od;

101

103

107

109

113

127

131

137

139

149

Ahora vamos a definir una matriz de 4 x 5, que cumple con la siguiente ley:

a[ij] = i^2*j^2

> restart:
A:=array(1..4,1..5);
for i from 1 to 4 do
for j from 1 to 5 do
A[i,j]:=i^2*j^2;
od;
od;
print(A);

A := array(1 .. 4,1 .. 5,[])

matrix([[1, 4, 9, 16, 25], [4, 16, 36, 64, 100], [9...

Maple al igual que la mayora del software de Clculo Cientfico, tiene funciones sobre operaciones con matrices, sin embargo haremos un programa que sume dos matrices.

> restart:
A:=array(1..3,1..2):
B:=array(1..3,1..2):
C:=array(1..3,1..2):
for i from 1 to 3 do
for j from 1 to 2 do
C[i,j]:=A[i,j]+B[i,j];
od;
od;
print(C);

matrix([[A[1,1]+B[1,1], A[1,2]+B[1,2]], [A[2,1]+B[2...

while:

Orden ........: while

Sintxis ......: while condicin do sentencias od

Propsito ...: Repite las sentencias mientras se cumpla la condicin.

Calculemos los primeros nmeros primos que suman menos de 10.

> restart:
suma:=0:i:=1:
while suma<10
do
if isprime(i) then
suma:=suma+i:
print(suma)
fi;
i:=i+1:
od;
print(i,` Primos que suman`, suma);

i := 2

2

i := 3

5

i := 4

i := 5

10

i := 6

6, ` Primos que suman`, 10

Combinados:

Las sentencias for y while pueden hacer parte de un mismo ciclo, estas sentencias tienen la siguiente forma:

for variable from inicio by incremento to fin while condicion do

sentencias

od

Tambin se puede escribir para que recorra una lista:

for variable in lista while condicion do

sentencias

do

Las sentecias se repetiran mientras la condicin sea cierta, la diferencia radica en que el recorrido se hace, linealmente desde inicio a fin , para el primer caso y secuencialmente sobre la lista en el segundo caso.

> restart:
lista:=x*y*z;
l1:=[1,2,3];
whattype(lista),nops(lista);
whattype(l1),nops(l1);

lista := x*y*z

l1 := [1, 2, 3]

`*`, 3

list, 3

> suma:=0:
suma1:=0:
for i to nops(l)
do
suma:=suma+op(i,l);
suma1:=suma1+op(i,l1)
od;

suma := l

suma1 := 1

Observe que se ha recorrido una lista y una expresin, quienes a su vez son los argiumentos del ciclo. La orden op , recupera el elemento i de la lista . Podriamos ejecutar el procedimiento anterior usando la orden in , para que recora la lista.

> suma:=0:
for i in lista do suma:=suma+i od;

suma := x

suma := x+y

suma := x+y+z

Procedimientos:

Los procedimientos son pequeos programas cuyo objtivo ser realizar una tarea especfica. los procedimientos forman las libreris.

Orden ........: proc

Sintxis ......: proc ( parmetros ) sentencias end ;

Propsito ....: Define un procedimiento el cual realizar las sentencias teniendo como variables los parmetros del argumento.

Una sucecin puede definirse como un procedimiento cuando su definicin tradicional sea complicada. Por ejemplo:

Presentar la sucuesin de los invesos de un nmero natural dado. Es decir si deseamos los 10 primeros nmeros de la sucesin, deberan aparecer, los 10 primeros inversos de los naturales, es decir:

1/(1^2) , 1/(2^2) , 1/(3^2) , 1/(4^2) , 1/(5^2) , 1/(6^2) , 1/(7^2) , 1/(8^2) ,....., 1/(i^2)

El algortmo para este programa podra ser::

1- Definir un vector de dimensin n, el cual guardar cada elemento.

2- Asignar a cada elemento del vector su correspondiente inverso.

> restart:
serie1:=proc(n) local A,i;
A:=array(1..1,1..n);
for i from 1 to n do
A[1,i]:=1/i^2 od;
print(A);
end:

> serie1(6);

matrix([[1, 1/4, 1/9, 1/16, 1/25, 1/36]])

Observar que el procedimiento asigna variables locales, es decir, variables que son propias de el, por lo tanto, no tendrn ningn valor fuera del procedimiento. En muchas ocasiones los parmetros de un procedimiento no son fijas, pero es posible controlar los parmetros de un procedimiento usando las funciones:

nargs....: Nmero de argumentos en el procedimiento.

args......: Lista de los argumentos

args[]....: Elemento de la lista.

> restart:
sumatoria:= proc() local suma,i;
suma:=0:
for i from 1 to nargs
do
suma:=suma+args[i];
od;
RETURN(suma);
end:

> sumatoria(2,2,5,6,7,8,9);

39

Nuestros programas van adquiriendo fuerza en la medida en que tengamos muchos procedimeitos, es algo asi como "ensearle" al compilador nuevas ordenes las que podemos usar como si fueran librerias. Sugerimos definir los procedimientos en un archivo especial.

Ejemplos:

A continuacin encontrar algunos ejercicios que nos permitiran ejercitarnos en la programacin de procedimientos para ser usados en nuestras practicasd e Maple.

1- Elabore un procedimiento que presente el mayor de una lista de numeros.

2- Elabore un procedimiento que presente la serie de Fibonacci.

3- Elabore un procedimiento que dibuje un crculo pequeo con centro en un punto que es el parmetro.

4. Elabore un procedimiento que trace las lineas corespondientes a las cordenadas rectangulares de un punto.

5- Elabore un procedimiento que calcule el mximo comn divisor de dos enteros usando el algortmo de Euclides.

6- Usando el Mtodo de Newton aproximar la raz cuadrada de 2.

7- Elaborar un procedimiento para calcular una aproximacin del nmero neperiano

1- El ms grande de un aserie de nmeros.

> restart:
Maximo:=proc() local rey,i;
rey:=args[1];
for i from 2 to nargs
do
if
args[i]>rey then
rey:=args[i];
fi;
od;
RETURN(rey);
end:

> Maximo(5,5,58,9);

58

2- Serie de Fibonacci.

> restart:
Fibo:=proc(n) local F,primero,segundo,i:
F:=array(1..1,1..n);
F[1,1]:=1:
F[1,2]:=1:
primero:=1:
segundo:=1:
for i from 3 to n
do
F[1,i]:=primero+segundo;
primero:=segundo;
segundo:=F[1,i];
od;
print(F);
end:

> Fibo(12);

matrix([[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]...

3- Una circunferencia con centro en un punto.

> restart:
Circulo:=proc(m,n) local ec,p1,p2;
ec:=(x-m)^2+(y-n)^2=.2;
with(plots):
p1:=implicitplot(ec,x=-m-5..m+5,y=-n-5..n+5,numpoints=2000):
p2:=plot([[m,n]],x=-m-5..m+5,y=-n-5..n+5,style=point):
display({p1,p2});
end:

> Circulo(3,2);

Warning, the name changecoords has been redefined

[Maple Plot]

4- Lneas a las coordenadas de un punto.

> restart:
PunCoor:=proc(x1,y1) local P1, P2, Punto;
P1:=plot([[x1,y1],[x1,0]],style=line,
linestyle=4,color=cyan);
P2:=plot([[x1,y1],[0,y1]],style=line,
linestyle=4,color=cyan);
Punto:=plot([[x1,y1]],style=point,color=black);
with(plots):
display({Punto,P1,P2});
end:

> PunCoor(2,3);

Warning, the name changecoords has been redefined

[Maple Plot]

Mximo Comn Divisor de dos enteros.

Usaremos la orden irem , que calcula el resto entero de la divisin de los argumentos.
EL algoritmo de Euclides, consiste en calcular el resto entre los nmeros consecutivamente hasta que sea 0.

> restart:
minu:=proc(m,n) local r,uno,dos;
uno:=m:
dos:=n:
while dos<>0
do
r:=irem(uno,dos);
uno:=dos;
dos:=r;
od;
RETURN(uno);
end:

> minu(12,20);

4

Como Maple , mantiene en memoria los ltimos resultados, podemos usar un algortmo un poca ms sencillo.

> mcd:=proc(x,y)
x:y:
while %<>0 do irem(%%,%) od;
print(%%);
end:

> mcd(112,210);

14

6- La aproximacin de la raz cuadrada de un nmero usando el algortmo de newton.

> restart:
raizcua:=proc(a,n) local valor,r;
valor:=0.5:
to n
do
r:=(valor+a/valor)/2;
valor:=r:
od;
print(sqrt(a)||`=`,valor);
end:

> raizcua(4,100);

sqrt(4) || `=`, 2.000000000

> for i from 1 to 5 do raizcua(2,i) od;

sqrt(2) || `=`, 2.250000000

sqrt(2) || `=`, 1.569444444

sqrt(2) || `=`, 1.421890364

sqrt(2) || `=`, 1.414234286

sqrt(2) || `=`, 1.414213562

>

Dependiendo del nmero de aproximaciones el valor se acercar al real, por esa razn hemos elaborado el procedimiento de tal forma que el usaurio determine el nmero de aproximaciones.