From 10316ce45a80d9b96819a85221a36ca8fff9dab6 Mon Sep 17 00:00:00 2001 From: antoniomolinabravo <85772354+antoniomolinabravo@users.noreply.github.com> Date: Tue, 28 Feb 2023 23:01:25 -0300 Subject: [PATCH] Optimizando calculo de Pi con promedios en cascada MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit calcula Pi en una secuencia con promedios en cascada reduce el numero de iteraciones y aumenta la precisión rápidamente aporte realizado por Antonio Molina Como: -Calcula el promedio para los N últimos números de la secuencia -a continuación calcula los promedios de los resultados -y luego itera al siguiente nivel realizando calculando el promedio hasta que solo queda un numero results: iter, prom 9, 6 err:5e-5 3.14153820036173 11, 7 err:6e-6 3.1415986833943497 29, 18 err:9e-15 3.1415926535897833 --- Chapter1/calculating_pi.py | 40 +++++++++++++++++++++++++++++++++----- 1 file changed, 35 insertions(+), 5 deletions(-) diff --git a/Chapter1/calculating_pi.py b/Chapter1/calculating_pi.py index 61abfc6..1186dd6 100644 --- a/Chapter1/calculating_pi.py +++ b/Chapter1/calculating_pi.py @@ -14,18 +14,48 @@ # See the License for the specific language governing permissions and # limitations under the License. - -def calculate_pi(n_terms: int) -> float: +# calcula Pi en una secuencia con promedios en cascada +# reduce el numero de iteraciones y aumenta la precision rapidamente +# aporte realizado por Antonio Molina +def calculate_pi(n_iter: int, n_prom = 1) -> float: numerator: float = 4.0 denominator: float = 1.0 operation: float = 1.0 pi: float = 0.0 - for _ in range(n_terms): + + dato = [] + prom = [] + + #calcula secuencia + for i in range(n_iter): pi += operation * (numerator / denominator) denominator += 2.0 operation *= -1.0 - return pi + #acumula ultimos N resultados para promediar + if(i>=n_iter-n_prom): dato.append(pi) + #calcula promedios en cascada + while(len(dato) > 1): + prom = [] + for i, num in enumerate(dato[0:-1]): + prom.append( (num + dato[i+1]) /2 ) + dato = prom.copy() + + return dato[0] if __name__ == "__main__": - print(calculate_pi(1000000)) + print(calculate_pi(n_iter=29, n_prom=18)) + +#bulk test +#Pi = 3.141592653589793 +#for i in range(1, 30): +# for N in range(1, i+1): +# P = calculate_pi(i, N) +# print(i, N, P, Pi-P) +#print("Pi ", Pi) + +#results +#iter, prom error result +# 9, 6 err:5e-5 3.14153820036173 +# 11, 7 err:6e-6 3.1415986833943497 +# 29, 18 err:9e-15 3.1415926535897833