10.4: Método de Newton
- Page ID
- 113292
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)
( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\id}{\mathrm{id}}\)
\( \newcommand{\Span}{\mathrm{span}}\)
\( \newcommand{\kernel}{\mathrm{null}\,}\)
\( \newcommand{\range}{\mathrm{range}\,}\)
\( \newcommand{\RealPart}{\mathrm{Re}}\)
\( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)
\( \newcommand{\Argument}{\mathrm{Arg}}\)
\( \newcommand{\norm}[1]{\| #1 \|}\)
\( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)
\( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)
\( \newcommand{\vectorA}[1]{\vec{#1}} % arrow\)
\( \newcommand{\vectorAt}[1]{\vec{\text{#1}}} % arrow\)
\( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vectorC}[1]{\textbf{#1}} \)
\( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)
\( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)
\( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)
\( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)
\( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)
\(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)En esta sección necesitaremos lo siguiente:
Resolver una ecuación es una parte muy importante de las matemáticas y otros campos científicos. Sin embargo, encontrar soluciones generales a las ecuaciones no es muy fácil. Considera una ecuación cúbica como
\[15x^3 −143x^2 +226x+280=0 \label{cubic1} \]
En el espíritu de la fórmula cuadrática, hay una fórmula cúbica. Gran parte de la página de wikipedia pasa tiempo resolviendo el cúbico con todas las posibilidades. En definitiva, no es muy fácil. En lugar de usar tal fórmula, un enfoque más robusto es resolverlo numéricamente.
Esta ecuación cúbica en el lado izquierdo de\ ref {cubic1} en realidad factores, pero encontrar esos factores es bastante difícil de hacer en general. Una gráfica de la función se da con
Los tres puntos de intersección entre la curva roja (\(x\)eje -eje) y la línea azul (la función,\( y = f (x)\)) son las tres raíces.
El método de Newton comienza con una “conjetura” en la raíz y luego la refina. Deja\(x_0\) ser la conjetura, entonces
Luego nos fijamos en usar el método de Newton para resolver esto. Lo siguiente devuelve otro valor para la raíz.
\[x_1 = x_0 - \frac{f(x_0)}{f'(x_0)} \label{newton} \]
Cuando el método de Newton funciona (y a menudo lo hace bien), el valor de\(x_1\) está más cerca de la raíz verdadera que\(x_0\). Tenemos la función\(f(x)\) definida en julia arriba, y podemos definir la derivada con
\[ df(x) = 45x^2-286x+226 \label{diff:cubic1} \]
Entonces podemos hacer un paso del método de Newton con
Luego podemos hacer otro paso del método de Newton usando x1
como valor de entrada y
y señalar que parece que los puntos se están acercando a la raíz (ver la trama anterior) que está entre 0 y -1. Algunas iteraciones más de esto deberían obtener un valor muy preciso de la raíz.
Ejercicio
Realiza dos pasos más del método de Newton. Eso es encontrar x3
y x4
.
Una función del método de Newton
Debería parecer natural tratar de escribir una función para realizar el método de Newton durante algún número de pasos. Caminaremos por el proceso de pensamiento en el desarrollo de la función. Comenzamos con la plantilla para esta función. Las cosas que se necesitan para encontrar una raíz usando el método de Newton es 1) la función 2) la derivada y 3) la suposición inicial. Por lo tanto comenzaremos con
Aquí hay consideraciones al construir la función:
• Necesitarás hacer los dos pasos anteriores muchas veces por lo que necesitarás un bucle. Como no sabes cuántas veces necesitarás correr por el bucle usa un bucle while y tu condición debe ser que los dos pasos x0 y x1 estén separados entre sí.
• Comprobando si dos números de punto flotante son iguales generalmente no es una buena idea, porque tienen que ser iguales a todos los bits, así que en su lugar ejecutaremos el bucle while mientras que la diferencia en los números x0 y x1 son mayores que algunos por defecto (como 10−6).
Aquí hay más un marco de la función:
Usando esto ahora podemos llamar a esta función como
Solo para simplificar esto, definiremos dx
como -f (x0) /df (x0)
, que es la distancia entre valores x sucesivos, así que usaremos esto para determinar cuándo detener el bucle:
Y solo para asegurar que la función siga devolviendo el mismo resultado,
Uso de la diferenciación automática
Si ha utilizado Sistemas de Álgebra Computacional como Maple o Mathematica, sabe que las computadoras tienen la capacidad de diferenciarse. Julia no tiene esta capacidad incorporada, aunque tiene alguna capacidad de hacer algunas de las características de estos programas. Existe un sistema llamado diferenciación automática que calculará la derivada exacta a una función en un punto dado. Es decir, si tienes una función f (x) y un número a, te dará f′ (a). El paquete se llama ForwardDiff
y es posible que deba agregarlo y luego
Por ejemplo, si define:
Método de Newton con diferenciación automática
Usando el paquete ForwardDiff
, podemos simplificar el método de Newton y no requerir que necesitemos encontrar el derivado al llamarlo. La siguiente función