Cómo aproximar una raíz cuadrada de decir 2

Una de las formas más sencillas de encontrar una raíz cuadrada es el método de Newton. Tome la raíz cuadrada de 2. Y deje que la primera aproximación (muy cruda) sea [matemática] q_1 = 1 [/ matemática]. Luego se obtiene la siguiente aproximación utilizando la fórmula:

[matemáticas] q_2 = \ displaystyle \ frac {1} {2} \ left (q_1 + \ displaystyle \ frac {2} {q_1} \ right) = 1.5. [/ math]

En otras palabras, dividimos 2 por la aproximación. Si la aproximación fuera perfecta, obtendríamos el mismo valor ([math] 2 / \ sqrt {2} = \ sqrt {2} [/ math]). Pero no lo es … así que obtenemos algún otro valor. Y promediamos nuestra antigua aproximación y este nuevo valor para obtener una nueva aproximación.

Repitamos el proceso varias veces:

[matemáticas] q_3 = \ displaystyle \ frac {1} {2} \ displaystyle \ left (q_2 + \ frac {2} {q_2} \ right) = 1.4166667, [/ math]
[matemáticas] q_4 = \ displaystyle \ frac {1} {2} \ left (q_3 + \ displaystyle \ frac {2} {q_3} \ right) = 1.4142157, [/ math]
[matemáticas] q_5 = \ displaystyle \ frac {1} {2} \ left (q_4 + \ displaystyle \ frac {2} {q_4} \ right) = 1.4142136, [/ math]

y eso es tan bueno como puede ser, a 8 dígitos de precisión. ¿Ves cuán rápido convergió la solución? Es muy fácil de usar con una calculadora, y hasta 3-4 dígitos, incluso puede hacerlo en su cabeza.

Mejor aún, el mismo método puede usarse para otras raíces. Intentemos calcular la raíz cúbica de 2, usando [math] c_1 = 1 [/ math]. Ahora, lo que tenemos que hacer es dividir 2 por el cuadrado de la última aproximación: eso es porque [matemáticas] \ sqrt [3] {2} = 2 / (\ sqrt [3] {2}) ^ 2 [/ matemáticas ] Y le damos a la estimación anterior un peso proporcionalmente mayor cuando promediamos. Por lo que entonces:

[matemáticas] c_2 = \ displaystyle \ frac {1} {3} \ left (2c_1 + \ displaystyle \ frac {2} {c_1 ^ 2} \ right) = 1.3333333, [/ math]
[matemáticas] c_3 = \ displaystyle \ frac {1} {3} \ left (2c_2 + \ displaystyle \ frac {2} {c_2 ^ 2} \ right) = 1.2638889, [/ math]
[matemáticas] c_4 = \ displaystyle \ frac {1} {3} \ left (2c_3 + \ displaystyle \ frac {2} {c_3 ^ 2} \ right) = 1.2599335, [/ math]
[matemáticas] c_5 = \ displaystyle \ frac {1} {3} \ left (2c_4 + \ displaystyle \ frac {2} {c_4 ^ 2} \ right) = 1.2599211, [/ math]
[matemáticas] c_6 = \ displaystyle \ frac {1} {3} \ left (2c_5 + \ displaystyle \ frac {2} {c_5 ^ 2} \ right) = 1.2599210. [/ math]

Converge casi tan rápido (el valor correcto es 1.2599210, que se logra después de 6 iteraciones).

De hecho, este método funciona para tomar raíces más altas: para tomar la raíz [matemática] n [/ matemática] de un número [matemático] x [/ matemático], la fórmula de iteración es

[matemáticas] r_ {k + 1} = \ displaystyle \ frac {1} {n} \ left [(n-1) r_k + \ displaystyle \ frac {x} {r_k ^ {n-1}} \ right]. [ /matemáticas]

Y, al igual que en el caso de las raíces cuadradas, cada iteración básicamente duplica la cantidad de dígitos significativos. Y lo mejor de todo, el método es muy estable: la suposición inicial puede ser cualquier cosa, e incluso si comete un error en un punto, el método se corrige automáticamente.

