Tomáš Kalvoda, KAM FIT ČVUT, 2016, 2017
Jedním z ústředních témat Lineární algebry je řešení soustav lineárních rovnic s více neznámými. Jedná se o dalekosáhlé zobecnění jedné lineární rovnice o jedné neznámé, tedy rovnice kde jsou pevně zvolené parametry a je hledaná neznámá. Parametry i neznámá mohou být komplexní, reálné, nebo obecně prvky pevně tělesa zvoleného.
Konkrétní hodnotu , která splňuje výše uvedenou rovnici, nazýváme jejím řešením. Naším cílem typicky je určit množinu všech řešení této rovnice.
Ačkoliv jedna rovnice o jedné neznámé vypadá až směšně jednoduše, lze už na jejím příkladě pozorovat všechny kvalitativně různé případy, které se vyskytují i v obecném případě. Rozeberme si její řešení podrobně (pro jednoduchost nad ):
Poznámka: Slovo "lineární" pro nás nyní znamená, že proměnná v rovnici vystupuje v první mocnině pouze násobená konstantou. Přesně bude "linearita" definována později v semestru.
Výše uvedenou rovnici lze jednoduše geometricky interpretovat (alespoň v reálném oboru): úloha odpovídá hledání bodu () kde přímka protne přímku . Tři kvalitativně rozdílné situace si graficky předvedeme níže.
# změna fontu v grafech
import matplotlib.pyplot as plt
plt.rc('font', family='DejaVu Sans')
var('x')
p1 = plot(x/2, (x, 0, 12),
figsize=4, gridlines=true,
color='green', thickness=2,
legend_label='$y=ax$',
title=u'Právě jedno řešení'
)
p2 = plot(3, (x, 0, 12),
color='blue', thickness=2,
legend_label='$y=3$'
)
p1 + p2 + point([6,0], color='red', size=40)
p1 = plot(0, (x, 0, 12),
figsize=4, gridlines=true,
color='green', thickness=2,
legend_label='$y=ax$, pro $a=0$',
ymin=-0.5, ymax=3.5,
title=u'Žádné řešení'
)
p2 = plot(3, (x, 0, 12),
color='blue', thickness=2,
legend_label='$y=3$'
)
p1 + p2
p1 = plot(0, (x, 0, 12),
figsize=4, gridlines=true,
color='green', thickness=4, alpha=.5,
legend_label='$y=ax$, pro $a=0$',
ymin=-0.5, ymax=0.5,
title=u'Nekonečně mnoho řešení'
)
p2 = plot(0, (x, 0, 12),
color='blue', thickness=2, alpha=1,
legend_label='$y=0$'
)
p1 + p2
Rozšiřme předchozí úlohu přidáním jedné další neznámé. Máme tedy jednu lineární rovnici o dvou neznámých . Parametry jsou zvoleny pevně. Rozeberme opět možné situace.
Všimněte si, že v bodech 1., 2. a 4. měla rovnice sice nekonečně mnoho řešení, ale mezi těmito body je kvalitativní rozdíl. V případě 4. není žádný vztah mezi a , obě jejich hodnoty můžeme volit zcela libovolně a vždy budou řešením dané rovnice. V případě 1. a 2. vždy můžeme jednu neznámou zvolit libovolně a druhou dopočítat (nemáme u ní už možnost volby). V budoucnu uvidíme, jak lze toto pozorování vyjádřit pomocí dimenze množiny řešení (podprostoru či variety).
Dále poznamenejme, že v případě jedné lineární rovnice o dvou neznámých nikdy nenastává případ v němž by rovnice měla právě jedno řešení.
Vypustíme-li triviální případy (žádné řešení (3.) a triviální (4.)), pak lze řešení rovnice interpretovat jako body o souřadnicích v rovině . Tuto situaci znázorňujeme na obrázku níže.
plot((x+2)/2, (x, 0, 12),
figsize=4, gridlines=true,
color='blue', thickness=4,
title=u'Všechna řešení rovnice $2y-x=2$'
)
Řešení soustavy dvou rovnic o dvouch neznámých \begin{align*} a_1 x+b_1 y &= c_1, \\ a_2 x+b_2 y &= c_2, \end{align*} lze díky pozorování výše interpretovat jako hledání průniku dvou přímek. Skutečně, aby bylo řešením této soustavy, musí splňovat obě rovnice současně. To znamená, že musí ležet na obouch přímkách. Tedy být v jejich průniku.
Nyní bychom se mohli opět rozebrat různé kvalitativně odlišné situace, které mohou nastat v závislosti na hodnotách parametrů . Zde se této otázce ale věnovat nebudeme. Laskavý čtenář tento rozbor jistě sám provede.
Ukažme si jak řešit tyto lineární rovnice v SageMath. Toho můžeme využít například ke kontrolování výpočtů.
Nejprve deklarujme symbolické proměnné s kterými budeme pracovat. K tomu slouží funkce var
.
var('x,y,z,a,b,c')
(x, y, z, a, b, c)
Nyní máme pomocí těchto symbolických proměnných můžeme vytvářet všemožné symbolické výrazy.
show(sin(x) + ln(y^a))
type(x)
<class 'sage.symbolic.expression.Expression'>
K řešení rovnic (nejen lineárních) slouží příkaz solve
. Jeho první argument je rovnice, nebo soustava rovnic zadaná jako list
nebo tuple
a dalšími argumenty jsou proměnné, vůči nimž hledáme řešení.
Například jednu lineární rovnici s jednou neznámou bychom řešili takto:
solve(a*x == b, x)
[x == b/a]
Pozor! Zde vidíme, že SageMath není všemocný. V tomto případě nedokáže odhalit nebezpečný případ, kdy . Bohužel toto je slabost CAS obecně. Například Mathematica se chová naprosto stejně. Jako odpověď na Solve[a*x == b, x]
dostanete {{x -> b/a }}
. Což je špatně.
Při řešení parametrických úloh je tedy nutné být velmi obezřetný (obezřetná). Pokud se v úloze vyskytují pouze číselné koeficienty, tak takovéto nebezpečí nehrozí (ale můžeme narazit na nebezpečí jiná, jak uvidíme v dalších cvičeních).
Příklad: Požádejme Sage o řešení soustavy
solve([y + 2*x == 3, x - 2*y == 1], x, y)
[[x == (7/5), y == (1/5)]]
Dostáváme právě jedno řešení.
Příklad: Vyzkoušejme nyní, jak si Sage poradí se soustavou, která nemá řešení. Například,
solve([x + y == 1, 2*x + 2*y == 1], x, y)
[]
Příklad: Nejzajímavějším případem bude situace s nekonečně mnoha řešeními. Například soustava
solve([x - y == 1, 2*x - 2*y == 2], x, y)
[[x == r1 + 1, y == r1]]
Na předchozích příkladech je patrné, že zapisovat soustavy linárních rovnic pomocí rovnic samotných je značně redundantní. Na příštím cvičení si ukážeme, jak si život zjednodušit maticovou notací.