Generování: výpočet goniometrických rovnic

Tento notebook umožňuje vygenerovat úlohy, které slouží na procvičení řešení goniometrických rovnic ve tvaru a funce(b x + c) = d.

Na začátku je nutné zvolit:
	typ goniometrické rovnice (sinus, kosinus, tangens, kotangens nebo jejich kombinace);
	typ argumentu - ve tvaru x, b x, x + c nebo b x + c;
	symbol pro neznámou rovnice - x nebo náhodně vygenerované malé písmeno anglické abecedy.
Opakování čísel v množinách, ze kterých se vybírají koeficienty, zvyšuje pravděpodobnost výběru daného čísla.

Notebook zobrazí i kořeny vygenerovaných rovnic, ale ve většině případů pouze jeden typ kořene (navíc bez periodicity). Důvod nalezení pouze jednoho typu kořene spočívá v tom, že funkce Solve, která je pro hledání kořenů rovnic použita, pracuje s inverzními funkcemi. Aby mohla tato funkce rovnice vyřešit, je nutné periodické funkce omezit na určitý interval.

Počet úloh, které se mají generovat, je uložen v proměnné pocetuloh. Úlohy se vypíší do tabulky, v jejímž řádku bude pocetulohnaradek úloh. Počet opakování právě popsaného bloku je uveden v proměnné pocetopakovani. Za tabulku s výpisem úloh se vypíše tabulka s výpisem řešení; počet řešení na jednom řádku je uložen v proměnné pocetreseninaradek.

© Jaroslav Reichl, 2012

pocetuloh=6;
pocetopakovani=4;

pocetulohnaradek=3;
pocetreseninaradek=8;

pravestranysincos={0,(1/2),(1/2),(1/2),((Sqrt[2])/2),((Sqrt[2])/2),((Sqrt[2])/2),((Sqrt[3])/2),((Sqrt[3])/2),((Sqrt[3])/2),1};
pravestranytgcotg={0,((Sqrt[3])/3),((Sqrt[3])/3),((Sqrt[3])/3),1,1,(Sqrt[3]),(Sqrt[3]),(Sqrt[3])};
seznamkoeficienturce={1,2,2,3,3,4,4,(Sqrt[2]),(Sqrt[2]),(Sqrt[3]),(Sqrt[3]),((Sqrt[2])/2),((Sqrt[2])/2),((Sqrt[3])/2),((Sqrt[3])/2),(Sqrt[5]),((Sqrt[5])/2),(Sqrt[6]),((Sqrt[6])/2)};
seznamkoeficientuargumentu={(1/5),(1/4),(1/3),(2/5),(1/2),(3/5),(2/3),(3/4),(4/5),1,2,3,4,5,6};
seznamabsclenuargumentu={(π/6),(π/5),(π/4),(π/3),((2π)/5),(π/2),((3π)/5),((2π)/3),((3π)/4),((4π)/5),((5π)/6),π,2π};

barva=Black;
velikostpisma=17;
okzadani=False;

reseni=Table[Null,{i,1,pocetopakovani,1},{j,1,pocetuloh,1},{k,1,2,1}];

seznammoznosti={"sin(x)"->1,"cos(x)"->2,"sin(x) a cos(x)"->3,"tg(x)"->4,"cotg(x)"->5,"tg(x) a cotg(x)"->6,"vše"->7};
moznosti=ChoiceDialog[StringJoin["Vyberte typ goniometrické rovnice:"],seznammoznosti];
typargumenturovnice=ChoiceDialog[StringJoin["Vyberte typ argumenturovnice:"],{"pouze proměnná"->1,"koeficient * proměnná"->2,"proměnná + absolutní člen"->3,"obecný"->4}];
typnezname=ChoiceDialog[StringJoin["Vyberte symbol pro neznámou:"],{" x "->1," náhodný "->2}];

