Lineárně lomená funkce y = ((a.x + b)/(c.x + d))

Následující aplet umožňuje názorně pochopit vliv koeficinetů a, b, c a d zobrazení grafu lineárně lomené funkce dané předpisem y = ((a.x + b)/(c.x + d)).
Pomocí posuvníků lze měnit uvedené koeficienty a, b, c a d, přičemž program funkci nezobrazí pouze tehdy, je-li jmenovatel identicky roven nule. V ostatních případech zobrazí funkce, které lze získat z obecného předpisu tak, že některé koeficienty budou nulové. V tom případě se zobrazí graf funkce konstantní nebo lineární.

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, 2008

Příprava pro vykreslení grafu

ClearAll["Global`*"];
jmenosouboru="fce_lin_lomena_.jpg";
cesta=NotebookDirectory[];
pocetulozeni=0;

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

a0=0;amin=-5;amax=5;deltaa=0.1;
b0=1;bmin=-5;bmax=5;deltab=0.1;
c0=1;cmin=-5;cmax=5;deltac=0.1;
d0=0;dmin=-5;dmax=5;deltad=0.1;

tloustka=0.005;
velikostpisma=20;

barva=Black;
barvaa=Darker[Red];
barvab=Blue;
barvac=Darker[Green,0.6];
barvad=Magenta;
barvaas1=RGBColor[0.8,0.7,0];
barvaas2=RGBColor[0,0.7,0.7];
barvagrafu=Red;
barvainverzni=Orange;
barvainvas1=barvainverzni;
barvainvas2=barvainverzni;

(*"Funkce", která v příkazu Manipulate[] použita ke správnému výpisu čitatele i jmenovatele funkce dané i funkce k ní inverzní.*)
Vypis[cislo1_,cislo2_,barva1_,barva2_]:=(
pomocnytext="";
If[cislo1≠0,
If[cislo1≠1,
pomocnytext=StringJoin[pomocnytext,ToString[Style[ToString[cislo1],barva1],StandardForm]],
""],
""];
If[cislo1≠0,
If[cislo2≠0,
If[cislo2>0,
pomocnytext=StringJoin[pomocnytext,ToString[Style["x + ",barva],StandardForm]],
pomocnytext=StringJoin[pomocnytext,ToString[Style["x - ",barva],StandardForm]]],
pomocnytext=StringJoin[pomocnytext,ToString[Style["x",barva],StandardForm]]],
If[cislo2<0,
pomocnytext=StringJoin[pomocnytext,ToString[Style["- ",barva],StandardForm]],
""]];
If[cislo2≠0,
pomocnytext=StringJoin[pomocnytext,ToString[Style[ToString[Abs[cislo2]],barva2],StandardForm]],
If[cislo1==0,
pomocnytext=StringJoin[pomocnytext,ToString[Style[ToString[Abs[cislo2]],barva2],StandardForm]],
pomocnytext=pomocnytext]]
);

funkce1[x_]:=(1/x);

