Řešení rovnic s Mathematica

Radim Kusák, Ústav teoretické fyziky, MFF UK

radim.kusak@gmail.com

Rovnice a nerovnice jak na ně

Příkazy: Solve, Reduce, Eliminate,ConditionalExpression, ToRules, Reduce, FindRoot, RSolve
Další příkazy: SolveAlways, LinearSolve, MaxExtraConditions, FindInstance, Resolve

reseni=Solve[(x^2)+1==3,x]

Solve[(x/x)==1,x]

Reduce[x^2-7y^2==1&&x>0&&y>0,{x,y},Reals]

Reduce[Exists[{x,y},x^2+a y^2≤1 &&x-y≥2],a]

Jednoduché rovnice

Rovnice pomocí příkazu Solve

Pro “běžné” rovnice si vystačíme příkazem Solve

Solve[x+1==3,x]

Solve[(x^2)-2x-3==0,x]

Solve[(x^2)==I,x]//ComplexExpand

Solve[(x^2)-2x+3==0,x]

Solve[(x^2)-2x+3I==0,x]

Diskriminant kvadratické funkce

Discriminant[(x^2)-2x-3,x]

Výsledek jako přepisovací pravidlo

x/.{{x->-1},{x->3}}

Solve[(x^2)-2x-3==0,x]
x/.%
{x,(x^2)-2x-3}/.%%

Rovnice pomocí Reduce

Reduce[x+1==3,x]

Reduce[(x^2)-2x-3==0,x]

Reduce[(x^2)-2x+3==0,x]

Reduce[(x^2)-2x+3==0,x]
List[ToRules[%]]
{ToRules[%%]}

ToRules[x==1||x==2]
{ToRules[x==1||x==2]}

Není to jen o číslech

Solve[x+a==b,x]

Reduce[x+a==b,x]

Solve[a*(x^2)+b*x+c==0,x]

Reduce[a*(x^2)+b*x+c==0,x]

Poznámka: Solve vrací řešení, které platí “skoro všude”

Řešení rovnic a příkaz Manipulate

Manipulate[Reduce[a*(x^2)+b*x+c==0,x],{{a,1},-3,3,1},{{b,-2},-3,3,1},{{c,-3},-3,3,1}]