La mejor aproximación por los racionales está dada por fracciones continuas.

Tienes [math] \ sqrt {2} = 1 + \ sqrt {2} -1 [/ math]. Entonces, la primera aproximación aproximada es [matemáticas] 1 [/ matemáticas]. Ahora aproxima [math] \ frac {1} {\ sqrt {2} -1} = \ sqrt {2} +1 [/ math]. Será aproximado por [math] 2 [/ math].

Entonces [matemáticas] \ sqrt {2} = 1 + \ sqrt {2} -1 = 1 + \ frac {1} {1+ \ sqrt {2}} \ aprox 1 + \ frac {1} {1 + 1} = \ frac {3} {2}. [/ matemáticas]

En términos más generales, tenemos [matemáticas] \ sqrt {2} = 1 + \ frac {1} {1+ \ sqrt {2}} [/ matemáticas]

Reiterando este proceso obtienes:

[matemáticas] \ sqrt {2} = 1 + \ frac {1} {1+ 1 + \ frac {1} {1 + \ sqrt {2}}} [/ matemáticas]

Reemplazando [math] \ sqrt {2} [/ math] por 1 en el RHS una vez más, obtiene la aproximación posterior

[matemáticas] \ sqrt {2} \ aprox 1 + \ frac {1} {1+ 1 + \ frac {1} {1 +1}} = 1 + \ frac {1} {2 + \ frac {1} { 2}} = \ frac {7} {5} [/ matemáticas]

Un paso más:

[matemáticas] \ sqrt {2} = 1 + \ frac {1} {1+ 1 + \ frac {1} {1 +1 + \ frac {1} {1 + \ sqrt {2}}}} [/ matemáticas ]

Reemplazando [math] \ sqrt {2} [/ math] por 1 en el RHS nuevamente obtenemos

[matemáticas] \ sqrt {2} \ aprox 1 + \ frac {1} {1+ 1 + \ frac {1} {1 +1 + \ frac {1} {1 +1}}} = \ frac {17} {12} [/ matemáticas]

En general, la fracción continua para [math] \ sqrt {2} [/ math] viene dada por [math] [1,2,2,2, \ ldots]. [/ Math]

Por lo tanto, si [math] \ frac {p_n} {q_n} [/ math] es la aproximación [math] n – [/ math] th, la siguiente viene dada por:

[matemáticas] \ frac {p_ {n + 1}} {q_ {n + 1}} = 1 + \ frac {1} {1+ \ frac {p_n} {q_n}} = 1 + \ frac {q_n} { p_n + q_n} = \ frac {p_n +2 \ cdot q_n} {p_n + q_n} [/ math] (*)

Obviamente, podemos lograr fácilmente que las aproximaciones converjan a [math] \ sqrt {2} [/ math] más rápido simplemente omitiendo cualquier otro paso.

Por ejemplo, en lugar de usar (*) podemos usar

[matemáticas] \ frac {r_ {n + 1}} {s_ {n + 1}} = [/ matemáticas] [matemáticas] 1 + \ frac {1} {1+ 1 + \ frac {1} {1 + \ frac {r_n} {s_n}}} = \ frac {3r_n + 4s_n} {2r_n + 3s_n} [/ math] (**)

¿No es lo suficientemente rápido para ti? Bueno, puede omitir cada dos, tres, cuatro, etc., pasos para obtener fórmulas cada vez más elaboradas.

Solo para comparar esto con los resultados de los ventiladores numéricos, permítanme usar (**) para calcular fracciones.

def cf(steps):
r=1
s=1
for i in range(1, steps+1):
rn=3*r +4*s
s=2*r +3*s
r=rn
print("r=", repr(r).rjust(steps), "s=", repr(s).rjust(steps), "ratio=", repr(r/s).rjust(20))

Básicamente, necesita iteraciones [matemáticas] 11 [/ matemáticas] para obtener una precisión de 16 dígitos.