LinLomenaFce=Manipulate[Deploy[
funkce2[x_]:=((a x+b)/(c x+d));
fceinverzni[x_]:=((d x-b)/(-c x+a));
If[c≠0,
{asymptotax=Line[{{x1,(a/c)},{x2,(a/c)}}],
asymptotay=Line[{{-(d/c),y1},{-(d/c),y2}}],
asymptotainvx=Line[{{x1,-(d/c)},{x2,-(d/c)}}],
asymptotainvy=Line[{{(a/c),y1},{(a/c),y2}}]},
""];

(*Definiční obor a obor hodnot.*)
If[zobrazitinverznifci==False,
{If[c≠0&&a d-b c≠0,
{If[c d>0,
znamenko="-",
znamenko=""],
defobor=StringJoin[ToString[Style[ToString[Subscript["D",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ℝ ∖ {",StringJoin[ToString[Style[znamenko,barva],StandardForm],ToString[DisplayForm[FractionBox[ToString[Style[ToString[Abs[d]],barvad],StandardForm],ToString[Style[ToString[Abs[c]],barvac],StandardForm]]],StandardForm]],"}"];
If[a c≥0,
znamenko="",
znamenko="-"],
oborhodnot=StringJoin[ToString[Style[ToString[Subscript["H",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ℝ ∖ {",StringJoin[ToString[Style[znamenko,barva],StandardForm],ToString[DisplayForm[FractionBox[ToString[Style[ToString[Abs[a]],barvaa],StandardForm],ToString[Style[ToString[Abs[c]],barvac],StandardForm]]],StandardForm]],"}"]},
""],
If[c==0&&a≠0&&d≠0,
{defobor=StringJoin[ToString[Style[ToString[Subscript["D",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ℝ"],
oborhodnot=StringJoin[ToString[Style[ToString[Subscript["H",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ℝ"]},
""];
If[a d-b c==0&&((c≠0&&d==0)∨(c==0&&d≠0)),
{If[d≠0,
{If[b d≥0,
znamenko="",
znamenko="-"],
oborhodnot=StringJoin[ToString[Style[ToString[Subscript["H",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = {",znamenko,ToString[DisplayForm[FractionBox[ToString[Style[ToString[Abs[b]],barvab],StandardForm],ToString[Style[ToString[Abs[d]],barvad],StandardForm]]],StandardForm],"}"]},
{If[a c≥0,
znamenko="",
znamenko="-"],
oborhodnot=StringJoin[ToString[Style[ToString[Subscript["H",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = {",znamenko,ToString[DisplayForm[FractionBox[ToString[Style[ToString[Abs[a]],barvaa],StandardForm],ToString[Style[ToString[Abs[c]],barvac],StandardForm]]],StandardForm],"}"]}],
defobor=StringJoin[ToString[Style[ToString[Subscript["D",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ℝ"]},
""]},
{If[c≠0&&a d-b c≠0,
{If[c d>0,
znamenko="-",
znamenko=""],
defobor=StringJoin[ToString[Style[ToString[Subscript["D",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ",ToString[Style[ToString[Subscript["H",Superscript[ToString[Style["f",barvainverzni],StandardForm],ToString[Style["-1",barvainverzni],StandardForm]]],StandardForm],barva],StandardForm]," = ℝ ∖ {",StringJoin[ToString[Style[znamenko,barva],StandardForm],ToString[DisplayForm[FractionBox[ToString[Style[ToString[Abs[d]],barvad],StandardForm],ToString[Style[ToString[Abs[c]],barvac],StandardForm]]],StandardForm]],"}"],
If[a c≥0,
znamenko="",
znamenko="-"],
oborhodnot=StringJoin[ToString[Style[ToString[Subscript["H",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ",ToString[Style[ToString[Subscript["D",Superscript[ToString[Style["f",barvainverzni],StandardForm],ToString[Style["-1",barvainverzni],StandardForm]]],StandardForm],barva],StandardForm]," = ℝ ∖ {",StringJoin[ToString[Style[znamenko,barva],StandardForm],ToString[DisplayForm[FractionBox[ToString[Style[ToString[Abs[a]],barvaa],StandardForm],ToString[Style[ToString[Abs[c]],barvac],StandardForm]]],StandardForm]],"}"]},
""],
If[c==0&&a≠0&&d≠0,
{defobor=StringJoin[ToString[Style[ToString[Subscript["D",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ",ToString[Style[ToString[Subscript["H",Superscript[ToString[Style["f",barvainverzni],StandardForm],ToString[Style["-1",barvainverzni],StandardForm]]],StandardForm],barva],StandardForm]," = ℝ"],
oborhodnot=StringJoin[ToString[Style[ToString[Subscript["H",ToString[Style["f",barvagrafu],StandardForm]],StandardForm],barva],StandardForm]," = ",ToString[Style[ToString[Subscript["D",Superscript[ToString[Style["f",barvainverzni],StandardForm],ToString[Style["-1",barvainverzni],StandardForm]]],StandardForm],barva],StandardForm]," = ℝ"]},
""]}];
(*Definiční obor a obor hodnot.*)

If[c≠0∨ d≠0,
predpisfunkce=StringJoin["f: y = ",ToString[DisplayForm[FractionBox[Vypis[a,b,barvaa,barvab],Vypis[c,d,barvac,barvad]]],StandardForm]],
predpisfunkce="Funkce není definována!"];
If[zobrazitinverznifci&&(a d-b c≠0∨a c≠0),
predpisinverznifunkce=StringJoin["(f^(-1)): y = ",ToString[DisplayForm[FractionBox[Vypis[d,-b,barvad,barvab],Vypis[-c,a,barvac,barvaa]]],StandardForm]],
predpisinverznifunkce="Inverzní funkce není definována!"];
If[c≠0,
{If[(d/c)≥0,
znamenko1=" + ",
znamenko1=" - "],
If[((b c-a d)/(c^2))≥0,
znamenko2=" + ",
znamenko2=" - "],
upravenypredpis=StringJoin["f: y = ",ToString[Style[ToString[Round[(a/c),0.01]],barvaas1],StandardForm],znamenko2,ToString[DisplayForm[FractionBox[Style[ToString[Abs[Round[((b c-a d)/(c^2)),0.01]]],barva],StringJoin["x",znamenko1,ToString[Style[ToString[Abs[Round[(d/c),0.01]]],barvaas2],StandardForm]]]],StandardForm]]},
upravenypredpis="Předpis nelze upravit!"];

grafik=Show[
Plot[funkce1[x],{x,x1,x2},Exclusions->{ x==0},PlotStyle->{barva,Thickness[0.5tloustka]},PlotRange->{{x1,x2},{y1,y2}},AxesOrigin->{0,0},AxesLabel->{"x","y"}],
If[(zobrazitinverznifci==False&&(c≠0∨d≠0))∨(zobrazitinverznifci&&(a d-b c≠0∨a c≠0)),
Plot[funkce2[x],{x,x1,x2},Exclusions->{c x+d==0},PlotStyle->{barvagrafu,Thickness[tloustka]},PlotRange->{{x1,x2},{y1,y2}},AxesOrigin->{0,0},AxesLabel->{"x","y"}],
Plot[0,{x,x1,x2},PlotStyle->{barva,Thickness[0.01tloustka]},PlotRange->{{x1,x2},{y1,y2}},AxesOrigin->{0,0},AxesLabel->{"x","y"}]],
If[zobrazitinverznifci&&(a d-b c≠0∨a c≠0),
Plot[fceinverzni[x],{x,x1,x2},Exclusions->{c x-a==0},PlotStyle->{barvainverzni,Thickness[tloustka]},PlotRange->{{x1,x2},{y1,y2}},AxesOrigin->{0,0},AxesLabel->{"x","y"}],
Plot[0,{x,x1,x2},PlotStyle->{barva,Thickness[0.01tloustka]},PlotRange->{{x1,x2},{y1,y2}},AxesOrigin->{0,0},AxesLabel->{"x","y"}]],
Graphics[{
If[zobrazitasymptoty&&c≠0&&a d -b c≠0,
{{barvaas1,Dashed,Thickness[0.7tloustka],asymptotax},
{barvaas2,Dashed,Thickness[0.7tloustka],asymptotay}},
Text[""]],
If[c==0&&d==0,
Text[Style["G R A F   F U N K C E   N E L Z E   Z O B R A Z I T !",20,barvagrafu,FontFamily->Times,Bold],{((x1+x2)/2),((y1+y2)/2)},{Center,Bottom}],
Text[""]],
If[zobrazitinverznifci,
If[a d-b c≠0∨a c≠0,
If[zobrazitasymptoty,
{{barvainvas1,Dashed,Thickness[0.7tloustka],asymptotainvx},
{barvainvas2,Dashed,Thickness[0.7tloustka],asymptotainvy}},
Text[""]],
Text[Style["G R A F   F U N K C E   N E L Z E   Z O B R A Z I T !",20,barvagrafu,FontFamily->Times,Bold],{((x1+x2)/2),((y1+y2)/2)},{Center,Bottom}]],
Text[""]]
}],
FormatType->StandardForm,AspectRatio->Automatic,PlotRange->{{x1,x2},{y1,y2}},ImageSize->500
]],

{{a,a0,Style["a",15,barvaa]},amin,amax,deltaa},
{{b,b0,Style["b",15,barvab]},bmin,bmax,deltab},
{{c,c0,Style["c",15,barvac]},cmin,cmax,deltac},
{{d,d0,Style["d",15,barvad]},dmin,dmax,deltad},
Delimiter,
Item[Style["Zobrazit",15,barva,FontFamily->Times,Bold,Underlined],Alignment->Left],
{{zobrazitpredpisfce,True,Style["předpis funkce",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitupravenoufci,False,Style["upravený předpis",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitasymptoty,True,Style["asymptoty",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitinverznifci,False,Style["inverzní funkci",15,barvainverzni,FontFamily->Times]},{True,False},ControlType->Checkbox},
{{zobrazitdh,True,Style["D a H",15,barva,FontFamily->Times]},{True,False},ControlType->Checkbox},
Delimiter,
Dynamic[
Grid[{
{If[zobrazitpredpisfce,
Item[Style[predpisfunkce,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[zobrazitupravenoufci,
Item[Style[upravenypredpis,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[" ",1.5velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[zobrazitpredpisfce&&zobrazitinverznifci,
Item[Style[predpisinverznifunkce,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{Item[Style[" ",2velikostpisma,barva,FontFamily->Times],Alignment->Left]},
{If[(zobrazitdh&&zobrazitinverznifci==False&&(c≠0∨d≠0))∨(zobrazitdh&&zobrazitinverznifci&&(a≠0∨c≠0)),
Item[Style[defobor,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]},
{If[(zobrazitdh&&zobrazitinverznifci==False&&(c≠0∨d≠0))∨(zobrazitdh&&zobrazitinverznifci&&(a≠0∨c≠0)),
Item[Style[oborhodnot,velikostpisma,barva,FontFamily->Times],Alignment->Left],
""]}
}]
],
Delimiter,
Button[" Ulož obrázek ",{pocetulozeni=pocetulozeni+1,Export[StringInsert[StringJoin[cesta,jmenosouboru],ToString[pocetulozeni],-5],grafik]},ImageSize->{100,Automatic}],
ControlPlacement->Left,
FrameLabel->{Style["© Jaroslav Reichl, 2008",10,Black,FontFamily->Times],"",Style["Lineárně lomená funkce y =\!\(\*FractionBox[\(\(a . x\)\(\\ \)\(+\)\(\\ \)\(b\)\(\\ \)\), \(c . x\\  + \\ d\)]\)",25,Black,FontFamily->Times],""}];

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

LinLomenaFce