(*Zadání úloh*)
For[k=1,k≤pocetopakovani,k++,
zadani=Table[Null,{i,0,pocetuloh+pocetulohnaradek,1}];
Table[zadani[[i]]="",{i,0,pocetuloh+pocetulohnaradek,1}];
zadani[[0]]=StringJoin[ToString[Style[ToString[k],barva,1.25velikostpisma,FontFamily->Times,Bold,Underlined],StandardForm],ToString[Style[". zadani uloh",barva,1.25velikostpisma,FontFamily->Times,Bold,Underlined],StandardForm]];
Table[{
vypiscisla=StringJoin[ToString[Style[ToString[i],barva,velikostpisma,FontFamily->Times,Bold],StandardForm],ToString[Style[".  ",barva,velikostpisma,FontFamily->Times,Bold],StandardForm]],
If[moznosti==1,
{funkce="sin",
fcevypocet[x_]:=Sin[x]},
If[moznosti==2,
{funkce="cos",
fcevypocet[x_]:=Cos[x]},
If[moznosti==3,
If[RandomChoice[{1,2}]==1,
{funkce="sin",
fcevypocet[x_]:=Sin[x]},
{funkce="cos",
fcevypocet[x_]:=Cos[x]}],
If[moznosti==4,
{funkce="tg",
fcevypocet[x_]:=Tan[x]},
If[moznosti==5,
{funkce="cotg",
fcevypocet[x_]:=Cot[x]},
If[moznosti==6,
If[RandomChoice[{1,2}]==1,
{funkce="tg",
fcevypocet[x_]:=Tan[x]},
{funkce="cotg",
fcevypocet[x_]:=Cot[x]}],
{cislofce=RandomChoice[{1,2,3,4}],
If[cislofce==1,
{funkce="sin",
fcevypocet[x_]:=Sin[x]},
If[cislofce==2,
{funkce="cos",
fcevypocet[x_]:=Cos[x]},
If[cislofce==2,
{funkce="tg",
fcevypocet[x_]:=Tan[x]},
{funkce="cotg",
fcevypocet[x_]:=Cot[x]}]]]}
]]]]]],
If[funkce=="sin"∨funkce=="cos",
pravastrana=RandomChoice[{-1,1}] RandomChoice[pravestranysincos],
pravastrana=RandomChoice[{-1,1}] RandomChoice[pravestranytgcotg]],
koeficientrce=RandomChoice[{-1,1}] RandomChoice[seznamkoeficienturce],
If[typargumenturovnice==1,
{koeficientargumentu=1,
absclenargumentu=0,
levazavorka=" ",
pravazavorka=""},
If[typargumenturovnice==2,
{koeficientargumentu=RandomChoice[{-1,1}] RandomChoice[seznamkoeficientuargumentu],
absclenargumentu=0,
levazavorka="(",
pravazavorka=")"},
If[typargumenturovnice==3,
{koeficientargumentu=1,
absclenargumentu=RandomChoice[{-1,1}] RandomChoice[seznamabsclenuargumentu],
levazavorka="(",
pravazavorka=")"},
{koeficientargumentu=RandomChoice[{-1,1}] RandomChoice[seznamkoeficientuargumentu],
absclenargumentu=RandomChoice[{-1,1}] RandomChoice[seznamabsclenuargumentu],
levazavorka="(",
pravazavorka=")"}]]],
If[Abs[koeficientrce]==1,
If[koeficientrce==1,
koeficientrcevypis="",
koeficientrcevypis="-"],
koeficientrcevypis=ToString[koeficientrce,TraditionalForm]],
If[Abs[koeficientargumentu]==1,
If[koeficientargumentu==1,
koeficientargumentuvypis="",
koeficientargumentuvypis="-"],
koeficientargumentuvypis=ToString[koeficientargumentu,TraditionalForm]],
If[absclenargumentu==0,
absclenargumentuvypis="",
absclenargumentuvypis=ToString[Abs[absclenargumentu],TraditionalForm]],
If[typargumenturovnice==1∨typargumenturovnice==2,
znamenko="",
If[absclenargumentu≥0,
znamenko=" + ",
znamenko=" - "]],
If[typnezname==1,
neznama="x",
neznama=FromCharacterCode[RandomInteger[{97,122}]]],
zadani[[i]]=StringJoin[vypiscisla," ",ToString[Style[StringJoin[koeficientrcevypis,funkce,levazavorka,koeficientargumentuvypis,ToString[Style[neznama,Italic],TraditionalForm],znamenko,absclenargumentuvypis,pravazavorka," = ",ToString[koeficientrce pravastrana,TraditionalForm]],barva,velikostpisma,FontFamily->Times],StandardForm]],
pomreseni=Quiet[Solve[fcevypocet[koeficientargumentu x+absclenargumentu]==pravastrana,x]],
reseni[[k,i,1]]=x/.pomreseni[[1]],
If[Length[pomreseni]==2,
reseni[[k,i,2]]=x/.pomreseni[[2]],
reseni[[k,i,2]]=""]},
{i,1,pocetuloh,1}];
If[Mod[pocetuloh,pocetulohnaradek]≠0,
korekceradku=1,
korekceradku=0];
tabulkazadani=TableForm[
Table[
Table[zadani[[(j-1)pocetulohnaradek+i]],{i,1,pocetulohnaradek,1}],{j,1,IntegerPart[(pocetuloh/pocetulohnaradek)]+korekceradku,1}],
TableSpacing->{1,3}];
Print[zadani[[0]]];
Print[tabulkazadani];
Print[StringJoin@@Table["_",{90}]]]

(*Řešení úloh*)
For[k=1,k≤pocetopakovani,k++,
vypisreseni=Table[Null,{i,0,pocetuloh+pocetreseninaradek,1}];
Table[vypisreseni[[i]]="",{i,0,pocetuloh+pocetreseninaradek,1}];
vypisreseni[[0]]=StringJoin[ToString[Style[ToString[k],barva,1.25velikostpisma,FontFamily->Times,Bold,Underlined],StandardForm],ToString[Style[". reseni uloh",barva,1.25velikostpisma,FontFamily->Times,Bold,Underlined],StandardForm]];
Table[{
vypiscisla=StringJoin[ToString[Style[ToString[i],barva,velikostpisma,FontFamily->Times,Bold],StandardForm],ToString[Style[".  ",barva,velikostpisma,FontFamily->Times,Bold],StandardForm]],
vypisreseni[[i]]=StringJoin[vypiscisla," ",ToString[Style[StringJoin[ToString[reseni[[k,i,1]],TraditionalForm],"  ",ToString[reseni[[k,i,2]],TraditionalForm]],barva,velikostpisma,FontFamily->Times],StandardForm]]},
{i,1,pocetuloh,1}];
If[Mod[pocetuloh,pocetreseninaradek]≠0,
korekceradku=1,
korekceradku=0];
tabulkareseni=TableForm[
Table[
Table[vypisreseni[[(j-1)pocetreseninaradek+i]],{i,1,pocetreseninaradek,1}],{j,1,IntegerPart[(pocetuloh/pocetreseninaradek)]+korekceradku,1}],
TableSpacing->{1,3}];
Print[vypisreseni[[0]]];
Print[tabulkareseni];
Print[StringJoin@@Table["_",{90}]]]