Manipulate[Grid[{{Reduce[a*(x^2)+b*x+c==0,x]},{Reduce[a*(x^2)+b*x+c==0,x]//N}}],{{a,1},-3,3,1},{{b,-2},-3,3,1},{{c,-3},-3,3,1}]

Manipulate[
Grid[
{
{"a = "<>ToString[a],"b = "<>ToString[b],"b = "<>ToString[b]},
{
Reduce[a*(x^2)+b*x+c==0,x],SpanFromLeft
}
}
],
{{a,1},-3,3,1},{{b,-2},-3,3,1},{{c,-3},-3,3,1}]

“Zvláštní” rovnice

Solve[(x/x)==1,x]

Reduce[(x/x)==1,x]

Solve[(x/(2x))==1,x]

Reduce[(x/(2x))==1,x]

Soustava rovnic

Solve[{x+y==1,x-y==2},{x,y}]

Solve[x+y==1&&x-y==2,{x,y}]

Reduce[{x+y==1,x-y==2},{x,y}]

Reduce[x+y==1&&x-y==2,{x,y}]

ContourPlot[{x+y==1,x-y==2},{x,-3,3},{y,-3,3}]

Reduce[{x+y+z==1,x-y+z==2,x-z==3},{x,y,z}]

ContourPlot3D[{x+y+z==1,x-y+z==2,x-z==3},{x,-10,10},{y,-10,10},{z,-10,10},ContourStyle->{Red,Green,Blue}]

Reduce[{x+y+z==1,x-y+z==2,x+z==3},{x,y,z}]

ContourPlot3D[{x+y+z==1,x-y+z==2,x+z==3},{x,-10,10},{y,-10,10},{z,-10,10},ContourStyle->{Red,Green,Blue}]

Příkaz Eliminate

Eliminate[{x+y+z==1,x-y+z==2,x-z==3},z]
Eliminate[{x+y+z==1,x-y+z==2,x-z==3},{y,z}]
Eliminate[{x+y+z==1,x-y+z==2,x-z==3},{x,y,z}]

Pro složitější rovnice se hodí spíše Eliminate,

Nerovnice

Příkazy: Reduce

Reduce[x+1<5,x]

Reduce[{x+y<1,x-y>3},{x,y}]

Reduce[{x+y<1,x-y>3},{x,y}]//FullSimplify

RegionPlot[{x+y<1,x-y>3},{x,-5,5},{y,-5,5}]

RegionPlot[x+y<1&&x-y>3,{x,-5,5},{y,-5,5},PlotPoints->100]

Rovnice podrobněji

Mathematica počítá v komplexních číslech.

Nejen lineární rovnice

Solve[Log[x]==2,x]

Reduce[Log[x]==2,x]

Solve a inverzní funkce

Solve[Sin[x]==(1/2),x]

Solve[(E^x)==2,x]

Solve[Sin[x]==(1/2),x,Method->Reduce]

Solve[(E^x)==2,x,Method->Reduce]

Reduce[Sin[x]==(1/2),x]/.C[1]->k

Reduce[(E^x)==2,x]

Symbolicky nebo numericky

Solve

Solve[Log[x]==2.,x]

Solve[Log[x]==2.0,x]

NSolve[Log[x]==2.5,x]

NSolve[Exp[x]==2.5,x]

Reduce

Reduce[Exp[x]==2.5,x]

Reduce[Exp[x]==(25/10),x]
N[%]

Poznámka: Reduce pracuje s desetiným číslem jako výrazem, spočte řešení symbolicky a poté vyčíslí

Řešení  v číselných oborech a s podmínkami

V číslených oborech

Pokud specifikuji, že chci počítat v reálných číslech, všechny parametry a proměnné jsou automaticky reálné.

Solve[(x^3)-(x^2)+4x-4==0,x]

Solve[(x^3)-(x^2)+4x-4==0,x,Reals]

Solve[(E^x)==2,x]

Solve[(E^x)==2,x,Reals]

Každá proměnná se svým vlastním oborem

Solve[x^2+y^2==7 &&Element[x,Integers]&&Element[y,Reals],{x,y}]

S podmínkami

Pokud zadám nějakou podmínku ve formě nerovnosti, automaticky se předpokládá, že proměnné v ní obsažené jsou reálné

NSolve[{2(x^2)-y==1,x+(y^2)==2},{x,y}]//TableForm

NSolve[{2(x^2)-y==1,x+(y^2)==2,x>0},{x,y}]//TableForm

NSolve[{2(x^2)-y==1,x+(y^2)==2,Re[x]>0},{x,y}]//TableForm

Některé nastavení příkazu Solve a Reduce a další funkce k řešení rovnic

Rovnice mod c

Solve[x^2+3y^2==4&&3x^3-4y^2+x y==1,{x,y},Modulus->5]

Rovnice s Piecewise funkcí

Solve[Piecewise[{{x^2+x-1,x<0},{x,x>0}}]+x==1,x]

Plot[{Piecewise[{{x^2+x-1,x<0},{x,x>0}}]+x,1},{x,-3,3}]

Rekurentní rovnice

RSolve[{a[n+1]-2a[n]==1},a[n],n]

Mezi symbolikou a numerikou

Funkce Root

Solve[x^5+2x+1==0,x]
N[%]

ToRadicals[Root[#^3+#+11&,1]+Root[#^5-2&,3]]

Trocha numeriky

Solve[Tan[x]==x,x]

Solve[Tan[x]==x,x,Reals]

NSolve[Tan[x]==x,x]

Reduce[Tan[x]==x,x]

FindInstance[Tan[x]==x,x]

Hledání kořenů grafem

Get Coordinates

Plot[Tan[x]-x,{x,0,20}]

Funkce Find Root

FindRoot[Tan[x]==x,{x,5}]

data=Table[FindRoot[Tan[x]==x,{x,i}],{i,0,20}]
Plot[Tan[x]-x,{x,0,20},Epilog->{PointSize[Medium],Red,Point[{x,0}/.data]}]

FindRoot a náhodná čísla

Random[Real,{0,20}]

SeedRandom[14431];
data2=Table[FindRoot[Tan[x]==x,{x,Random[Real,{0,20}]}],{i,0,20}]//Sort
Plot[Tan[x]-x,{x,0,20},Epilog->{PointSize[Medium],Red,Point[{x,0}/.data2]}]
SeedRandom[14431];
data3=Table[{Random[Real,{0,20}],0},{i,0,20}]
Plot[Tan[x]-x,{x,0,20},Epilog->{PointSize[Medium],Green,Point[data3]}]

Více kořenů

N[x/.(Table[FindRoot[Tan[x]==x,{x,i},WorkingPrecision->25,MaxIterations->10000],{i,0,200}])//Chop,10]//Sort//DeleteDuplicates//TableForm

Sledování výpočtů

Reap[FindRoot[Tan[x]==x,{x,10},StepMonitor:>Sow[x]]]

Reap[FindRoot[Tan[x]==x,{x,10},EvaluationMonitor:>Sow[x]]]

Hledání kořenů grafem II (převzato od dr. A. Slavíka)

Plot[Sin[x],{x,0,4Pi},Mesh->All,MeshStyle->PointSize[0.015],PlotStyle->{Thick,Red}]

Aplikace: Nalezení všech nulových bodů funkce v zadaném intervalu

FindAllRoots[f_,{x_,a_,b_}]:=Module[{xValues,seedPositions,roots},xValues=Sort[Reap[Plot[f,{x,a-(b-a)/100,b+(b-a)/100},EvaluationMonitor:>Sow[x]]][[2,1]]];
seedPositions=Select[Range[Length[xValues]-1],(Sign[f/.x->xValues[[#]]]Sign[f/.x->xValues[[#+1]]]<0)&];
roots=Map[x/.FindRoot[f,{x,xValues[[#]]}] & ,seedPositions];
Select[Union[roots],a≤#≤b &]]

solns=FindAllRoots[(x/5)  Cos[x]+Sin[(x^3)],{x,-3,3}]

Plot[(x/5)  Cos[x]+Sin[(x^3)],{x, -3, 3}, Epilog->{PointSize[Large],Map[Point[{#,0}] &,solns]}]

solns=FindAllRoots[Sin[(x^2)]-(E^((Cos[x])/2))+1,{x,-10,0}]

Plot[Sin[(x^2)]-(E^((Cos[x])/2))+1,{x,-10,0},Epilog->{PointSize[Large],Map[Point[{#,0}] &,solns]}]

FindAllRoots[x^2,{x,-10,10}]

Clear[solns,FindAllRoots]

Perlička na závěr

Find the vertical asymptotes of (1/((y^2)-2)) by directly using the definition of limit:

Reduce[ForAll[ϵ, ϵ > 0, Exists[δ, δ > 0, 
    ForAll[y, Element[x | y, Reals] && 0 < Abs[y - x] < δ, 
     Abs[1/((y^2) - 2)] > ϵ]]], x]

Odkazy

http://utf.mff.cuni.cz/~kusak/mathematica.php
http : // www.karlin.mff.cuni.cz/~slavik/info.html

Bonus

Řešením je interval

Reduce[(Sqrt[x+8-6*(Sqrt[x-1])])+(Sqrt[x+3-4*(Sqrt[x-1])])==1,x,Reals]

Plot[{(Sqrt[x+8-6*(Sqrt[x-1])])+(Sqrt[x+3-4*(Sqrt[x-1])]),1},{x,0,15},PlotStyle->{{Thick,Opacity[0.5]}},AxesOrigin->{0,0}]