6 votos

Cálculo iterativo de logxlogx

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

Aquí, todo lo que se sabe sobre xx es que x>1x>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)= ?y1=f(y0,x)= ?

0 votos

Sin la exponenciación o los logaritmos, es difícil siquiera decir qué tan cercano está y0y0 a logxlogx. 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 ff 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 xx, entonces sí, puedes calcular una serie de Taylor para exp(y0)exp(y0). Si no puedes variar las operaciones basadas en xx, entonces estás efectivamente restringiendo que ff 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 11 y multiplicaba por 1,0241,024. La respuesta era precisa hasta 44 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 2323. Usé logaritmos en base 77.

3voto

Yves Daoust Puntos 30126

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

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

ln(1+δ)δδ22+δ33ln(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)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)lk=log(ak), por ejemplo ak=1+2kak=1+2k.

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

$$\text{mientras } a_kx_n

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

3voto

krasnyk Puntos 1877

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

Dada la aproximación inicial y0ln(x)y0ln(x) puedes intentar resolver yy 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