29 votos

Calcular logaritmos a mano

Estoy pensando en hacer una tabla de logaritmos que vayan de 100 a 999 con 5 cifras significativas. Con lápiz y papel, claro. Lo estoy haciendo a la vieja usanza.

Lo primero que se me ocurrió fue utilizar $\log(ab) = \log(a) + \log(b)$ para la reducción.
Y luego usar la serie taylor para $\log(1-x)$ cuando $-1 < x \leq 1$ Pero la convergencia es bastante lenta en este caso.

¿Se te ocurre un método mejor?

0 votos

Mira este hilo aquí para algunos trucos que reducen el trabajo e información de fondo relevante. Esencialmente, no se quiere utilizar una única serie de potencias, sino que se hace la mayor parte del trabajo utilizando interpolaciones adecuadas.

0 votos

The Feynman Lectures on Physics Vol1 Ch22 tiene el mismo espíritu que la pregunta y también una buena perspectiva.

1 votos

En esta columna encontrará algunos cálculos reales: maa.org/editorial/euler/ (tiene un método iterativo para los registros de base-10, y a mitad de la página 3 utiliza (una versión más amigable de) el método del post de @Iasafro). Ten en cuenta que sólo necesitas usar las series para los recíprocos de los enteros, ya que puedes juntar todo lo demás a partir de ellos (y algo de ingenio por tu parte). También quiero añadir que es agradable ver a alguien más que está interesado en estas cosas (cada vez que siento que mis habilidades aritméticas están disminuyendo agrego a mis tablas de logaritmos para practicar).

16voto

Matthew Scouten Puntos 2518

Para $1 \le x \le 2$ , $$\begin{eqnarray*} \ln(x) &\approx - 1.941064448+ \left( 3.529305040+ \left( - 2.461222169+ \left( \right.\right.\right.\cr & \left.\left.\left. 1.130626210+ \left( - 0.2887399591+ 0.03110401824\,x \right) x \right) x \right) x \right) x \end{eqnarray*}$$ con un error inferior a $10^{-5}$ . Para $2^n \le x \le 2^{n+1}$ , $\ln(x) = n \ln(2) + \ln(x/2^n)$ .

0 votos

Por casualidad, ¿es una aproximación Chebyshev economizada?

4 votos

No, es la mejor aproximación en $L^\infty$ por polinomios de grado $\le 5$ calculado por el procedimiento numapprox[minimax] de Maple utilizando el algoritmo Remez.

0 votos

Gracias, es una fórmula muy rápida. Tengo una pregunta: ¿Los números aquí tienen el menor tamaño posible? ¿Se puede utilizar sólo 6 dígitos de esos números después de la marca decimal, o Maple optimizado que también? (Yo usaría este algoritmo en soroban)

13voto

Bitbang3r Puntos 193

Según la Wikipedia, http://en.wikipedia.org/wiki/Logarithm#Power_series puede probar $$\ln(z)=2\sum_{n=0}^\infty\,\frac{1}{2n+1}\left(\frac{z-1}{z+1}\right)^{2n+1}$$ Y utilizando esa convergencia es más rápido para $z$ cerca de $1$ según la wikipedia para $z=1.5$ los tres primeros términos de la serie dan un error de aproximadamente $3\cdot 10^{-6}$ .

1 votos

Para futuros visitantes, consulte más información sobre esta identidad aquí: math.stackexchange.com/a/1793287/405572

9voto

Philip Fourie Puntos 12889