>>> cf (12)
r = 7 s = 5 relación = 1.4
r = 41 s = 29 relación = 1.4137931034482758
r = 239 s = 169 relación = 1.4142011834319526
r = 1393 s = relación 985 = 1.4142131979695431
r = 8119 s = relación 5741 = 1.4142135516460548
r = 47321 s = 33461 relación = 1.4142135620573204
r = 275807 s = 195025 relación = 1.4142135623637995
r = 1607521 s = 1136689 relación = 1.4142135623728214
r = 9369319 s = 6625109 relación = 1.414213562373087
r = 54608393 s = 38613965 relación = 1.4142135623730947
r = 318281039 s = 225058681 relación = 1.4142135623730951
r = 1855077841 s = 1311738121 relación = 1.4142135623730951

Y ahora me voy a poner particularmente malvado.

Deje que [math] A = \ begin {pmatrix} 3 & 4 \\ 2 & 3 \ end {pmatrix}. [/ Math]

Entonces tuvimos [matemáticas] \ begin {pmatrix} r_ {n + 1} \\ s_ {n + 1} \ end {pmatrix} = A \ begin {pmatrix} r_ {n} \\ s_ {n} \ end { pmatrix} [/ math]

Entonces, básicamente, si simplemente podemos tomar poderes de [matemáticas] A [/ matemáticas], obtendré un algoritmo más rápido.

Por ejemplo, deje que [math] B = ((A ^ 2) ^ 2) ^ 2 = \ begin {pmatrix} 665857 & 941664 \\ 470832 & 665857 \ end {pmatrix} [/ math]

Entonces usamos

[matemáticas] \ frac {r_ {n + 1}} {s_ {n + 1}} = \ frac {665857r_n +941664 s_n} {470832 r_n + 665857s_n} \ text {with} r_0 = s_0 = 1. [/ math ]

Bueno, ahora solo necesitamos dos iteraciones para obtener una precisión de 16 dígitos.

def cfm(steps):
r=1
s=1
for i in range(1, steps+1):
rn=665857*r +941664*s
s=470832*r +665857*s
r=rn
print("r=", repr(r).rjust(16*steps), "s=", repr(s).rjust(16*steps), "ratio=", repr(r/s).rjust(20))

De hecho:

>>> cfm (2)
r = 1607521 s = 1136689 relación = 1.4142135623728214
r = 2140758220993 s = 1513744654945 relación = 1.4142135623730951
>>>

Y, finalmente, una combinación simple de estas dos ideas simples (es decir, relación de recurrencia y cuadratura) conduce al siguiente algoritmo:

def sqrtwo(steps):
import numpy as np
#uses BigFloat for decimal representations
import bigfloat as bf
#recurrence matrix
A=np.array([[3,4],[2,3]],dtype='object')
#initial ratio (1:1)
v=np.array([1,1],dtype='object')
p=2
for i in range(1,steps+1):
#square recurrence matrix
B=np.dot(A,A)
#next rational approximation
x=B.dot(v)
v=x
#new recurrence matrix is square of the former one
A=B
#numerator and denominator of the rational approx.
print("r=", x)
c=bf.Context(precision=3*p)
# (mostly) significant digits of the decimal representation
print("d=",bf.div(v[0],v[1],c))
p=2*p+1

Cada iteración básicamente duplica el número de dígitos significativos:

sqrtwo (7)
r = [41 29]
d = 1.41
r = [47321 33461]
d = 1.41418
r = [63018038201 44560482149]
d = 1.4142135624
r = [111760107268250945908601 79026329715516201199301]
d = 1.414213562373095048801
r = [351504323792998568782913107692171764446862638841
248551090970421189729469473372814871029093002629]
d = 1.4142135623730950488016887242096980785696719
r = [3477109718223823971077792011151753264453324909203666463037141372635096568475146806431249835785721
2458687860685711415704226476179442170731890789424287190428771129010154693164247962309863285414661]
d = 1.41421356237309504880168872420969807856967187537694807317667973799073247846210703885040
r = [3402466369853164592336305369771757470892950796574674582246399584110788638408165099942281927317480437908116247032887354787477283715941944609251710101020916171910109824209161719661010924710915969610610610616061561561091601092961061061561561056951610210610610615615610610516051061061067067051067057057051051904967051061905685705705105705705705195705705 con la de la Cruz del Sur de México
2405907042882348335703337719324122396768745427590133047081749567374373315902054736392786976262360092058649867109616561947983479067103769020415966346355380437749496648531310644635638043747496364853804374768064853134147706486902041547690690620447690648690620547639620615444690690690 sobre fondo blanco
d = 1.4142135623730950488016887242096980785696718753769480731766797379907324784621070388503875343276415727350138462309122970249248360558507372126441214970999358314562265998383275622659358314561 2665

¿Necesitas algo más rápido? Ahora ya sabes cómo: me gustan los números burlones, ya sabes)

