| | | |

Minicurso de Python para Matemáticas

Ajude a manter o site livre, gratuito e sem propagandas. Colabore!

3 Elementos de la programación estructurada

En la programación estructurada, los comandos de programación se ejecutan en secuencia, un nuevo comando se inicia solo después de que termina el procesamiento del comando anterior. En Python, cada línea consta de un comando, el programa comienza en la primera línea y termina en la última línea del código. Las instrucciones de ramificación permiten la selección on-the-fly de bloques de comandos, mientras que las instrucciones de repetición permiten la ejecución repetida de un bloque. La definición de función permite la creación de un sub-código (sub-programa) del código.

3.1 Ramificación

Una estructura de ramificación es una instrucción if-[elif-...-elif-else] para la toma de decisiones durante la ejecución de un programa.

3.1.1 if

Por ejemplo, el código siguiente calcula las raíces reales del polinomio

p(x)=ax2+bx+c, (19)

con a, b y c asignados al inicio del código.

1import math as m
2a = 1.
3b = -1.
4c = -2.
5dlta = b**2 - 4.*a*c
6if (dlta >= 0.):
7 x1 = (-b - m.sqrt(dlta))/(2.*a)
8 x2 = (-b + m.sqrt(dlta))/(2.*a)
9 print('x1 =', x1)
10 print('x2 =', x2)
x1 = -1.0
x2 = 2.0

En este código, el bloque de comandos (líneas 7-10) se ejecuta solo si el discriminante del polinomio es no negativo. ¡Verificar! Cambie los valores de a, b y c para que p tenga raíces complejas.

Observación 3.1.1.(Indentación)

En las líneas 7-10 del código anterior, la indentación de los comandos es obligatoria. El bloque de comandos indentados indica el alcance de la instrucción if.

3.1.2 if-else

Vamos a modificar el código anterior, de modo que las raíces complejas se calculen e impriman cuando sea necesario.

1import math as m
2a = 1.
3b = -4.
4c = 8.
5dlta = b**2 - 4.*a*c
6if (dlta >= 0.):
7 # raízes reais
8 x1 = (-b - m.sqrt(dlta))/(2.*a)
9 x2 = (-b + m.sqrt(dlta))/(2.*a)
10else:
11 # raízes complexas
12 rea = -b/(2.*a)
13 img = m.sqrt(-dlta)/(2.*a)
14 x1 = rea - img*1j
15 x2 = rea + img*1j
16print('x1 =', x1)
17print('x2 =', x2)
x1 = (2-2j)
x2 = (2+2j)
Observación 3.1.2.(Número complejo)

En Python, los números complejos pueden ser asignados como objetos de la clase complex. El número imaginario i=1 se denota por 1j y un número completo a+bi por a + b*1j.

3.1.3 if-elif-else

La instrucción elif es una conjunción de una secuencia de instrucciones else-if. Vamos a modificar el código anterior, de modo que el caso de raíces reales dobles se compute de manera apropiada.

1import math as m
2a = 1.
3b = 2.
4c = 1.
5dlta = b**2 - 4.*a*c
6if (dlta > 0.):
7 # raízes reais
8 x1 = (-b - m.sqrt(dlta))/(2.*a)
9 x2 = (-b + m.sqrt(dlta))/(2.*a)
10elif (dlta == 0.):
11 x1 = x2 = -b/(2.*a)
12else:
13 # raízes complexas
14 rea = -b/(2.*a)
15 img = m.sqrt(-dlta)/(2.*a)
16 x1 = rea - img*1j
17 x2 = rea + img*1j
18print('x1 =', x1)
19print('x2 =', x2)
x1 = -1.0
x2 = -1.0
Ejercicio 3.1.1.

Desarrolle un código para calcular la raíz del polinomio

f(x)=ax+b (20)

con datos dados a y b. El código debe manejar todos los casos posibles, a saber:

  1. a)

    única raíz (a0).

  2. b)

    infinitas raíces (a=b=0).

  3. c)

    no existe raíz (a=0 y b0).

