El método de Newton no tiene garantía de convergencia global para funciones arbitrarias, como acabas de aprender.
Ahora, las personas han publicado ejemplos en los que el método de Newton no converge, pero todos son funciones bastante "inusuales" (algunas muy poco suaves), por lo que es natural asumir que son patológicas y que no ocurrirán en la práctica.
Tu ejemplo es uno en el que Newton solo necesita más iteraciones de las esperadas para converger, así que no es tan malo. Pero aquí hay un ejemplo de un polinomio cúbico para el cual el método de Newton no convergerá!
\begin{align*} f(x) &= -0.74 + 0.765 x + 1.1 x^2 - 3.55 x^3 \\ x_0 &= 5/9 \end{align*}
No solo eso, sino que de hecho es una oscilación estable—pequeñas perturbaciones no cambiarán el comportamiento.
¡Y para puntos adicionales, puedes generar tantos como desees! Solo deja que el paso de Newton sea $$g(x) = x - f'(x)^{-1} f(x)$$ y estás buscando una solución no trivial a la ecuación $$x_0 = g^3(x_0) = g(g(g(x_0)))$$ donde una solución $x_0$ sería trivial si $g(x_0) = x_0$ (también conocido como punto fijo).
Observa que la ecuación anterior es simplemente otra ecuación polinómica (aunque de un orden mucho mayor)—lo que significa que sus soluciones se pueden encontrar fácilmente de forma numérica.
La única advertencia es que estas soluciones no necesariamente serán estables. Sospecho que deberías poder colocar una condición de segunda derivada para asegurar soluciones estables, pero la ecuación exacta no es obvia para mí en este momento, así que lo dejo como un ejercicio para el lector. :-)
Código de Mathematica para el gráfico:
Manipulate[
With[{f = Evaluate[Rationalize[d + c # + b #^2 + a #^3]] &}, Plot[
f[x], {x, -0.61, 1},
PlotStyle -> {Thickness[Tiny]},
Prolog -> {Thickness[Tiny],
Line[Flatten[Map[
{{#, 0}, {#, f[#]}} &,
NestList[Compile[t, t - f[t]/f'[t]], x0, n]], 1]]}]],
{{a, -3.55}, -4, 4},
{{b, 1.1}, -2, 2},
{{c, 0.765}, -1, 1},
{{d, -0.74}, -1, 1},
{{x0, 5/9}, 0, 1},
{{n, 100}, 0, 1000, 1}]
Actualización:
He escrito un código para encontrar intencionalmente iteraciones estables e inestables:
Newton[f_] := t \[Function] t - f[t]/f'[t];
NewtonPlot[f_, xmin_, xmax_, x0_, n_, args___] :=
Plot[f[x], {x, xmin, xmax}, args,
Prolog -> {Thickness[Tiny],
Line[Flatten[Map[
{{#, 0}, {#, f[#]}} &,
NestList[Compile[t, Newton[f][t]], x0, n]], 1]]}];
FindOscillatoryNewtonSolutions[f_, n_, h_](* {Stables,Unstables} *):=
With[{step = Newton[f]},
With[{nstep = t \[Function] Nest[step, t, n]},
GroupBy[
Map[#[[1]][[2]] &,
Solve[{nstep[t] == t, Abs[step[t] - t] >= h}, t, Reals]],
t \[Function]
With[{step1hp = nstep[t + h], step1hm = nstep[t - h]}, True \[And]
Abs[N[step1hp - t]] >= Abs[N[nstep[step1hp] - t]] \[And]
Abs[N[step1hm - t]] >= Abs[N[nstep[step1hm] - t]]]]]];
With[{z = 400, xmin = -1.1, xmax = +0.65, h = 10^-3},
Manipulate[
With[{f =
t \[Function] Evaluate[Rationalize[d + c t + b t^2 + a t^3]],
n = 3, m = 8},
With[{solcategories = FindOscillatoryNewtonSolutions[f, n, h]},
If[Length[solcategories] >= 2,
Map[{Transpose@{N@SortBy[NestList[Newton[f], #1, n - 1], N]},
NewtonPlot[f, xmin, xmax, N[#1 + dx], n*m,
PlotStyle -> {Thickness[Tiny]},
ImageSize -> Scaled[0.2],
PerformanceGoal -> "Quality"]} &, {First@Lookup[solcategories, True],
First@Lookup[solcategories, False]}],
Throw["Did not manage to find both a stable and an unstable solution."]]]],
{{dx, h}, -4 h, +4 h, h/4},
{{a, -355}, -z, +z, 1}, {{b, 110}, -z, +z, 1},
{{c, 77}, -z, +z, 1}, {{d, -74}, -z, +z, 1},
SynchronousUpdating -> False]]
Observa, debajo, que el primer punto itera de forma estable, mientras que el segundo itera de forma inestable. (Las iteraciones se alejarían aún más, pero las corté en algún punto.)
6 votos
Tenga en cuenta que a partir de $x_{n+1}=x_n+\dfrac{x_n^3-2x_n^2+2}{4x_n-3x_n^2}$, deberíamos obtener $x_2=1.5$, no $2.5$.
4 votos
¡Muy buen ejemplo! El método parece fallar, ¡pero eventualmente tiene éxito!
0 votos
@user163862 El gráfico muestra que es mejor comenzar desde un valor a la izquierda de la raíz, como -1.2
2 votos
@Narasimham A la izquierda de la raíz no importa realmente, el punto es que debería estar a la izquierda de ese mínimo en $0$.
0 votos
En tu problema, ¿qué ocurre si $x_1 = 0$? ¿Por qué? ¿Qué característica del gráfico en $x=0$ causa esto? Si eliges $x_1 \in (0,1)$, ¿dónde se encuentra $x_2$? ¿Qué característica del gráfico en esa región causa esto?
2 votos
En resumen: tu punto de partida estaba demasiado cerca de un extremo. Si puedes elegir puntos de partida que estén lo más lejos posible de los extremos (¡y por supuesto cerca de la raíz deseada!), hazlo.
0 votos
@Ian De hecho. Si tomamos $q \sin px + q \sin qx=0, p, q$ función real ondulada con muchos extremos.. para mantenernos en el camino se requiere un criterio..
0 votos
Si comienzas con un valor inicial de -1, rápidamente te acercarás a la solución. En electrónica tenemos un problema similar con la ecuación del diodo, I = Io (exp(kV) - 1). Si tienes un diodo en serie con una resistencia, y adivinas un voltaje inicial que es demasiado alto, obtendrás tonterías. Resulta que para este, hay una forma extraña de obtener la solución directamente mediante la función Lambert W (que está integrada en la calculadora de mano WP-34s). Pero eso no es aplicable a tu función.
0 votos
Este artículo podría ser interesante: chiark.greenend.org.uk/~sgtatham/newton