Numerické řešení rovnic - metoda tečen

Tento notebook umožňuje názorně pochopit princip Newtonovy metody (metody tečen) určené k numerickému řešení rovnic.
Rovnice, kterou metoda tečen řeší, je zadána ve tvaru funkce[x]=0. Tuto funkci může uživatel měnit. Stejně tak může měnit počáteční bod (Subscript[x, 0]), od něhož metoda začne (oba tyto vstupy jsou níže v notebooku zvýrazněny červeně).
Tento notebook NEHLEDÁ VŠECHNY KOŘENY DANÉ ROVNICE!!! Slouží pouze jako ukázka použití dané metody.

Tlačítkem Další krok se zobrazí další krok metody. Pozor! Jedna iterace (nalezení jednoho kořene) je rozděleno do více kroků z důvodu ilustrace dané metody.

Tlačítkem Ulož obrázek se uloží právě zobrazené "bílé" okno do aktuální složky (složka, v níž je uložen tento notebook) pod jménem, které je uloženo v proměnné jmenosouboru. K tomuto jménu souboru je při opakovaném ukládání grafu přidáváno pořadové číslo.
Pozor! Při každém spuštění tohoto apletu se začínají soubory číslovat opět od jedné! Tak může dojít k přepsání minule uložených obrázků.

© Jaroslav Reichl, 2009

ClearAll["Global`*"];

funkce[x_]:=0.25(x^3)-1.3(x^2);
x0=-5;

Příprava pro vykreslení grafu

jmenosouboru="metoda_tecen_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;

x1=-10;x2=-x1;
y1=-10;y2=-y1;

n0=1;nmin=1;nmax=10;deltan=1;

tloustka=0.005;
velikostbodu=0.02;
presnost=(10^(-8));
velikostpisma=15;
typpisma=Plain;

barva=Black;
barvafunkce=Blue;
barvatecny=Red;
barvabodu=Darker[Green];
barvatextu=Magenta;

dalsikrok=True;
konec=False;
pocetkroku=0;
pocetiteraci=0;

prusecikx=x0;

MetodaTecen=Manipulate[Deploy[
If[dalsikrok,
{If[Mod[pocetkroku,3]==1,
{reseni=Solve[tecnax0[x]==0,x],
prusecikx=x/.reseni[[1]],
x0vypis=prusecikx,
pocetiteraci=pocetiteraci+1,
If[Abs[funkce[prusecikx]]<presnost,
{konec=True,
typpisma=Bold},
konec=False]},
If[Mod[pocetkroku,3]==0,
{x0=prusecikx,
tecna[x_]:=funkce'[x0]x+q,
reseni=Solve[tecna[x0]==funkce[x0],q],
q0=q/.reseni[[1]],
tecnax0[x_]:=tecna[x]/.q->q0},
""]],
dalsikrok=False},
""];

grafik=Show[
Plot[{funkce[x],tecnax0[x]},{x,x1,x2},PlotStyle->{{barvafunkce,Thickness[tloustka]},{barvatecny,Thickness[tloustka]}},AxesLabel->{"x","y"}],

Graphics[{
If[Mod[pocetkroku,3]==0,
{barvatecny,PointSize[velikostbodu],Point[{x0,funkce[x0]}]},
Text[""]],
If[Mod[pocetkroku,3]==1,
{barvabodu,PointSize[velikostbodu],Point[{prusecikx,0}]},
Text[""]],
If[Mod[pocetkroku,3]==2,
{{barvabodu,PointSize[velikostbodu],Point[{prusecikx,0}]},
{barvabodu,Thickness[0.5tloustka],Dashed,Line[{{prusecikx,0},{prusecikx,funkce[prusecikx]}}]},
{barvatecny,PointSize[velikostbodu],Point[{prusecikx,funkce[prusecikx]}]}},
Text[""]],
If[konec,
Text[Style[StringJoin["Jeden z kořenů dané rovnice je ",ToString[Round[prusecikx,0.01]],"."],20,barvatextu,FontFamily->Times,Bold],{((x1+x2)/2),y1},{Center,Bottom}],
Text[""]]
}],
FormatType->StandardForm,AspectRatio->Automatic,PlotRange->{{x1,x2},{y1,y2}},ImageSize->500
]],

Button[" Další krok ",{
If[dalsikrok==False∧konec==False,
{pocetkroku=pocetkroku+1,
dalsikrok=True},
""]},ImageSize->{100,Automatic}],
Delimiter,
Button[" Ulož obrázek ",{pocetulozeni=pocetulozeni+1,Export[StringInsert[StringJoin[cesta,jmenosouboru],ToString[pocetulozeni],-5],grafik]},ImageSize->{100,Automatic}],
Delimiter,
Dynamic[
Grid[{
{Item[Style["                                                      ",velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{Item[Style[StringJoin["Iterace číslo: ",ToString[pocetiteraci]],velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{Item[Style[" ",velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[pocetiteraci>0,
Item[Style[StringJoin["Průsečík s x: ",ToString[Round[x0vypis,1.presnost]]],velikostpisma,barva,FontFamily->Times,typpisma],Alignment->Left],
""]},
{Item[Style[" ",velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[pocetiteraci>0,
Item[Style[StringJoin["Funkční hodnota: ",ToString[Round[funkce[x0vypis],1. (presnost^2)],TraditionalForm]],velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]}
}]],
ControlPlacement->Left,
FrameLabel->{Style["© Jaroslav Reichl, 2009",10,Black,FontFamily->Times],"",Style[StringJoin["Metoda tečen: numerické řešení rovnice ",ToString[funkce[x],TraditionalForm]," = 0"],25,Black,FontFamily->Times],""}];

Spuštění výpočtu
Zpracujte běžným způsobem následující buňku a na dotaz, který se objeví, odpovězte ANO.

MetodaTecen