Az algoritmus iteratívan közelíti a ()-t az aritmetikai és geometriai átlagok, valamint a peremterületi integrálok kapcsolatának felhasználásával. Ez az eljárás gyorsan konvergál, és minden iteráció megduplázza a pontos tizedesjegyek számát.
Az iterációk a következő lépéseket követik:
import math
def gauss_legendre(n_iterations=10):
# Inicializálás
a = 1.0
b = 1.0 / math.sqrt(2)
t = 1.0 / 4.0
p = 1.0
for _ in range(n_iterations):
a_next = (a + b) / 2
b_next = math.sqrt(a * b)
t_next = t - p * (a - a_next) ** 2
p_next = 2 * p
a, b, t, p = a_next, b_next, t_next, p_next
# Számítsd ki a π-t
pi = ((a + b) ** 2) / (4 * t)
return pi
# Példa használat
pi_approximation = gauss_legendre(n_iterations=10)
print(f"Pi értéke (10 iteráció): {pi_approximation}")
Kimenet (10 iteráció után):
Pi értéke (10 iteráció): 3.141592653589793
#include <iostream>
#include <cmath>
#include <iomanip>
double gauss_legendre(int n_iterations) {
double a = 1.0;
double b = 1.0 / std::sqrt(2.0);
double t = 0.25;
double p = 1.0;
for (int i = 0; i < n_iterations; ++i) {
double a_next = (a + b) / 2.0;
double b_next = std::sqrt(a * b);
double t_next = t - p * std::pow(a - a_next, 2);
double p_next = 2.0 * p;
a = a_next;
b = b_next;
t = t_next;
p = p_next;
}
return std::pow(a + b, 2) / (4.0 * t);
}
int main() {
int iterations = 10;
double pi_approximation = gauss_legendre(iterations);
std::cout << std::setprecision(15) << "Pi értéke (" << iterations << " iteráció): " << pi_approximation << std::endl;
return 0;
}
Kimenet (10 iteráció után):
Pi értéke (10 iteráció): 3.14159265358979
A Gauss-Legendre-algoritmus az egyik leggyorsabb numerikus módszer () értékének kiszámítására. A gyors konvergencia miatt hatékonyan használható olyan problémák esetén, ahol a nagy pontosság kiemelkedően fontos. Habár az algoritmus számításigényes, pontossága miatt a modern numerikus analízis fontos eszköze.