Newtonova metoda hledání kořene je známá svojí rychlostí, ale zároveň vyžaduje správné místo, kde začít.
Zkusíme zjistit, který kořen tato metoda najde v závislosti na tom, kde začneme.

Pro jednoduchost (a také, že to bývá zvykem) budeme počítat třetí odmocninu z jedné

f[x_] = x^3-1
f1[x_]=D[f[x],x]
nextx[x_] := x - f[x]/f1[x]

Pozorování konvergence

Table[ Nest[nextx,1.5,k],{k,0,4}]

Cvičení: “optimalizujte” výraz výše tak, aby se nextx volalo jen 4x nikoli (1+2+3+4)x

Nyní můžeme napsat funkci, ktera vystartuje z x=w a najde aproximaci k řešení rovnice
x^3 - 1 == 0 po 30 iteracích Newtonovy metody

(*Pocita se třetí odmocnina z jedné, 
abychom si neobsadili symbol x, pouzijeme Module*)
to1[ w_ ] := Module[ {x=N[w],dalsiLokalniPromenna,jestejedna},
Do[x = nextx[x],30];
x
]

to1[-1+1.5I]
to1[-1-1.5I]
to1[2]

ContourPlot[ Im[ to1[ x+I y] ] ,{x,-1,1},{y,-1,1},PlotPoints->20,Contours->{-1/2,1/2}]

Bohužel výše deklarovaná funkce to1 není moc výkonná:

AbsoluteTiming[ matice = Table[ Im[ to1[ x+I y] ] ,{x,-1,1,1/200},{y,-1,1,1/200} ]; ]

Za část zdržení může vnořené volání funkce nextx[x]

nextx[x]//Factor

Pokud jej odstraníme, je to o něco lepší

to2 =Function[{w},Module[ {x=N[w]},
Do[
x =(1+2 x^3)/(3 x^2)
,30];
x
] ];

AbsoluteTiming[ matice = Table[ Im[ to2[ x+I y] ] ,{x,-1.0000001,1,1/200},{y,-1,1,1/200} ]; ]

Vektorizace !

Timing[ matice =Table[  Im[ to2[ Table[  x+I y ,{x,-1.0000001,1,1/200} ] ]],{y,-1,1,1/200}]; ]

MatrixPlot[matice]

Kdyby nekdy nebylo mozne pouzit vypocet po radcich,  pak podobně velké zrychlení přinese před-překlad numerické funkce

to3 =Compile[
{{w,_Complex}},(*Seznam formalnich parametru VCETNE typu*)
Module[ {x=w},
If[x==0,x=1];
Do[
x =(1+2 x^3)/(3 x^2)
,30];
x
] ]
AbsoluteTiming[ matice = Table[ Im[ to3[ x+I y] ] ,{x,-1,1,1/200},{y,-1,1,1/200} ]; ]

+ paralelizace skrze ParallelTable

AbsoluteTiming[matice = ParallelTable[ Im[ to3[ x+I y] ] ,{x,-1,1,1/200},{y,-1,1,1/200} ]; ]
MatrixPlot[matice,DataRange->{{-2,2},{-2,2}}]

Ještě ukázka, jak užívat tzv. události (events) k zoomovanání grafu
Levé tlač. myši zvětšuje, pravé zvětšení anuluje 
(některé grafické funkce vyžadujeí volbu ,PerformanceGoal->”Quality”, bez ní to vypadá strašně)
Podobně, jako Manipulate, to má ve “výzkumu” poměrně malé užití ....

drawRectangle=False;
{ax,ay,bx,by}={-2,-2,2,2};
matice = Reverse@ParallelTable[ 0.5+Im[ to3[ x+I y] ] ,{y,ay,by,(by-ay)/400}, {x,ax,bx,(bx-ax)/400} ]; 
graphics=MatrixPlot[matice,DataRange->{{ax,bx},{ay,by}},ColorFunction->"RedBlueTones",ColorFunctionScaling->False,ImageSize->555];

EventHandler[
Dynamic[
LocatorPane[
Dynamic[{bx,by}],
Show[graphics,Graphics[{Directive[{Green,Opacity[0.5]}],If[drawRectangle,Rectangle[{ax,ay},{bx,by}]]}]],
AutoAction->drawRectangle,Appearance->None]],
{{"MouseDown",1}:>(
drawRectangle=True;{ax,ay}=MousePosition["Graphics"];
),
{"MouseUp",1}:>(
drawRectangle=False;
{ax,ay,bx,by}={Min[ax,bx],Min[ay,by],Max[ax,bx],Max[ay,by]};
Print["Zoom: ",{ax,ay,bx,by}];
matice = Reverse@ParallelTable[ 0.5+Im[ to3[ x+I y] ] ,{y,ay,by,(by-ay)/400}, {x,ax,bx,(bx-ax)/400}]; 
graphics=MatrixPlot[matice,DataRange->{{ax,bx},{ay,by}},ColorFunction->"RedBlueTones",ColorFunctionScaling->False,ImageSize->555];
     ),
{"MouseClicked",2}:>(
{ax,ay,bx,by}={-2,-2,2,2};
Print["Reset"];
matice = Reverse@ParallelTable[ 0.5+Im[ to3[ x+I y] ] ,{y,ay,by,(by-ay)/400}, {x,ax,bx,(bx-ax)/400} ]; 
graphics=MatrixPlot[matice,DataRange->{{ax,bx},{ay,by}},ColorFunction->"RedBlueTones",ColorFunctionScaling->False,ImageSize->555];
)
}]