La relación entre valor exacto o verdadero y el valor aproximado es la siguiente:
\begin{equation*} \text{valor verdadero} = \text{valor aproximado} + \text{error} \end{equation*}Despejando el error de la anterior ecuación:
\begin{equation*} E_{t} = \text{valor verdadero} - \text{valor aproximado} \end{equation*}donde $E_{t}$ representa el valor exacto del error o error "verdadero"
Una desventaja de la anterior fórmula es que no toma en cuenta el orden de la magnitud del valor aproximado, una manera de tomar en cuenta la magnitud de la aproximación consiste en normalizar el error verdadero respecto al valor verdadero:
\begin{equation} \text{Error relativo verdadero} = \frac{\text{error verdadero}}{\text{valor verdadero}} \end{equation}si multiplicamos por 100%:
\begin{equation} \epsilon_{t} = \frac{\text{error verdadero}}{\text{valor verdadero}} \cdot 100 \% \end{equation}donde $\epsilon_{t}$ representa error relativo porcentual verdadero.
En muchas aplicaciones reales no se conoce el valor verdadero, una alternativa es normalizar la mejor estimación posible del error verdadero:
\begin{equation*} \epsilon_{a} = \frac{\text{error aproximado}}{\text{valor aproximado}} \cdot 100 \% \end{equation*}donde $\epsilon_{a}$ representa error relativo porcentual aproximado, ciertos métodos numéricos usan un método iterativo para calcular en forma sucesiva aproximaciones para tal caso la anterior forma expresada en forma iterativa es:
\begin{equation*} \epsilon_{a} = \frac{\text{error aproximado actual - error aproximado anterior}}{\text{valor aproximado actual}} \cdot 100 \% \end{equation*}A menudo cuando se realizan cálculos no importa mucho el signo de $\epsilon_{a}$, sino que el valor absoluto relativo porcentual sea menor que una tolerancia porcentual prefijada.
\begin{equation*} | \epsilon_{a} | < \epsilon_{s} \end{equation*}Es conveniente relacionar estos errores con el número de $n$ cifras significativas:
\begin{equation*} \epsilon_{s} = \frac{10^{2 - n}}{2} \cdot 100\% \end{equation*}Calcular $e^{x}$ usando series de Maclaurin para $x = 0.5$ usando tres cifras significativas:
\begin{equation*} e^{x} = \frac{x^{0}}{0!} + \frac{x^{1}}{1!} + \frac{x^{2}}{2!} + \frac{x^{3}}{3!} + \cdots \end{equation*}El error prefijado $\epsilon_{s}$ será:
\begin{equation*} \epsilon_{s} = \frac{10^{2 - 3}}{2} \cdot 100\% = 0.05\% \end{equation*}Calculando $\epsilon_{t}$
\begin{equation*} \epsilon_{t} = \frac{1.648721 - 1}{1.648721} \cdot 100\% = 39.35\% \end{equation*}Calculando $\epsilon_{a}$
\begin{equation*} \epsilon_{a} = \frac{1 - 0}{1} \cdot 100\% = 100\% \end{equation*}Calculamos $\epsilon_{t}$
\begin{equation*} \epsilon_{t} = \frac{1.648721 - 1.5}{1.648721} \cdot 100\% = 9.02\% \end{equation*}Calculamos $\epsilon_{a}$
\begin{equation*} \epsilon_{a} = \frac{1.5 - 1}{1.5} \cdot 100\% = 33.33\% \end{equation*}Mediante el siguiente programa se calculará los errores de aproximación:
In [1]:
x = 0.5
valor_actual = 0.0
@printf("%s \t %s \t %s \t %12s\n", "iteración", "exp(0.5)", "ϵₜ %", "ϵₐ %")
for i = 0:5
valor_anterior = valor_actual
valor_actual = valor_actual + (x^i)/factorial(i)
et = ((exp(x) - valor_actual)/exp(x))*100
ea = ((valor_actual - valor_anterior) / valor_actual)*100
@printf("%d \t %16f \t %f \t %f\n", i+1, valor_actual, et, ea)
end
función MetodoIterativo(valor, es, iteración_máxima)
iteración = 1
solución_actual = valor
ea = 100
hacer
iteración = iteración + 1
solución_anterior = solución_actual
solución_actual = ...
si solución_actual != 0
ea = abs((solución_actual - solución_anterior) / solución_actual) * 100
fin si
hasta (ea <= es) o (iteración >= iteración_máxima)
fin hacer
MetodoIterativo = solución_actual
fin MetodoIterativo
In [2]:
function exponencial(x, es, i_max)
i = 0
valor_actual = 0
while true
valor_anterior = valor_actual
valor_actual = valor_actual + (x^i)/factorial(i)
i = i + 1
if valor_actual != 0
ea = ((valor_actual - valor_anterior) / valor_actual)*100
end
if (ea <= es) || (i >= i_max)
println("iteración = ", i) # solo para comprobar
println("ea = ", ea) # solo para comprobar
println("et = ", ((exp(x) - valor_actual)/exp(x))*100) # solo para comprobar
break
end
end
return valor_actual
end
Out[2]:
In [3]:
exponencial(1, 1e-6, 100)
Out[3]:
In [4]:
nextfloat(0.0)
Out[4]:
El siguiente número que existe después de $1$ es:
In [5]:
nextfloat(1.0)
Out[5]:
In [6]:
Δx = nextfloat(1.0) - 1.0
println("Δx = ", Δx)
El épsilon de máquina es la "distancia" entre dos números de punto flotante, se calcula como:
\begin{equation*} \epsilon = b^{1 - t} \end{equation*}donde $b$ es el número base y $t$ es el número de cifras significativas en la mantisa, por ejemplo si $t = 16$:
\begin{equation*} \epsilon = 10^{1 - 16} = 0.000000000000001 \end{equation*}Puede ser calculado mediante el siguiente seudocódigo:
epsilon = 1
hacer
epsilon = epsilon / 2
hasta epsilon + 1 <= 1
fin hacer
epsilon = 2 * epsilon
Programa para calcular el épsilon de máquina
In [7]:
ϵ = 1
while true
ϵ = ϵ/2
if ϵ + 1 <= 1
break
end
end
ϵ = 2ϵ
Out[7]:
Comparamos con el comando eps()
In [8]:
eps(Float64)
Out[8]:
In [9]:
sum1 = float32(0.0)
sum2 = float32(0.0)
sum3 = float64(0.0)
x1 = float32(1.0)
x2 = float32(1.0e-5)
x3 = float64(1.0e-5)
for i = 1:100000
sum1 = sum1 + x1
sum2 = sum2 + x2
sum3 = sum3 + x3
end
println("Cálculos son Float32")
println("Valor exacto = ", 100000)
println("Valor aproximado = ", sum1)
println("Cálculos son Float32")
println("Valor exacto = ", 1)
println("Valor aproximado = ", sum2)
println("Cálculos son Float64")
println("Valor exacto = ", 1)
println("Valor aproximado = ", sum3)
In [10]:
a = float32(1.0)
b = float32(3000.001)
c = float32(3.0)
d = sqrt(b^2 - 4*a*c)
x1 = (-b + d) / 2*a
x2 = (-b - d) / 2*a
println("Cálculos con Float32")
println("x1 = ", x1)
println("x2 = ", x2)
a = 1.0
b = 3000.001
c = 3.0
d = sqrt(b^2 - 4*a*c)
x1 = (-b + d) / 2*a
x2 = (-b - d) / 2*a
println("Cálculos con Float64")
println("x1 = ", x1)
println("x2 = ", x2)
Cuando $b^{2} \gg 4ac$ se racionaliza la fórmula
\begin{align} x_{1} &= \frac{-b + \sqrt{b^{2} - 4 a c}}{2 a} \left( \frac{-b - \sqrt{b^{2} - 4 a c}}{-b - \sqrt{b^{2} - 4 a c}} \right) = \frac{-2 c}{b + \sqrt{b^{2} - 4 a c}} \\ x_{2} &= \frac{-b - \sqrt{b^{2} - 4 a c}}{2 a} \left( \frac{-b + \sqrt{b^{2} - 4 a c}}{-b + \sqrt{b^{2} - 4 a c}} \right) = \frac{-2 c}{b - \sqrt{b^{2} - 4 a c}} \end{align}
In [11]:
a = float32(1.0)
b = float32(3000.001)
c = float32(3.0)
d = sqrt(b^2 - 4*a*c)
x1 = -2*c / (b + d)
x2 = -2*c / (b - d)
println("Cálculos con Float32")
println("x1 = ", x1)
println("x2 = ", x2)
a = 1.0
b = 3000.001
c = 3.0
d = sqrt(b^2 - 4*a*c)
x1 = -2*c / (b + d)
x2 = -2*c / (b - d)
println("Cálculos con Float64")
println("x1 = ", x1)
println("x2 = ", x2)
Calcular $e^{x}$ usando series de Maclaurin para $x = 10$ y $x = -10$:
\begin{equation*} e^{x} = \frac{x^{0}}{0!} + \frac{x^{1}}{1!} + \frac{x^{2}}{2!} + \frac{x^{3}}{3!} + \cdots \end{equation*}Esta vez no usaremos la función factorial() en la función que calculará $e^{x}$, se usará el siguiente método:
\begin{equation*} e^{x} = 1 + (1) \frac{x}{1} + (1) ( \frac{x}{1} ) \frac{x}{2} + (1) ( \frac{x}{1} ) ( \frac{x}{2} ) \frac{x}{3} + (1) ( \frac{x}{1} ) ( \frac{x}{2} ) ( \frac{x}{3} ) \frac{x}{4} + \cdots \end{equation*}
In [12]:
function seriee(x)
i = 0
valor_anterior = float32(0.0)
sumando = float32(1.0)
valor_actual = float32(1.0)
@printf("%s \t %s \t %s \t %20s\n", "i", "valor_anterior", "sumando", "valor_actual")
while true
i += 1
valor_anterior = valor_actual
sumando = sumando * float32(x)/i
valor_actual = valor_actual + sumando
@printf("%d \t %0.12f \t %0.12f \t %0.12f\n", i, valor_anterior, sumando, valor_actual)
if valor_actual == valor_anterior
break
end
end
println("exp($(x)) = ", exp(x))
end
Out[12]:
In [13]:
seriee(10)
In [14]:
seriee(-10)