Respuesta 0.
1# parámetros
2a = 2.
3b = 1.
4# raíz
5if (a != 0.):
6 x = -b/a
7 print('raíz única x = ', x)
8elif (b == 0.):
9 print('infinitas raíces x')
10else:
11 print('no existe raíz')
Ejercicio 3.1.2.

Desarrolle un código en el que dados tres puntos A, B y C en el plano, verifique si ABC determina un triángulo. Si es afirmativo, clasifíquelo como un triángulo equilátero, isósceles o escaleno.

Respuesta 0.
1import math
2# pts
3A = (0., 0.)
4B = (3., 0.)
5C = (3., 4.)
6# long. lados
7lado_1 = math.sqrt((B[0]-A[0])**2 + (B[1]-A[1])**2)
8lado_2 = math.sqrt((C[0]-B[0])**2 + (C[1]-B[1])**2)
9lado_3 = math.sqrt((C[0]-A[0])**2 + (C[1]-A[1])**2)
10# triangulo?
11if (lado_1 + lado_2 > lado_3) and \
12 (lado_1 + lado_3 > lado_2) and \
13 (lado_2 + lado_3 > lado_1):
14 print('ABC é triângulo:')
15 # equilátero?
16 if lado_1 == lado_2 == lado_3:
17 print('\tequilátero')
18 elif (lado_1 != lado_2 != lado_3):
19 print('\tescaleno')
20 else:
21 print('\tisósceles')
22else:
23 print('ABC não é triângulo')

3.2 Repetición

Las estructuras de repetición son instrucciones que permiten la ejecución repetida de un bloque de comandos. Hay dos instrucciones disponibles while y for.

3.2.1 while

La instrucción while permite la repetición de un bloque de comandos, mientras una condición dada sea verdadera.

Por ejemplo, el siguiente código calcula e imprime los elementos de la secuencia de Fibonacci999Leonardo Fibonacci, 1170 - 1250, matemático italiano. Fonte: Wikipédia: Leonardo Fibonacci., mientras sean menores que 10.

1n = 1
2print(n)
3m = 1
4print(m)
5while (n+m < 10):
6 s = m
7 m += n
8 n = s
9 print(m)

Verifique!

Observación 3.2.1.(Instrucciones de control)

Las instrucciones de control break, continue son bastante útiles en varias situaciones. La primera, detiene las repeticiones y, la segunda, salta a una nueva repetición.

Ejercicio 3.2.1.

Use while para imprimir los diez primeros números impares.

Respuesta 0.
1i = 1
2c = 0
3while (c < 10):
4 print(i)
5 i += 2
6 c += 1
Ejercicio 3.2.2.

Una aplicación del Método Babilónico101010Matemática Babilónica, matemática desarrollada en Mesopotamia, desde los Sumerios hasta la caída de Babilonia en 539 a.C.. Fuente: Wikipedia. para la aproximación de la solución de la ecuación x22=0, consiste en la iteración

x0=1, (21)
xi+1=xi2+1xi,i=0,1,2, (22)

Haga un código con while para calcular la aproximación xi, tal que |xi+1xi|<107.

Respuesta 0.
1import math
2x0 = 1.
3x = x0/2 + 1/x0
4while (math.fabs(x - x0) >= 1e-7):
5 x0 = x
6 x = x0/2 + 1/x0
7print(x)

3.2.2 for

La instrucción for permite la ejecución iterada de un bloque de comandos. Dado un objeto iterable, en cada lazo se toma un nuevo elemento del objeto. Por ejemplo, el siguiente código calcula e imprime los primeros 6 elementos de la secuencia de Fibonacci.

1n = 1
2print(f'1: {n}')
3m = 1
4print(f'2: {m}')
5for i in [3,4,5,6]:
6 s = m
7 m += n
8 n = s
9 print(f'{i}: {m}')

¡Verificar!

3.2.3 range

La función range([start,]stop[,sep]) es particularmente útil en la construcción de instrucciones for. Crea un objeto de clase iterable de start (incluido) a stop (excluido), con elementos igualmente separados por sep. Por defecto, start=0, sep=1 si se omiten. Por ejemplo, el código anterior puede reescribirse como sigue.