EDIT: Esta es la versión corta y simplificada. Mi respuesta original está más abajo, y la motivación, los antecedentes y la discusión de los errores se pueden encontrar allí.

  1. Encuentre aproximaciones para $\ln(1.00)$ a $\ln(2.00)$ iterando el argumento por $0.01$ . $$\ln(1.00)=0$$ $$\ln(x+0.01)\approx\ln(x)+\frac{1}{600}\left(\frac{1}{x}+\frac{4}{x+0.005}+\frac{1}{x+0.01}\right)\qquad(1)$$
  2. Encuentre aproximaciones para $\ln(2.01)$ a $\ln(3.00)$ . Si $\ln(x/2)$ ya está tabulado, $$\ln(x)=\ln(x/2)+\ln(2.00)$$ En caso contrario, utilice la ecuación $(1)$ .
  3. Encuentre aproximaciones para $\ln(3.01)$ a $\ln(5.00)$ . Si $\ln(x/2)$ o $\ln(x/3)$ ya está tabulado, $$\ln(x)=\ln(x/2)+\ln(2.00)\qquad\textrm{or}\qquad\ln(x)=\ln(x/3)+\ln(3.00)$$ En caso contrario, utilice la ecuación $(1)$ .
  4. Encuentre aproximaciones para $\ln(5.01)$ a $\ln(7.00)$ . Si $\ln(x/2)$ , $\ln(x/3)$ o $\ln(x/5)$ ya está tabulado, $$\ln(x)=\ln(x/2)+\ln(2.00)\qquad\textrm{or}\qquad\ln(x)=\ln(x/3)+\ln(3.00)$$ $$\textrm{or}\qquad\ln(x)=\ln(x/5)+\ln(5.00)$$ En caso contrario, utilice la ecuación $(1)$ .
  5. Encuentre aproximaciones para $\ln(7.01)$ a $\ln(10.00)$ . Si $\ln(x/2)$ , $\ln(x/3)$ , $\ln(x/5)$ o $\ln(x/7)$ ya está tabulado, $$\ln(x)=\ln(x/2)+\ln(2.00)\qquad\textrm{or}\qquad\ln(x)=\ln(x/3)+\ln(3.00)$$ $$\textrm{or}\qquad\ln(x)=\ln(x/5)+\ln(5.00)\qquad\textrm{or}\qquad\ln(x)=\ln(x/7)+\ln(7.00)$$ En caso contrario, utilice la ecuación $(1)$ .
  6. Ahora las aproximaciones para $\ln(1.00)$ a $\ln(10.00)$ están tabulados. Añadir $2\ln(10.00)$ para obtener una tabla de $\ln(100), \ln(101), \ldots, \ln(1000)$ . Personalmente, me iría de la mesa con argumentos de $1.00$ a $10.00$ e indicar al lector que añada $\ln(10.00)$ según sea necesario.

Este método utiliza la ecuación $(1)$ aproximadamente $100+50+33+33+27+27+23+23+23\approx340$ tiempos. Eso significa que harás alrededor de $3(340)=1360$ divisiones por números con un máximo de cuatro cifras significativas. Dividirás por $600$ (comparativamente simple) $340$ tiempos. Cuando se utiliza la ecuación $(1)$ , lo haces $3$ adiciones, por un total de unos $1020$ adiciones. Cuando no se utiliza la ecuación $(1)$ , se hace la adición una vez, y esto sucede alrededor de $900-340=560$ tiempos. Todo junto es:

  • $1360$ divisiones por números con un máximo de 4 cifras significativas
  • $340$ divisiones por $600$
  • $1580$ adiciones
  • no hay multiplicaciones ni elevaciones de potencias que requieran mucho tiempo, como la mayoría de los otros métodos.

Creo que esto es excelente teniendo en cuenta que va a producir $900$ números con cinco decimales de precisión.


Respuesta original publicada:

He aquí una idea que no tiene nada que ver con las series de potencia. En primer lugar, lee sobre el método Runge-Kutta para aproximar soluciones a ecuaciones diferenciales en http://en.wikipedia.org/wiki/Runge%E2%80%93Kutta_methods . Sólo hay que atenerse al método "común de cuarto orden". La mayoría de los cursos de introducción a las ecuaciones diferenciales cubren el método de Euler, que es un gran concepto, pero normalmente poco práctico por su lentitud. Runge-Kutta funciona un montón más rápido.

$y=\ln(x)$ es la solución de la ecuación diferencial $y'=\frac{1}{x}$ con la condición inicial $y(1)=0$ . Aplicar Runge-Kutta con un tamaño de paso de $0.01$ e iterar novecientas veces desde $1.00$ hasta $10.00$ . Tendrá valores aproximados para $\ln(1.01)$ hasta $\ln(10.00)$ . Luego se puede añadir la aproximación para $\ln(10.00)$ (dos veces) para obtener aproximaciones para $\ln(100)$ a $\ln(1000)$ .

Error:

No conozco ningún teorema para acotar el error con este método, pero los errores suelen ser muy pequeños en la práctica. Usé Excel para hacer todo esto, y el error en la aproximación final para $\ln(10.00)$ fue sólo menos que $2.1\times10^{-11}$ . Si usted hizo todo esto a mano, y luego utilizó algún otro método para encontrar $\ln(10.00)$ con una precisión conocida muy alta, se podría establecer un límite en el error para $\ln(10.00)$ . Entonces la monotonicidad de $\frac{1}{x}$ implicaría que todos los errores en los pasos intermedios fueran aún más pequeños.

