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

Tento notebook umožňuje názorně pochopit princip metody sečen určené k numerickému řešení rovnic.
Rovnice, kterou metoda seč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í body (Subscript[a, 0]) a (Subscript[b, 0]) intervalu, na kterém metoda začíná (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);
a0=-2;
b0=6;

Příprava pro vykreslení grafu

jmenosouboru="metoda_secen_.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;
barvasecny=Red;
barvabodu=Darker[Green];
barvatextu=Magenta;

pocetkroku=0;
pocetiteraci=0;

anove=a0;
bnove=b0;

If[(funkce[a0] funkce[b0]>0)∨a0≥b0,
{okzadani=False,
konec=True,
dalsikrok=False},
{okzadani=True,
konec=False,
dalsikrok=True}];

MetodaSecen=Manipulate[Deploy[
If[dalsikrok,
{If[Mod[pocetkroku,3]==1,
{reseni=Solve[secnax0[x]==0,x],
prusecikx=x/.reseni[[1]],
x0vypis=prusecikx,
pocetiteraci=pocetiteraci+1,
konec=False,
If[Abs[funkce[prusecikx]]<presnost,
{konec=True,
typpisma=Bold},
If[funkce[a0] funkce[prusecikx]<0,
{bnove=prusecikx,
druhykonecintervalu=a0},
If[funkce[b0] funkce[prusecikx]<0,
{anove=prusecikx,
druhykonecintervalu=b0},
""]]]},
If[Mod[pocetkroku,3]==0,
{a0=anove,b0=bnove,
secna[x_]:=((funkce[b0]-funkce[a0])/(b0-a0))x+q,
reseni=Solve[secna[b0]==funkce[b0],q],
q0=q/.reseni[[1]],
secnax0[x_]:=secna[x]/.q->q0},
""]],
dalsikrok=False},
""];

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

Graphics[{
If[okzadani,
{If[Mod[pocetkroku,3]==0∨Mod[pocetkroku,3]==1,
{{barvasecny,PointSize[velikostbodu],Point[{a0,funkce[a0]}]},
{barvasecny,PointSize[velikostbodu],Point[{b0,funkce[b0]}]}},
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]}}]},
{barvasecny,PointSize[velikostbodu],Point[{prusecikx,funkce[prusecikx]}]},
{barvasecny,PointSize[velikostbodu],Point[{druhykonecintervalu,funkce[druhykonecintervalu]}]}},
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[""]]},
Text[Style["Metodu nelze použít!",20,barvatextu,FontFamily->Times,Bold],{((x1+x2)/2),y1},{Center,Bottom}]]
}],
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 seč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.

MetodaSecen