1n = 1
2print(f'1: {n}')
3m = 1
4print(f'2: {m}')
5for i in range(3,7):
6 s = m
7 m += n
8 n = s
9 print(f'{i}: {m}')

¡Verificar!

Ejercicio 3.2.3.

Dado n, desarrolle un código para calcular el valor de la suma armónica

k=1n1k=11+12++1n. (23)
Respuesta 0.
1n = 10
2s = 0.
3for i in range(1,n+1):
4 s += 1./i
5print(s)
Ejercicio 3.2.4.

Desarrolle un código para calcular el factorial de un número natural dado n. Consejo: use math.factorial para verificar su código.

Respuesta 0.
1n = 5
2fact = 1
3for i in range(1, n+1):
4 fact *= i
5print(fact)

3.3 Funciones

En Python, una función se define con la instrucción def. Por ejemplo, el siguiente código implementa la función

f(x)=2x3 (24)

e imprime el valor de f(2).

1 def f(x):
2 y = 2*x - 3
3 return x
4
5z = f(2)
6print(f'f(2) = {z}')
f(2) = 2
Observación 3.3.1.

Para funciones pequeñas, puede usarse la instrucción lambda de funciones anónimas. Por ejemplo,

1f = lambda x: 2*x - 3
2print(f'f(3) = {f(3)}')
f(3) = 3
Exemplo 3.3.1.(Funciones con parámetros)

El siguiente código implementa el polinomio de primer grado

p(x)=ax+b, (25)

con parámetros predeterminados a=1 y b=0 (función identidad).

1def p(x, a=1., b=0.):
2 y = a*x + b
3 return y
4
5print('p(2) =', p(2.))
6print('p(2, 3, -5) =', p(2., 3., -5.))
Ejercicio 3.3.1.

Implemente una función para calcular las raíces de un polinomio de grado 2 p(x)=ax2+bx+c.

Respuesta 0.
1import math
2def raiz_poli2(a, b, c):
3 dlta = b**2 - 4.*a*c
4 if (dlta > 0.):
5 x1 = (-b + math.sqrt(dlta))/(2.*a)
6 x2 = (-b - math.sqrt(dlta))/(2.*a)
7 elif (dlta == 0.):
8 x1 = -b/(2.*a)
9 x2 = x1
10 else:
11 x1 = None
12 x2 = None
13 return x1, x2
Ejercicio 3.3.2.

Implemente una función que calcula el producto escalar de dos vectores

x=(x0,x1,,xn1), (26)
y=(y0,y1,,yn1). (27)

Consejo: considere que los vectores se asignan con lists.

Respuesta 0.
1def dot(x, y):
2 s = 0.
3 for xi, yi in zip(x,y):
4 s += xi*yi
5 return s
Ejercicio 3.3.3.

Implemente una función que calcula el determinante de matrices 2×2. Consejo: considere que la matriz se asigna con un list encadenado.

Respuesta 0.
1def det(A):
2 d = A[0][0]*A[1][1] \
3 - A[0][1]*A[1][0]
4 return d
Ejercicio 3.3.4.

Implemente una función que calcula la multiplicación matriz - vector Ax, con A matriz 2×2 y x un vector de dos elementos. Asuma que la matriz y el vector se asignan usando list.

Respuesta 0.
1def matVet(A, x):
2 n = len(A)
3 y = [0.]*n
4 for i in range(n):
5 for j in range(n):
6 y[i] += A[i][j]*x[j]
7 return y

Envie seu comentário

Aproveito para agradecer a todas/os que de forma assídua ou esporádica contribuem enviando correções, sugestões e críticas!

Opcional. Preencha seu nome para que eu possa lhe contatar.
Opcional. Preencha seu e-mail para que eu possa lhe contatar.
As informações preenchidas são enviadas por e-mail para o desenvolvedor do site e tratadas de forma privada. Consulte a política de uso de dados para mais informações.

Licença Creative Commons
Este texto é disponibilizado nos termos da Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional. Ícones e elementos gráficos podem estar sujeitos a condições adicionais.

Pedro H A Konzen
| | | |