Cómo encontrar pi (π) usando el método de integral definida o el método del límite Calcular la integral definida del cubo de x entre 0 y 1 a través de programación de computadora.
I. Programa fuente
Este artículo analiza los siguientes programas populares para calcular PI. El siguiente procedimiento puede resultar confuso al principio, pero no se preocupe, lo comprenderá cuando termine de leer este artículo.
Programa 1: Un buen programa para calcular pi
int a=10000, b, c=2800, d, e, f[2801], g
<; p >main() {for(;b-c;)
f[b ]=a/5; = c *2; c -=14, printf(".4d", e d/a), e=da)
for(b=c; d =f[b]*a, f[ b ]=d--g, d/=g--, --b; d*=b);
}
Dos fórmulas matemáticas
Los matemáticos han estudiado innumerables formas de calcular PI. La fórmula utilizada en este programa es la siguiente:
1 2 3 k
pi = 2 --- * (2 --- *. (2 --- * (2 --- * (2 ... (2 ---- * (2 ... ))...))))
3 5 7 2k 1
La forma en que esta fórmula calcula el PI está fuera del alcance de este artículo.
Lo siguiente que debemos hacer es analizar claramente cómo el programa implementa esta fórmula.
Primero verifiquemos esta fórmula:
Programa 2: Programa de verificación de fórmula Pi
#include "stdio.h"
void main()
{
float pi=2
int i
for(i= 100; igt; =1 ; i--)
pi=pi*(float)i/(2*i 1) 2;
printf("f\n", pi < /p); >
getchar();
}
El resultado del programa anterior es 3.141593.
3. Ampliación del programa
Antes de analizar formalmente el programa, necesitamos ampliar el Programa 1. Podemos ver que el Programa 1 usa un bucle
for para completar los cálculos. Aunque esto puede acortar el programa, es difícil de leer.
De acuerdo con el orden de ejecución del bucle for
, podemos extenderlo a un programa de bucle while, como se muestra a continuación:
Programa 3: Convertir programa for a while
p>
int a=10000, b, c=2800, d, e, f[2801], g
main() {
int i;
int i; p>
for(i=0;i f[i]=a/5;
mientras(c!=0)
{
d =0;
g=c*2;
b=c; /p>
{
d=d f[b] *a
g--
f[b]=dg
p>d=d/g;
g--;
b--;
si(b==0) romper <; /p>
d=d*b ;
}
c=c-14;
printf(".4d", e d/a;
e= da
}
}
}
Nota:
for( [1]; [2 ]; [3]) {[4];}
El orden de las operaciones es [1], [2], [4], [3] Si hay un operador de coma, como d=0, g =c*2, ejecute d=0,
Luego ejecute g=c*2 y el resultado final es el valor de. última expresión, en este caso c*2.
A continuación, analicemos el programa expandido
4 Análisis del programa
Para calcular PI infinitamente preciso, necesitamos. ejecutar la fórmula iterativa anterior innumerables veces, y el resultado cada vez
es completamente preciso, lo que naturalmente es imposible de lograr en una computadora. Por lo tanto, nuestra idea básica es iterar una cantidad suficiente de veces. /p>
. Y haga que cada fracción sea lo suficientemente precisa para que se puedan calcular los primeros n dígitos de PI. El programa anterior calcula 800 dígitos
, iterando la fórmula **** <. p>int a=10000, b, c=2800, d, e, f[2801], g;
El 2800 en esta oración es el número de iteraciones
Porque. Los números de punto flotante o dobles están lejos de ser precisos, el programa utiliza un tipo entero (en realidad, un entero largo) en una operación por partes (calculando 4 bits a la vez). Podemos ver la declaración de salida printf ("".4d", e d). /a); donde .4 es la salida de 4 bits calculada por
, vemos que c disminuye en 14 cada vez (c = c-14;), y el valor inicial de c El tamaño es 2800, porque
este **** se divide en 200 operaciones, cada una de las cuales genera 4 bits, por lo que la salida de un **** es de 800 bits.
Debido a que se utilizan números enteros, es necesario multiplicarlos por un coeficiente. En este programa, este coeficiente es 1000, que es
y viene dado por la siguiente fórmula:
1 2 3 k
1000*pi = 2k --- * (2k --- * (2k --- * (2k ... (2k ---- * (2k .. ))).
...))))
3 5 7 2k 1
El 2k aquí se refiere a 2000, que es f [2801] Los datos después de inicializar la matriz, a=10000, a/5=2000, por lo que el siguiente
programa asignará cada elemento de f a 2000:
for( i =0; i f[i]=a/5;
Quizás te preguntes por qué se almacena una constante en una matriz,
Sigamos el programa:
while(c!=0) Suponiendo que esta es la primera ejecución, el número de iteraciones es c=2800
{
d=0; p>
d=0; p>
g=c*2; Aquí g se usa para hacer k/(2k 1)
b=c; /(2k 1)
while(1)
{
d=d f[b]*a Todos los valores en f son 2000, y los coeficientes aquí se expanden en el cálculo
p>a=10,000 veces
El propósito de esto se explicará más adelante, puedes ver
El resultado es d/a, por lo que esto no afecta.
Calcular
g--;
f[b]=dg; p>
d=d/g; La primera ejecución de g es 2*2799 1. Puedes ver que g es el denominador
g--; -;
if( b==0) break;
d=d*b Aquí b es 2799, puedes ver que d es el numerador
}
c=.
}
Aproximado Echando un vistazo rápido al programa anterior, podemos decir aproximadamente que utiliza la fórmula iterativa para calcular ∏
, pero no sé si Lo entiendes hasta ahora. ¿Entiendes el uso de la matriz f? Si no, continúa leyendo.
El propósito de esta línea es dividir 2k 1. Sabemos que la razón por la que el programa no puede. calcular con precisión es división
p>. Incluso usando números de punto flotante, la respuesta no es lo suficientemente precisa, por lo que no es posible usarlos directamente para calcular Pi de 800 dígitos. Entonces,
¿Cuál es la parte imprecisa? Es obvio: es el resto dg. El programa almacenará este error en la matriz f
y lo utilizará en el siguiente cálculo. Ahora también deberías saber por qué d=d f[b]*a necesita multiplicarse por a en el medio.
Amplía el denominador para poder calcular con precisión el error.
Si no multiplicas por el coeficiente 10000, el valor de d es 2000, por lo que ejecutando d=d/g es 2000/(2*2799 1),
El La respuesta a esta división de enteros es 0, no se puede iterar en absoluto.
Ahora sabemos que el programa simplemente almacena el resto como parámetro para la siguiente iteración, entonces, ¿por qué esto
hace que la siguiente iteración obtenga
la última? 4 ¿Qué pasa con el número de dígitos?
Esto en realidad es muy similar a la división en papel:
0142
/--------
7 / 1
10
7
---------------
30 p >
28
---------------
20
14
---------------
60
.....
Podemos ver que en progreso Al realizar operaciones de división, generalmente expandimos el resto primero y luego realizamos el cálculo. Dado que el resto está almacenado en f, y f[b]*a expande el resto a veces, y luego repite el ciclo en cualquier grado de; exactitud
.
Lo que hay que tener en cuenta aquí es que, de hecho, cada vez que se calcula d, el valor de d no necesariamente tiene que tener solo 4 dígitos. Por ejemplo, en el primer cálculo.
>, el valor de d El valor es 31415926. Cuando se generan 4 dígitos, el valor bajo de 4 dígitos se almacena en el medio de e, e = da, que es 5926.
Finalmente, este c=c-14 no es muy fácil de entender. De hecho, sin esta declaración, el programa todavía calcula correctamente. Simplemente,
Porque si se repite 2800 veces, no importa cuán precisa sea la puntuación, el Pi final solo puede tener una precisión de 800.
Puedes probar la siguiente forma de programa:
for(i=0;ilt;800;i)
{
d =0;
g=c*2
g=c*2
b=c=c*2; p >b=c=c*2.
b=c;
mientras(1)
{
d=d f [ b]*a;
g--;
f[b]=dg
d=d/g; > g--;
b--;
si(b==0) romper
d=d*b; p >}
// c=c-14; no hagas esto.
printf(".4d", e d/a); = da;
}
La respuesta final sigue siendo correcta.
Pero podemos ver que el ciclo interno es c veces, lo que significa que cada iteración se calcula c veces. Cada vez que se calculan los bits siguientes, el número de iteraciones se reduce en 14, pero la precisión no se ve afectada. Por qué es así, aún no lo he investigado. Finalmente
e d/a y el papel de e=d/a también quedan en manos del lector.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~ ~~~~~~~~~
Usa programación informática para calcular la integral definida del cubo de x de 0 a 1~~~~
¡Esta no se encontró!
Soy muy malo en matemáticas ~~~~
****¡Úsalo para estudiar! ~~~~