Processing math: 100%

6 votos

Cálculo iterativo de logx

Supongamos que se tiene una aproximación inicial de logx, y0, de modo que: y0=logx+ϵlogx

Aquí, todo lo que se sabe sobre x es que x>1. ¿Existe un método general para mejorar esa estimación solo usando sumas y multiplicaciones, es decir, sin exponenciación o logaritmos? y1=f(y0,x)= ?

0 votos

Sin la exponenciación o los logaritmos, es difícil siquiera decir qué tan cercano está y0 a logx. Esto me hace pensar que será difícil, si no imposible, crear un algoritmo iterativo que no aproxime de alguna forma el error ϵ. Tomar series de potencias truncadas de dichas funciones puede o no contar como una respuesta, sin embargo.

0 votos

@AlexR - ¿Y si puedes calcular el logaritmo entero, es decir, el entero más cercano?

0 votos

@nbubis ¿Se supone que f debe ser una función polinómica/racional? No está claro en tu pregunta lo que significa "usando solo adición y multiplicación": si puedes usar diferentes operaciones dependiendo de x, entonces sí, puedes calcular una serie de Taylor para exp(y0). Si no puedes variar las operaciones basadas en x, entonces estás efectivamente restringiendo que f sea un polinomio fijo.

5voto

Hace mucho tiempo, en el siglo pasado, tenía una calculadora temprana sin función logarítmica. Para hacer un logaritmo, presionaba el botón de raíz cuadrada diez veces, restaba 1 y multiplicaba por 1,024. La respuesta era precisa hasta 4 decimales, lo cual era mejor que lo que mis dos palos calibrados podían ofrecer. La raíz cuadrada es una función poderosa que se puede usar para aproximar muchas otras.

No ridiculices los palos calibrados; ¡fueron los que hicieron la mayor parte de la ingeniería que nos llevó a la luna! Recientemente construí una regla de cálculo con palitos de Starbucks que hace multiplicación módulo 23. Usé logaritmos en base 7.

3voto

Yves Daoust Puntos 30126

En cualquier caso, también necesitas saber que x0=ey0.

Luego, la corrección se da por yy0=ln(xx0)=ln(1+δ), donde δ es pequeño. Puedes evaluarlo por Taylor, lo cual convergerá linealmente,

ln(1+δ)δδ22+δ33

También puedes limitarte a la primera término $$\ln(1+\delta)\approx\delta,$

pero entonces tendrás que corregir con x1=x0eδx0(1δ+δ22), lo que converge un poco más rápido.

No creo que haya un atajo.


Un enfoque similar se da por el método CORDIC.

Precomputa una serie de constantes decrecientes lk=log(ak), por ejemplo ak=1+2k.

Aplicarás los siguientes pasos para todos los k sucesivamente:

$$\text{mientras } a_kx_n

(Si ak+1>ak, un if es suficiente.)

3voto

krasnyk Puntos 1877

En lugar de resolver yln(x)=0 para y puedes resolver g(y)=eyx=0

Dada la aproximación inicial y0ln(x) puedes intentar resolver y usando el método de Newton:

yn+1=yng(yn)g(yn)=yneynxeyn=yn1+xeyn

Cuando no está permitida la exponenciación puedes aproximar ey con (1+y2m)2m usando multiplicación repetida: (1+y2m)2m=(1+y2m)2m1(1+y2m)2m12m=122m+1

2 votos

Debes tener en cuenta que (1+yn)n no es una buena aproximación para ey cuando y2n

0 votos

Sí, por eso le pregunté a OP para que aclare qué se permite ingresar en f. Si n debe elegirse en función del tamaño de y, entonces esto no será una función racional de $x, y.

0 votos

@ErickWong Si los cálculos se realizan en la computadora con doble precisión 510324<x<2.310324 entonces |y|=|ln(x)| no es muy grande.

1voto

No conozco ninguna forma de mejorar una aproximación cercana del logaritmo como lo haces con la raíz cuadrada en Newton-Raphson a menos que tengas la función inversa del logaritmo. Ten en cuenta que la exponencial es fácil de evaluar para argumentos pequeños porque es una serie de potencias que converge rápidamente.

Si tienes un logaritmo exacto de un número z que está cerca de x, calcula w=x/z. westará cerca de 1. Y es rápido y fácil calcular el logaritmo natural de números cercanos a 1.

Crudo: utiliza ln(w)=w1

Menos crudo: a1=(1+w)/2, y aproxima ln(w)=(w1)/a1. Esto parece una integración trapezoidal de 1 a w de dt/t. Podrías hacerlo mejor con la regla de Simpson y otros métodos de integración numérica, pero no es hacia donde quiero dirigirte.

Mejor: g1=w, y aproxima ln(w)=(w1)/g1

Continuando, podemos obtener mejores divisores. a2=(a1+g1)/2,g2=a2g1, etc. Esto no tiene convergencia cuadrática como el algoritmo Gauss AGM, pero puede ser acelerado por el mismo método utilizado en el integrador trapezoidal acelerado de Romberg de la calculadora HP. Consulta Carlson, "Un algoritmo para calcular logaritmos y arcotangentes", Matemáticas de la Computación, abril de 1972. Solo se necesitan unas pocas iteraciones para una gran precisión. Esto me lo enseñó Nate Grossman de la UCLA en una reunión del Forth Interest Group en el siglo pasado. (Otro de sus métodos favoritos era Newton-Raphson en la exponencial.)

Una gran parte de nuestra tecnología numérica implica estrategias para evitar operaciones "lentas" en la computadora: multiplicación, inverso, raíz cuadrada, etc. Algún día estas serán incorporadas en el hardware y tomarán solo un ciclo de máquina. Se abrirán nuevos mundos de computación de alta velocidad. Hasta entonces, el cálculo rápido de logaritmos es una infraestructura fundamental para el procesamiento numérico y un campo rico para seguir explorando.

Esto no es exactamente lo que querías, pero espero que sea útil.

1voto

enedene Puntos 734

Considera el hecho de que el número con el que estás trabajando es un número de punto flotante, entonces el logaritmo de éste es

log(b)=log(2exp1.S), donde exp es el exponente y S es la mantisa.

log(b)=explog(2)+log(1.S)

Dado que 1.S está entre 1 y 2, asume que es 2 entonces

log(b) (exp+1)log(2).

Un par de iteraciones deberían dar el valor correcto entonces.

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