Vamos ahora a analizar una conjuntos de programas para la GAE en álgebra elemental. El propósito de estudiarlos es que el lector intente emplear estas ideas en otros problemas de matemáticas de su interés. Mathematica nos permite presentar los resultados de estos programas de distintas formas. De hecho, podemos usar Mathematica como un editor de textos para la confección de un examen o prueba. Sin embargo, en este trabajo se intentará dar la salida de los programas para la GAE, de forma tal que su transición a código LATEX o TEX sea sencilla.
ok = True; While[ok == True, a = Random[Integer, {2, 40}]; b = Random[Integer, {2, 40}]; c = Random[Integer, {2, 40}]; If[c^2 == a^2 + b^2, ok = False] ] Print["{(", a, ",", b, ",", c ")}" ]La variable
ok
nos permite determinar si se ha hallado o no una terna pitagórica. Dicha variable se mantendrá con valor de verdad igual a True toda vez que no se haya conseguido el resultado esperado. Las asignacionesa = Random[Integer, {2, 40}]; b = Random[Integer, {2, 40}]; c = Random[Integer, {2, 40}];generan tres números enteros aleatorios cuyos valores se encuentra entre 2 y 40. Preguntamos luego si dichos números satisfacen la igualdad pitagórica
c^2 == a^2 + b^2
o bien
c2 = a2 + b2. En el caso de que la terna sea pitagórica se hace la variable ok=False
.
La buena programación insta a garantizar que los ciclos que se programen, eventualmente terminen. Nosotros hemos obviado este detalle. Si el rango en que se buscan los números es
"amplio" y la computadora es "rápida", el programa dará una respuesta casi instantánea. Además en el menú de Mathematica denominado kernel existe una opción llamada abort evaluation que puede suspender la ejecución del programa.
Una solución un poco más elegante es definir un contador que registre cuántas iteraciones se han llevado a cabo y que dé por terminado el proceso si se excede un número de iteraciones preestablecidas. Con el fin de simplificar el código de los programas, en este ejemplo y en los siguientes, nos abstendremos de esta práctica.
Al ejecutar el programa anterior, obtenemos en un caso {(20, 15, 25)}. Con el código presentado, no hay garantía de que esta tripleta vuelva a aparecer en una futura corrida del programa. Por supuesto es posible modificar el código para que se determine si esto ocurre o no. No obstante, esta mejora, en muchas ocasiones, no es necesaria y también la omitiremos.
Consideremos ahora el problema de calcular el área de un triángulo rectángulo cuando conocemos (respectivamente) las proyecciones x y y de los catetos a y b sobre la hipotenusa c. Tratemos de confeccionar un ejercicio en el que todas las cantidades involucradas sean enteras, las longitudes de las proyecciones estén entre las 2 y 200 unidades y el área sea inferior a 1000 unidades cuadradas. El código es el siguiente:
ok = True; EsT[a_, b_, c_] := And[a + b > c, a + c > b, b + c > a] While[ok == True, x = Random[Integer, {2, 200}]; y = Random[Integer, {2, 200}]; a = Sqrt[x(x + y)]; b = Sqrt[y(x + y)]; h = Sqrt[x y]; area = (x + y) h /2; If[And[ area == Round[area], area < 1000, area != x y, x < y, EsT[a, x, h], EsT[b, h, y], EsT[a, b, y + x] ] , ok = False] ] Print["{", x, "}{", y, "}{", area, "}"]En este caso empezamos definiendo una función llamada EsT que se encarga de regresar True si los valores a, b y c satisfacen la desigualdad triangular y False en el caso contrario. Se supone además que EsT se aplicará solo a cantidades positivas. La variable ok se inicia en True y se mantiene así toda vez que no se cumplan las condiciones posteriormente estipuladas. En cada iteración del ciclo se generan dos candidatos para ser las proyecciones deseadas. De ser así se cumplirá entonces que a = y b = y(x + y). Además la altura sobre la hipotenusa estará dada por h = .
Veamos las condiciones. Para que el área se entera se debe cumplir que al aplicar la función Round, se obtenga el mismo valor. La condición area < 1000 es clara. La restricción area x se agrega pues después de varias corridas, esta situación (no deseada) ocurría con demasiada regularidad. Con el propósito de estar seguros que los valores generados realmente tienen sentido (además de ejemplificar el uso de las funciones), aplicamos entonces la función EsT a los 3 triángulos involucrados.
Una salida típica de este programa es {4}{9}{39}.
c1 = Random[Integer, {-8, 8}]; c2 = Random[Integer, {-8, 8}]; c3 = Random[Integer, {-8, 8}]; c4 = Random[Integer, {-8, 8}]; ecua = (c1 x + c2)(c3 x + c4) == c2 c4 sol = Solve[ecua, x]Primero generamos los coeficientes, después construimos la ecuación y finalmente la resolvemos. Si tuviéramos algún interés en controlar el tipo de solución, podemos insertar este código en un ciclo y agregar ahí los requisitos deseados.
En una corrida típica obtenemos (2 - 4x)(- 8 - 3x) = - 16 cuya solución está dada por x = - y x = 0.
fl1 = x y^(Random[Integer, {0, 2}])z^(Random[Integer, {0, 2}]); fl2 = a^(Random[Integer, {0, 2}]) b^(Random[Integer, {0, 2}]) c^(Random[Integer, {0, 2}]); ld = Random[Integer, {1, 8}] fl1 + Random[Integer, {-8, 8}] fl2; li = Random[Integer, {1, 8}] fl1 + Random[Integer, {-8, 8}] fl2; ecua = li == ld sol = Solve[ecua, x]La primera instrucción se encarga de generar un factor literal que contenga la variable x y que pueda contener las variables y y z hasta grado 2 inclusive. Al incluir el 0 en rango de la función Random, esto hace que eventualmente la variable y o z no aparezcan. El lado derecho de la ecuación ld se construye combinando los factores literales fl1 fl2. Análogamente se procede con el lado izquierdo de la ecuación, li. Finalmente se resuelve la ecuación desarrollada.
En una corrida típica se genera - bc + xy = 8bc + 7xy con solución x = - .
ok = True; EsT[a_, b_, c_] := And[a + b > c, a + c > b, b + c > a] While[ok == True, a = Random[Integer, {2, 200}]; b = Random[Integer, {2, 200}]; c = Random[Integer, {2, 200}]; s = (a + b + c)/2; area = Sqrt[Abs[s(s - a)(s - b)(s - c)]]; hab = 2 area/c; hac = 2 area/b; hbc = 2 area/a; sh = hab + hac + hbc; If[And[Denominator[sh] < 5, a != b, b != c, a != c, area < 800, EsT[a, b, c] ] , ok = False] ] Print["{", a, "}{", b, "}{", c, "}{", sh, "}"]La función Est es la misma que se empleó en el ejemplo 2. La variable ok es para mantenerse en el ciclo toda vez que no se satisfagan las condiciones deseadas.
Iniciamos generando tres candidatos para las medidas del ABC en cuestión. El lado con media a se opone a A y así sucesivamente con los otros elementos. La idea es aplicar la fórmula de Herón:
A = , y por lo tanto, hab = . Esto explica las instrucciones hab = 2area/c;, hac = 2area/b; y hbc = 2area/a;. Con el fin de que la expresión correspondiente a la suma de las alturas tenga un aspecto no muy complejo, solicitamos que el denominador de esta suma no sea mayor que 5. Pedimos además que a b, b c, a c y que el área sea inferior a las 800 unidades cuadradas.
Una corrida típica de este programa arroja 243228
x = Random[Integer, {-10, 20}]/Random[Integer, {3, 20}]; y = Random[Integer, {-10, 20}]/Random[Integer, {3, 20}]; Print["Ejercicio sumar:"] Print["@frac{", Numerator[x], "}{", Denominator[x], "}+ @frac{", Numerator[y], "}{", Denominator[y], "}"] z = x + y; Print["Opcion A:"] Print["@frac{", Numerator[z], "}{", Denominator[z], "}"] z = Max[x, y] - Min[x, y]; Print["Opcion B:"] Print["@frac{", Numerator[z], "}{", Denominator[z], "}"] z = Max[x, y]*Min[x, y]; Print["Opcion C:"] Print["@frac{", Numerator[z], "}{", Denominator[z], "}"] z = x/y; Print["Opcion D:"] Print["@frac{", Numerator[z], "}{", Denominator[z], "}"]Iniciamos generando dos fracciones x y y. Tanto el numerador de x como y son valores entre -10 y 20. Los denominadores son valores entre 3 y 20. Mathematica se encarga de simplificar la fracción, en el caso de que sea necesario. Usamos @ en lugar del \ debido a que el caracter \f es una instrucción especial de Mathematica. Una vez generado el código, se debe realizar un proceso de encuentre/reemplace para convertir @frac en \frac.
La opción correcta es z = x + y. Usando las funciones Numerator y Denominator para tomar el numerador y el denominador de las expresiones involucradas. En la segunda opción se toma la diferencia entre el máximo de x y y y mínimo de los mismos. En la opción siguiente se usa como distractor el producto entre el máximo y el mínimo de x y y. En la última opción se usa como distractor el cociente entre x y y. En este último caso, Mathematica se encarga de efectuar la simplificación correspondiente.
Una salida típica de este programa es:
Ejercicio sumar: @frac{ -1 }{ 16 }+@frac{ 19 }{ 10 } Opcion A: @frac{ 147 }{ 80 } Opcion B: @frac{ 157 }{ 80 } Opcion C: @frac{ -19 }{ 160 } Opcion D: @frac{ -5 }{ 152 }Este código lo podemos arreglar convenientemente para obtener el siguiente ítem. Observe.
Al efectuar la suma - + , obtenemos:
exp1 = Random[Integer, {-2, 2}] a + Random[Integer, {-8, 8}] b + Random[Integer, {-8, 8}] c exp2 = Random[Integer, {-2, 2}] a + Random[Integer, {-8, 8}] b + Random[Integer, {-8, 8}] c f1 = Random[Integer, {-5, 5}] x^(exp1) f2 = Random[Integer, {-5, 7}] x^(exp2) expre = f1 f2Comenzamos construyendo los exponentes de los monomios. Para ello usamos las variables exp1 y exp2. Seguidamente formamos los monomios f1 y f2. Seguidamente efectuamos el producto que, como sabemos, Mathematica se encarga de simplificar.
Una corrida típica de este programa nos produce un ejercicio tal como
ok = True; While[ok == True, p = Random[Integer, {2, 4}]; q = Random[Integer, {2, 4}]; r = Random[Integer, {2, 4}]; P = Sum[(Random[Integer, {-4, 4}])x^k, {k, 0, p}] ; Q = Sum[(Random[Integer, {-4, 4}])x^k, {k, 0, q}]; R = Sum[(Random[Integer, {-4, 4}])x^k, {k, 0, r}] ; W = Expand[P (Q - R)]; If[Length[W] < 5, ok = False]; ] P Q R WComo de costumbre, la variable ok nos mantiene en el ciclo mientras no se hallado el resultado solicitado. Comenzamos definiendo el grado de los polinomios con los que vamos a trabajar. Estos grados se hallan entre 2 y 4. Usando el comando Sum construimos los polinomios P, Q y R. En W almacenamos el resultado de desarrollar P(Q - R). Como no queremos que W exceda los 4 términos, nos mantenemos en el ciclo toda vez que su longitud sea mayor o igual que 4.
Una corrida típica del programa genera un ejercicio como:
ok = True; While[ok == True, a = Random[Integer, {1, 200}]; b = Random[Integer, {1, 200}]; c = Random[Integer, {1, 200}]; If[And[a < b + c, b < a + c, c < a + b, a < b, b < c, c^2 < a^2 + b^2] , ok = False] ] Datos a b g = ArcCos[c^2 - a^2 - b^2/(-2 a b)]; g 180.0/Pi Respuesta c Distractores d1 = c + (-1)^(Random[Integer, {0, 1}]) * Random[Integer, {1, 10}] d2 = c + (-1)^(Random[Integer, {0, 1}]) * Random[Integer, {1, 10}] d3 = c + (-1)^(Random[Integer, {0, 1}]) * Random[Integer, {1, 10}]Después de generar valores aleatorios entre 1 y 200 para las variables a, b y c, verificamos la desigualdad triangular, comprobamos que a < b < c y que el triángulo generado sea acutángulo. Usando la ley de cosenos obtenemos el ángulo que se opone al lado c. La información que suministramos al estudiante es entonces a, b y g. La respuesta es c. Seguidamente calculamos 3 distractores d1, d2 y d3 usando la función Random.
c1 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}]; c2 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}]; c3 = Random[Integer, {-8, 8}]; c4 = Random[Integer, {-8, 8}]; c5 = Random[Integer, {-8, 8}]; c6 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}]; c7 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}]; c8 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}]; c9 = Random[Integer, {-8, 8}]/Random[Integer, {1, 1}]; If[Random[] < 0.5, d = c4(c1 x + c2) + c5(c6 x + c7) < c3(c8 x + c9) , d = c4(c1 x + c2) + c5(c6 x + c7) > c3(c8 x + c9)] RD = Module[{li, ld, s, t}, li = d[[1]]; ld = d[[2]]; s = Solve[li == ld][[1]][[1]][[2]]; Print[s]; t = s - 1; If[d /. x -> t, TeXForm["{", d, "}{", x < s, "}"], TeXForm["{", d, "}{", x > s, "}"] ]]En este último ejemplo no vamos a explicar con detalle el código, esto con el propósito de dejarlo como ejercicio para el lector.
Una corrida típica de este programa proporcionó el siguiente resultado:
{,8\,\left( -6 - 3\,x \right) > 7\,\left( -7 - 2\,x \right) ,}{,x < \frac{1}{10},}Después de arreglarlo convenientemente obtenemos:
Revista Matemática, Educación e Internet
Derechos Reservados