Un buen método es el método de Newton-Raphson (método de Newton).
Queremos aproximar [math] \ sqrt [2] {2} [/ math]. Para hacer esto más manejable, intentemos acercarnos a esta cantidad desde otro ángulo.

Si [matemática] \ sqrt [2] {2} = x [/ matemática], entonces [matemática] 2 = x ^ 2 [/ matemática] y
[matemáticas] x ^ 2 -2 = 0 [/ matemáticas]

Podemos notar que [math] \ sqrt [2] {2} [/ math] es una raíz de esta ecuación. Podemos usar un pequeño truco usando derivados para aproximar cuál es la raíz de una función f ( x ).

Definamos una conjetura de lo que creemos que [math] \ sqrt [2] {2} [/ math] es. Realmente no importa lo que adivinemos demasiado, pero sabemos que 1 <2 <4, por lo que la raíz está en algún lugar entre 1 y 2. Por simplicidad, adivinemos 1, aunque sabemos que eso está mal .

Supongamos que [math] x_0 [/ math] y nuestra función, [math] x ^ 2 -2 [/ math] sea f ( x ).

Considerar:
[matemáticas] x_1 = x_0 – \ frac {f (x_0)} {f ‘(x_0)} [/ matemáticas]

(Tenga en cuenta que la derivada de f ( x ), f ‘( x ), es 2 x )

La primera iteración de esto, para calcular [matemáticas] x_1 [/ matemáticas], nos da:

[matemáticas] x_1 = 1.5 [/ matemáticas]

Hmm … puedes ver lo que está pasando, ¿no? Se está acercando al valor real del cero. Estos valores se pueden representar geométricamente como intersecciones de líneas tangentes que crecen cada vez más cerca del cero.

Intentemos nuevamente, repitiendo el mismo proceso, excepto que use [math] x_1 [/ math] en lugar de [math] x_0 [/ math].

[matemáticas] x_2 = x_1 – \ frac {f (x_1)} {f ‘(x_1)} [/ matemáticas]

Obtenemos:

[matemáticas] x_2 = 1.41666 … [/ matemáticas]

Y otra vez:
[matemáticas] x_3 = 1.414 … [/ matemáticas]

Este proceso puede continuar hasta el infinito, dándonos una mayor precisión.

No, muy convencido? La prueba se da aquí: Método de Newton

Tome la aproximación entera más cercana de [math] \ sqrt {x} [/ math]. Llamémoslo [matemáticas] n [/ matemáticas]. Luego encuentre [math] \ displaystyle \ frac {x} {n} [/ math]. Finalmente, encuentre el promedio de [matemáticas] n [/ matemáticas] y [matemáticas] \ displaystyle \ frac {x} {n} [/ matemáticas].

Por ejemplo, la raíz cuadrada aproximada de 30:

[math] \ sqrt {30} [/ math] es aproximadamente [math] 5 [/ math]. [matemáticas] \ frac {30} {5} = 6 [/ matemáticas]. Entonces [matemáticas] \ sqrt {30} \ aprox \ frac {1} {2} (5 + 6) = 5 \ frac {1} {2} = 5.5 [/ matemáticas]. De hecho, [math] \ sqrt {30} = 5.477 … [/ math]