Complejidad:

Dada la especificidad de este problema, cada iteración requerirá que hagas tres divisiones decimales por números que tengan como máximo cuatro cifras significativas. (Ten en cuenta que como la ecuación diferencial es de tiempo puro, $k2=k3$ .) Cada iteración tendrá también dos duplicaciones, varias sumas y una división por 6, pero las tres divisiones decimales le llevarán la mayor parte del tiempo. Además, cada uno de estos tres cocientes sólo se utiliza más tarde en sumas, duplicaciones y divisiones por $6$ Así que yo apostaría a que estarías seguro registrando sólo 7 decimales para cada cociente. Mi opinión es que esto te dará los resultados que quieres mucho más rápido que la mayoría de los métodos basados en series de potencias. Al igual que este método, aquellos requieren varias divisiones en cada paso. Pero los métodos de series de potencias también requieren elevar a potencias, y este método no lo hace.

Velocidad mejorada

Para reducir el tiempo de cálculo aproximadamente a la mitad, se podría utilizar algún otro método para encontrar un decimal para $\ln(2)$ con gran precisión, y añadir el uso $\ln(2x)=\ln(x)+\ln(2)$ . En concreto, tras ejecutar Runge-Kutta noventa veces hasta $2.01$ se podría aproximar $\ln(2.02)$ con las aproximaciones que tiene para $\ln(1.01)$ y $\ln(2)$ . Alternar con RK para $\ln(2.03)$ y seguir alternando los métodos. Esto te dejaría de $900$ iteraciones RK hasta $500$ . Al añadir esta modificación a mi hoja de cálculo de Excel se produjo el error final en $\ln(10.00)$ hasta un nivel perfectamente aceptable $7.1\times10^{-11}$ .

0 votos

La versión "clásica" es buena, aunque se podría considerar La formulación de Gill para ahorrar en el número de cantidades que hay que recuperar por paso.

0 votos

@J.M.: No puedo ver el artículo, pero ¿puede aclarar lo que quiere decir? La única cantidad que hay que recordar para encontrar, digamos $\ln(2.57)$ es $\ln(2.56)$ . Y el OP quiere tener $\ln(2.56)$ registrado de todos modos como parte de la mesa final. (Es decir, después de añadir $2\ln(10)$ .) ¿La formulación de Gill intenta llegar al final (es decir, $\ln(10.00)$ ) con menos pasos intermedios? El OP quiere una tabla de $900$ números sin importar el método.

0 votos

Su fórmula (1) es una integración de la regla de Simpson de 0 a 1 de x^t dt, que resulta en (x-1)/Ln(x). Dorfler, en su libro "Dead Reckoning" llega a esta misma fórmula por extrapolación en el algoritmo AGM de Borchardt.

8voto

Matthew Scouten Puntos 2518

Otra forma, apropiada para hacer una tabla, es comenzar con $\ln(100) = 4.605170186$ y luego para cada $n$ , $\ln(n+1) \approx \ln(n) + \frac{1}{n} - \frac{1}{2n^2} + \frac{1}{3n^3}$ . El error de truncamiento acumulado (sin contar el redondeo) será siempre inferior a $10^{-7}$ .

1voto

KP. Puntos 1177

Si quiere hacer una tabla de natural logaritmos, podrías hacerlo de forma bastante efectiva usando Newton Raphson. Para cada x  ∈ [100,999], elija un valor inicial y 0  ∈ (4.6, 6.9) al gusto, y luego iterar: $$ y_{j+1} \;\;=\;\; y_j - \left[\dfrac{\exp(y_j) - x}{\exp(y_j)}\right] \;\;=\;\; y_j + x \exp(-y_j) - 1. $$ La serie de Taylor para exp(- y j ) debe convergen rápidamente, a diferencia de la de ln(1 -  y j ). Para logaritmos de base 10, puedes hacer la conversión dividiendo tus logaritmos naturales por ln(10), que también puedes encontrar rápidamente por el método anterior.

0 votos

Si el rango es desde un número concreto hasta otro número 10 veces mayor, entonces no tiene mucho sentido a no ser que sean logaritmos de base 10.

0 votos

@Michael Hardy: buen punto; pero él puede convertir dividiendo por ln(10) en todo, que es similar a un cálculo que tendría que hacer con un cálculo directo de la serie de Talyor de todos modos.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X