6.2 Tarea (Nota 2)

Para cada punto, implemente un programa principal que permita probar el o los subprogramas requeridos, solicitando al usuario que ingrese todos los valores que requieran los parámetros de dichos subprogramas.

A menos que explicitamente se pida un solución recursiva, todas las soluciones deben ser iterativas.

Las únicas funciones que pueden utilizar son las que ustedes mismos implementarán, más la selección de funciones internas básicas que se referenciaron en Parte 1. Elementos Básicos. No deben utilizar el operador **, ni funciones de algún módulo, a menos que sea para comparar resultados con respecto a sus funciones.

Haga un adecuado ANÁLISIS, DISEÑO e IMPLEMENTACIÓN EN PYTHON de:

  1. Una función para solicitar por pantalla un número entero mayor a un valor de un primer parámetro y menor a un valor de un segundo parámetro. Ambos parámetros deberán ser opcionales y con None como valor predeterminado. El valor None tiene como objetivo indicar que no debe haber restricción para el entero que se va a recibir en el o los extremos que correspondan. La función debe solicitar por pantalla el número entero tantas veces como sea necesario hasta que se ingrese un valor válido, es decir dentro del rango definido por los valores dados en los dos parámetros de la función. La función debe devolver el valor entero ingresado por el usuario que esté dentro del rango.

  2. Una función para realizar lo mismo que la función del punto anterior pero con un número real.

  3. Un procedimiento para probar una función computacional dada, un número no predefinido de veces, con diferentes valores para sus parámetros, valores solicitados por pantalla e ingresados por el usuario.

  4. Una función que devuelva verdadero o falso (valor booleano) dependiendo de si los valores que recibe la función para los parámetros asociados al año, al mes y al día corresponden a una fecha válida en el calendario gregoriano.

  5. Una función que devuelva verdadero o falso (valor booleano) dependiendo de si el número entero mayor que uno que recibe la función es primo o no lo es.

  6. Una función que devuelva el mayor de un número no predefinido de valores enteros solicitados por pantalla e ingresados por el usuario.

  7. Dos funciones, una que devuelva en grados Fahrenheit una temperatura recibida en grados centigrados y la otra que devuelva en grados centigrados una temperatura recibida en grados Fahrenheit.

  8. Una función con una solución ITERATIVA y una función RECURSIVA que devuelva la potencia \(n\)-ésima de un número real dado, para \(n\) un entero dado.

  9. Una función con una solución ITERATIVA y una función RECURSIVA que devuelva el término \(n\)-ésimo de la sucesión (de los números) de Fibonacci para \(n\) un entero positivo dado.

  10. Una función (con una solución ITERATIVA) que devuelva una aproximación para el número áureo \(\varphi\), dado un número real positivo cercano a cero \((\varepsilon)\) para la condición de parada. Tenga en cuenta que \(\varphi = \lim_{n \to \infty} \frac{F_{n+1}}{F_n}\).

  11. Una función con una solución ITERATIVA y una función RECURSIVA que devuelva el máximo común divisor de dos números enteros dados.

  12. Una función que utilice una de las funciones del punto anterior (función para el cálculo del máximo común divisor) y que devuelva el mínimo común múltiplo de dos números enteros dados.

  13. Una función que devuelva el valor absoluto de un número real dado.

  14. Una función que devuelva el valor de la función signo para un número real dado.

  15. Una función que devuelva el factorial de un número entero no negativo dado.

  16. Una función que devuelva el número de reordenamientos posibles de \(r\) elementos sin repeticiones de un conjunto de \(n\) elementos, con \(n\) y \(r \leq n\) números enteros no negativos dados.

    • Tenga en cuenta:

      • El número de permutaciones sin elementos repetidos es \(P(n, r) = n P r = \frac{n!}{(n-r)!}\).
      • La solución debe tener un menor número de multiplicaciones que simplemente hacer Factorial(n) / Factorial(n-r) para una función Factorial que calcula el factorial de un número entero no negativo.
  17. Una función que devuelva el número de formas posibles de escoger subconjuntos de \(r\) elementos de un conjunto de \(n\) elementos, con \(n\) y \(r \leq n\) números enteros no negativos dados.

    • Tenga en cuenta:

      • El número de combinaciones (coeficiente binomial) es \(C(n, r) = n C r = \binom{n}{r} = \frac{n!}{r!(n-r)!}\).
      • La solución debe ser computacionalmente mejor (debe tener un menor número total de operaciones/multiplicaciones) que Factorial(n) / (Factorial(r) * Factorial(n-r)) o Permutacion(n,r) / Factorial(r).
  18. Una función que devuelva una aproximación de \(\exp(x) = \mathrm{e}^x\) de un número real positivo dado.

    • Debe recibir un número real \((x)\) y, para la condición de parada, un número real positivo cercano a cero \((\varepsilon)\).

    • Debe devolver como resultado un número real.

    • Además tenga en cuenta:

      • \(e^{x} = \sum_{i = 0}^{\infty} \frac{x^{i}}{i!}\).
      • \(e^{x} = \frac{1}{e^{-x}}\), para quedarme con \(x > 0\).
      • \(e^{x} = e^{n + r} = \left( e^n \right) \left( e^r \right)\) con \(x > 0\), \(n\) un entero no negativo y \(0 < r < 1\).
      • \(e^{n} = \underbrace{e^{1} \dots e^{1}}_{n \text{ veces}}\) (cuando se requiera, pueden poner al computador a calcular \(e^{1}\) una única vez por ejecución del subalgoritmo o tomar \(e \approx 2.718281828459045\)).
  19. Una función que devuelva una aproximación del logaritmo natural de un número real positivo dado.

    • Debe recibir un número real positivo \((x)\) y, para la condición de parada, un número real positivo cercano a cero \((\varepsilon)\).

    • Debe devolver como resultado un número real.

    • Además tenga en cuenta:

      • \(\ln(x) = 2 \sum\limits_{k = 0}^{\infty} \frac{1}{2k+1}\left(\frac{x-1}{x+1}\right)^{2k+1}\).
      • \(\ln(x) = \ln\left((r) \left(10^p\right)\right) = \ln(r) + p \ln\left(10\right)\), con \(x > 0\), \(p\) un entero no negativo y \(0 < r < 10\) (cuando se requiera, pueden poner al computador a calcular \(\ln(10)\) una única vez por ejecución del subalgoritmo o tomar \(\ln(10) \approx 2.302585092994046\)).
    • ¿Puede realizar un refinamiento adicional usando esta igualdad: \(\ln(x) = -\ln\left(\frac{1}{x}\right)\)?

  20. Dos funciones que devuelvan una aproximación de la raíz cuadrada de un número real dado.

    • Deben recibir un número real \((x)\) y, para la condición de parada, un número real positivo cercano a cero \((\varepsilon)\).

    • Deben devolver como resultado un número real cuando se recibe un número real no negativo y un número complejo con parte imaginaria diferente de cero cuando se recibe un número real negativo.

    • Además tenga en cuenta:

      • Para una de las funciones utilizar el método o algoritmo babilónico.
      • Para la otra función utilizar esta igualdad: \(\sqrt{x} = \exp \left( \frac{ \ln(x) }{ 2 } \right)\) con \(x\) número real positivo.
    • ¿Puede realizar un refinamiento adicional usando \(\sqrt{x} = \frac{1}{\sqrt{1/x}}\) y \(\sqrt{x} = \sqrt{4^p r} = 2^p \sqrt{r}\), con \(x > 1\), \(p\) un entero no negativo y \(1 < r < 4\)?

  21. Una función que devuelva una aproximación del logaritmo natural de un número real positivo dado.

    • Debe recibir un número real positivo \((x)\) y, para la condición de parada, un número real positivo cercano a cero \((\varepsilon)\).

    • Debe devolver como resultado un número real.

    • Además tenga en cuenta:

      • Crear una función que devuelva una aproximación de la media aritmético-geométrica de dos números dados.
      • Usar la media aritmético-geométrica para obtener el logaritmo natural (por ejemplo, consultar este enlace).
    • ¿Puede realizar un refinamiento adicional usando esta igualdad: \(\ln(x) = -\ln\left(\frac{1}{x}\right)\)?

  22. Una función que devuelva una aproximación de \(\exp(x) = \mathrm{e}^x\) para un número real positivo dado, usando la función del punto anterior (función del logaritmo natural) y la función root_newton_raphson() (sin modificación alguna con respecto a la vista en clase). La función también deberá recibir un valor inicial x_ini, un epsilon eps y un máximo de iteraciones max_iter para que los correspondientes valores recibidos le sean entregados a la función root_newton_raphson().

  23. Una función que devuelva un número real que sea una aproximación de \(a^b\) para \(b\) un número real dado y \(a\) un número real no negativo dado.

    • Tenga en cuenta que \(a^b = \exp \left( b \ln(a) \right)\) con \(a\) número real positivo.
  24. Una función que devuelva una aproximación para el número \(\pi\), dado un número real positivo cercano a cero \((\varepsilon)\) para la condición de parada.

    • Tenga en cuenta que \(\frac{\pi}{4} = 4 \arctan \left(\frac{1}{5}\right) - \arctan \left(\frac{1}{239}\right)\) y que \(\arctan(x) \approx \sum\limits_{i = 0}^{n} \frac{(-1)^i}{2i+1}x^{2i+1}\).
  25. Dos funciones, una que devuelva el seno de un número real dado y otra que devuelva el coseno.

    • Deben recibir un número real \((x)\) y, para la condición de parada, un número real positivo cercano a cero \((\varepsilon)\).

    • Deben devolver como resultado un número real.

    • Además tenga en cuenta:

      • \(\sin(x) = \sum\limits_{i = 0}^{\infty} \frac{(-1)^i}{(2i+1)!} x^{2i+1}\).
      • \(\sin(x) = -\sin(-x)\), para quedarme con \(x > 0\).
      • \(\sin(x) = \sin(x - 2 k \pi)\), para quedarme con \(0 < x < 2 \pi\) (cuando se requiera, pueden poner al computador a calcular \(\pi\) una única vez por ejecución del subalgoritmo o tomar \(\pi \approx 3.141592653589793\)).
      • Si \(\pi \leq x < 2 \pi\), \(\sin(x) = -\sin(x - \pi)\), para quedarme con \(0 < x < \pi\).
      • Si \(\frac{\pi}{2} \leq x < \pi\), \(\sin(x) = \sin(\pi - x)\), para quedarme con \(0 < x < \frac{\pi}{2}\).
      • Si \(\frac{\pi}{4} \leq x < \frac{\pi}{2}\), \(\sin(x) = \cos\left(\frac{\pi}{2} - x\right)\), para quedarme con \(0 < x < \frac{\pi}{4}\).
      • \(\cos(x) = \sin\left(\frac{\pi}{2} - x\right)\).
  26. Tres funciones que devuelvan, respectivamente, el arco tangente, el arco seno y el arco coseno de un valor dado.

    • Deben recibir un número real \((x)\) y, para la condición de parada, un número real positivo cercano a cero \((\varepsilon)\).

    • Deben devolver como resultado un número real.

    • Además tenga en cuenta:

      • \(\arctan(x) = \sum_{i = 0}^{\infty} \frac{(-1)^i}{2i+1}x^{2i+1}\).
      • \(\arctan(x) = - \arctan(-x)\), para quedarme con \(x > 0\).
      • \(\arctan(x) = \frac{\pi}{2} - \arctan\left(\frac{1}{x}\right)\), para quedarme con \(x \leq 1\).
      • \(\arctan(x) = \frac{\pi}{6} + \arctan \left( \frac{\sqrt{3} x - 1}{\sqrt{3} + x} \right)\), para quedarme con \(x \leq 2 - \sqrt{3}\) (cuando se requiere, pueden poner a calcular \(\sqrt{3}\) una única vez por ejecución o tomar \(\sqrt{3} \approx 1.732050807568877\)).
      • \(\arcsin(x) = \arctan\left( \frac{x}{\sqrt{1 - x^2}} \right)\) (El subalgoritmo para la raíz cuadrada debío analizarse, diseñarse e implementarse en respuesta a un punto anterior).
      • \(\arccos(x) = \arctan\left( \frac{\sqrt{1 - x^2}}{x} \right)\).
  27. Una función que encuentre una raíz real de un polinomio de grado 3 o inferior de la forma \(f(x) = a_3 x^3 + a_2 x^2 + a_1 x + a_0\), usando la función root_newton_raphson() (sin modificación alguna con respecto a la vista en clase). La función deberá recibir los cuatro coeficientes (en los reales) del polinomio en donde \(a_3 \neq 0\). Además, deberá recibir un valor inicial x_ini, un epsilon eps y un máximo de iteraciones max_iter para que los correspondientes valores le sean entregados a la función root_newton_raphson(). No utilice el operador ** ni la función power(), tenga en cuenta que \(a_3 x^3 + a_2 x^2 + a_1 x + a_0 = ((a_3 x + a_2) x + a_1) x + a_0\). Dentro de la función solicitada, cree y almacene en una variable la implementación de la función \(f(x) = ((a_3 x + a_2) x + a_1) x + a_0\) y en otra variable la implementación de la función \(f'(x)\) (variables que le serán entregadas a la función root_newton_raphson() para poder encontrar una raíz).

  28. Una función que IMPRIMA POR PANTALLA todas las raices (ya sean reales o complejas) de un polinomio de grado 3 o inferior de la forma \(f(x) = a_3 x^3 + a_2 x^2 + a_1 x + a_0\). La función deberá recibir los cuatro coeficientes (en los reales) del polinomio en donde cualquiera de ellos puede ser igual a cero. Tenga en cuenta que si \(a_3\) es igual a cero y \(a_2\) no lo es, entonces el polinomio es de grado dos (dos raíces en los complejos, que podrían o no ser reales) y que si \(a_3\) y \(a_2\) son iguales a cero mientras que \(a_1\) es diferente de cero, entonces el polinomio es de grado uno (que tiene una raíz real muy fácil de obtener). Los métodos que deben implementar para obtener las raices de un polinomio cuadrático y de uno cúbico están descritos en la sección “5.6 Quadratic and Cubic Equations” del libro http://numerical.recipes/book/book.html.

  29. Una función que, usando el método de bisección, devuelva una aproximación de una raíz de una función de los reales en los reales dada \(\left(\text{es decir, un } x : f(x) \approx 0 \right)\), que se encuentre dentro del intervalo cuyos extremos son dos números reales dados (tener en cuenta todas las consideraciones del método, el cual se basa en el teorema del valor intermedio).

    • Debe recibir una función, dos números reales, y un número real positivo cercano a cero \((\varepsilon)\) para la condición de parada.
    • Debe devolver como resultado un número real.
  30. Dos funciones que devuelvan una aproximación de la integral definida, entre dos números reales dados, de una función de los reales en los reales dada (integrable y bien definida en el intervalo de integración).

    • Deben recibir una función, dos números reales, y un número entero positivo para la cantidad de trapecios/subintervalos.

    • Deben devolver como resultado un número real.

    • Además tenga en cuenta:

  31. Una función que devuelva un valor seudoaleatorio entero entre dos números enteros dados. Consultar:

    Blanco Castañeda, Liliana. (2004). Probabilidad. Editorial UN.
    Capítulo 8. Simulaciones básicas
    8.1. Generación de números aleatorios
    Página 295
    https://repositorio.unal.edu.co/bitstream/handle/unal/53471/9587014499.PDF?sequence=2

    y

    Press, W. H., William, H., Teukolsky, S. A., Saul, A., Vetterling, W. T., & Flannery, B. P. (2007). Numerical recipes 3rd edition: The art of scientific computing. Cambridge university press.
    Chapter 7: Random Numbers (Secciones 7.0 y 7.1)
    Página 340
    http://numerical.recipes/book/book.html

  32. Una función que, usando la generación de valores seudoaleatorios (métodos de Monte Carlo), devuelva un valor cercano al número \(\pi\) Enlace a una animación que ilustra la obtención de un número cercano a \(\pi\) por Monte Carlo.

  33. Una función que, usando la generación de valores seudoaleatorios (métodos de Monte Carlo), devuelva un valor cercano a la integral definida, entre dos números reales dados, de una función de los reales en los reales dada (integrable y bien definida en el intervalo de integración).

  34. Una función que calcule y devuelva el valor aproximado de la derivada de cualquier función dada \(f(x)\), en un punto dado \(x_0\) (diferenciación numérica). Para poder establecer el “nivel”/“calidad”/“precisión” de la aproximación, la función solicitada deberá recibir un valor adicional \(\varepsilon > 0\). Para evitar problemas de precisión lo más que se pueda, implemente la diferenciación numérica siguiendo la recomendación de usar the symmetric difference quotient https://en.wikipedia.org/wiki/Numerical_differentiation#Finite_differences integrada con la recomendación de una buena selección del step size, h https://en.wikipedia.org/wiki/Numerical_differentiation#Step_size (combine ambas recomendaciones en una sola implementación), lo cual también se menciona en la sección “5.7 Numerical Derivatives” del libro http://numerical.recipes/book/book.html.

  35. Una función que:

    • Reciba un valor \(\varepsilon > 0\) y una función de un solo parámetro que represente la implementación de cualquier función \(f(x)\) de \(\mathbb{R}\) en \(\mathbb{R}\), derivable en todo su dominio.
    • Devuelva una función de dos parámetros, uno obligatorio x y el otro opcional eps. Función que debe estar en capacidad de calcular la derivada numérica de la función dada \(f(x)\), en el valor que reciba el parámetro obligatorio x, con un “nivel” de la aproximación dado por el parámetro opcional eps. El valor predeterminado para el parámetro eps será el valor \(\varepsilon\) que se haya recibido previamente.

    ¿Qué tan buena idea es usar dos veces consecutivas la función solicitada para tener una manera de obtener aproximaciones de las segundas derivadas numéricas de una función? ¿qué ocurrirá en términos de precisión?