O otro ejemplo: [math] \ sqrt {78} [/ math] es aproximadamente [math] 9 [/ math]. [matemáticas] \ frac {78} {9} = 8 \ frac {2} {3} [/ matemáticas]. Entonces [matemáticas] \ sqrt {78} \ aprox \ frac {1} {2} (9 + 8 \ frac {2} {3}) = 8 \ frac {5} {6} = 8.8333… [/ matemáticas]. De hecho, [matemáticas] \ sqrt {78} = 8.83176 … [/ matemáticas]

Trate la raíz cuadrada como una función polinómica y use una aproximación lineal (junto con algunas matemáticas mentales básicas). Por ejemplo, sea y = sqrt (x), entonces dy = 1 / 2sqrt (x).

Para que una aproximación lineal sea razonablemente precisa, necesitamos elegir un número a tal que a esté “cerca” del valor que estamos tratando de aproximar (en este caso, 2). Si sabe que 15 ^ 2 = 225, podemos usar a = 2.25, entonces sqrt (a) = 1.5, y dy = 1 / [2 (1.5)] = 1/3.

Nuestra línea tangente, la línea tangente a la curva y = sqrt (x) en el punto (a, f (a)) = (2.25,1.5) es, por lo tanto, y = 1.5 + (1/3) (x – 2.25).

Sustituyendo x = 2, obtenemos y = 1.5 + (1/3) (-. 25) = 1.5 – 0.083 = 1.417. Esto es razonablemente cercano al valor verdadero que es aproximadamente 1.4142.

Primero, solo adivina.

Si está buscando [math] \ sqrt {n} [/ math], adivine [math] r [/ math].

¿Está [math] r ^ 2 [/ math] lo suficientemente cerca de [math] n [/ math] para sus necesidades?

Si es así, genial!

De lo contrario, reemplace [math] r [/ math] con [math] \ frac {r + \ frac {n} {r}} {2} [/ math] e intente nuevamente.

Aquí está codificado en Python: Sage Cell Server

Puede cambiar los valores de ny close_enough en find_root () .

La forma en que trato de resolver estos problemas en mi cabeza es la siguiente:

[matemáticas] \ sqrt 2 = \ sqrt {1.96 \ cdot \ frac {2} {1.96}} = 1.4 \ sqrt {1+ \ frac {4} {196}} [/ matemáticas]

Ahora desde [math] \ frac {4} {196} << 1 [/ math], podemos usar la aproximación:
[matemáticas] (1 + x) ^ a \ aprox 1 + hacha [/ matemáticas] para obtener:

[matemáticas] \ sqrt 2 = 1.4 \ sqrt {1+ \ frac {4} {196}} = 1.4 \ left (1+ \ frac {2} {196} \ right) [/ math]

Ahora [matemáticas] \ frac {2} {196} = \ frac 1 {98} \ aproximadamente 0.01 [/ matemáticas] así que:
[matemática] \ sqrt 2 = 1.4 \ izquierda (1 + 0.01 \ derecha) = 1.414 [/ matemática]. Esta aproximación tiene un error relativo de 0.015%, por lo que es bastante bueno, y con algo de práctica, ciertamente se puede hacer en su cabeza.

Si desea una mejor respuesta, tenga en cuenta que [math] \ frac 1 {98} [/ math] en realidad es aproximadamente un 2% mayor que [math] \ frac 1 {100} [/ math]. Entonces, el [matemático] 0.014 [/ matemático] que agregamos al [matemático] 1.4 [/ matemático] es en realidad aproximadamente un 2% demasiado pequeño. (Para ver por qué, [matemáticas] \ frac 1 {98} = \ frac 1 {100} \ left (1+ \ frac 2 {98} \ right) \ approx \ frac 1 {100} \ left (1+ \ frac 2 {100} \ right) = \ frac {102} {100} [/ math].) Entonces, si incluimos esta pieza adicional, la aproximación se convierte en 1.41428. El error relativo en esta aproximación es solo 0.005% (por lo que el término adicional mejora el error en un factor de tres).

Podrías usar el teorema binomial para cualquier índice racional.
(1 + x) ^ n = 1 + nx + x ^ 2 * n (n-1) / 2! +….

Pon x = 1 yn = 1/2

Limpio y sencillo. ¿Derecho?