Príkazy
PolynomSolver spracuváva príkazy po riadkoch. Z riadku vždy zoberie prvú súvislú skupinu znakov a snaží sa ju interpretovať ako príkaz. V prípade neúspechu vráti chybu 1.
Všetky ďalšie znaky v riadku za príkazom sú argumenty, ktoré sa spracuvávajú ďalej v závislosti od príkazu. Vo všeobecnosti platí, že ak za príkazom nasleduje viac argumentov ako je požadované, tie nadbytočné sú ignorované. Taktiež nadbytočné medzery by nemali robiť problém.
exit
quit
bye
koniec
konec
Ukončí ihneď program. Program zdvorilo odzdraví a vypíše informáciu o úspešnom ukončení.
> koniec Bye. PolynomSolver ended successfully.
[nič]
\\ komentár
Tieto príkazy (prvý je prázdny príkaz) nevykonávajú nič. Akýkoľvek text za príkazom "\\" je odignorovaný a preto je vhodný na komentáre.
> \\ nasledujúci enter je v pohode > > Tento text vygeneruje chybu. ERR1: Nepoznam prikaz 'Tento'
< [názov súboru]
Program začne načítavať vstup zo zadaného súboru. Ak nie je zadaná celá adresa, súbor sa primárne hľadá v adresári, kde je program; prípadne ak je spustený cez Borland Pascal, tak v aktuálnom adresári. V prípade, že súbor neexistuje, program vygeneruje chybu 7.
Po prečítaní súboru program znovu začne čítať zo štandartného vstupu. To platí aj vtedy, keď je príkaz "<" vnorený v inom súbore.
Pokiaľ je príkaz bez argumentov, program začne čítať zo štandartného vstupu.
> < abcdef ERR7: Neviem najst subor abcdef > < vstup.txt
> [názov súboru]
Program začne vypisovať výstup do zadaného súboru. Narozdiel od štandartného vstupu však nevypisuje počiatočné ">" na začiatku riadku. Taktiež nevypisuje slovný popis chýb, vypíše iba označenie chyby. Ak je príkaz bez arumentov, program začne vypisovať na štandartný výstup.
Ak nie je zadaná celá adresa, súbor sa vytvorí v adresári, kde je program; prípadne ak je spustený cez Borland Pascal, tak v aktuálnom adresári.
> // nasledujúce príkazy vypíšu vstup z input.txt do output.txt > > output.txt > < input.txt
Práca s registrami
Program poskytuje pohodlný spôsob narábania s polynómami. V pamäti je vyhradených niekoľko pozícií na uloženie polynómov ozačených veľkými písmenami 'A', 'B', až 'J'. Tieto vyhradené miesta sa nazývajú registre a v ďalšom texte na nich odkazujem pomocou [reg].
Do registrov sa dajú uložiť polymómy pomocov priradzovacieho príkazu, ktorý má ako argumenty výraz skladajúci sa z polynómov; nižšie označovaných [poly]. Takýto polynóm sa dá zadať dvoma spôsobmi:
1) Polynóm môže byť zadaný ako register, t.j. veľké písmeno 'A' až 'J';
2) Alebo môže byť zadaný priamo vypísaním koeficientov. V tom prípade jeho zápis musí začínať ľavou zátvorkou '(' a končiť pravou ')'. Znaky medzitým sa snaží program interpretovať ako reálne čísla, na oddelenie desatinných čísel sa používa desatinná bodka. Po prečítaní považuje najpravejšie číslo za koeficient pri absolútnom člene a postupne doľava rastie stupeň x. Napríklad zápis (1, 2, 3) interpretuje ako x2+2x+3. Ďalšie príklady:
> A = (3, 4) A = 3.00x + 4.00 > A = (3.4) A = 3.40 > A = (12df4-6s 7) A = 12.00x3 + 4.00x2 - 6.00x + 7.00 > A = 4 ERR3: Nespravne zadany polynom.
Poznámka: Neuvedené koeficienty vyšších rádov sú považované za nulové. To znamená, že zápis "A = ()" je regulárny a neznamená nič iné ako nulový polynóm.
[reg]
[reg] : [číslo]
Vypíše polynóm v registri [reg]. Číslo za ":" určuje počet desatinných miest, môže byť v rozsahu 0 až 99. Pokiaľ argument s ":" je vynechaný, vypisuje sa na 2 desatinné miesta. Ak je argument väčší ako samotná presnosť, vypíše sa na menej miest.
> A 1.23x2 + 0.14x + 100.90 > A : 4 1.2300x2 + 0.1400x + 100.9000
[reg] ([reálne číslo])
Vypíše hodnotu polynómu v registri [reg] v zadanom bode.
> A 1.00x2 + 0.00x + 1.00 > A (2) A(2.00000000000) = 5.00000000000
[reg] =
[reg] :=
Priradí do registra [reg] výraz na pravej strane. Ten môže byť buď tvaru [poly] alebo výrazy popísané ďalej. Pritom je možné vo výraze používať register, do ktorého sa zapisuje.
> A = (1, 2, 3) A = 1.00x2 + 2.00x + 3.00 > B := A * (2) B = 2.00x2 + 4.00x + 6.00 > B = A + B B = 3.00x2 + 6.00x + 9.00
[poly] + [poly]
Súčet polynómov.
> A = (1, 2, 3) + (4, 5) A = 1.00x2 + 6.00x + 8.00
[poly] - [poly]
Rozdiel polynómov.
> A = (1, 2, 3) - (4, 5) A = 1.00x2 - 2.00x - 2.00
[poly] * [poly]
Súčin polynómov. Vyhlási chybu 5 pokiaľ je výsledný polynóm príliš veľký.
> A = (1, 3) * (1, -1) A = 1.00x2 + 2.00x - 3.00
[poly] / [poly]
Podiel polynómov. Pri delení nulovým polynómom "()" vyhlási chybu 6.
> A = (1, 2, 3) / (1, -1) A = 1.00x + 3.00
[poly] % [poly]
Zvyšok po delení polynómov. Pri delení nulovým polynómom "()" vyhlási chybu 6.
> A = (1, 2, 3) % (1, -1) A = 6.00
[poly] '
Derivácia polynómu.
> A = (3, 2, 4)' A = 6.00x + 2.00
Riešenie polynómov
Hlavná funkcia PolynomSolveru je riešenie polynómov, čize hľadanie ich koreňov. Na toto má program dva príkazy: root a solve. Oba tieto príkazy umožňujú zvoliť presnosť výpočtu a metódu, ktorou sa bude počítať.
Presnosť sa zadáva ako počet desatinných miest. Napr. ak je presnosť 2, znamená to, že hodnota v nájdenom bode sa nebude od nuly líšiť o viac ako 10-2. (Metóda polením je ešte silnejšia.) Presnosť sa dá zadať ako desatinné alebo aj ako záporné číslo.
Metódy hľadania koreňa umožňujú nájsť koreň na zadanom polootvorenom intervale (ľavý bod doň patrí a pravý nie). Tento interval musí byť na jednom konci kladný a na druhom záporný (resp. na ľavom 0), pretože potom je zaručené, že niekde medzi je koreň.
Metódy fungujú iteračne - to znamená, že na začiatku odhadnú výsledok a potom ho postupne spresňujú. V závislosti od spôsobu spresňovania máme 3 metódy:
-b: Metóda polenia intervalu
Táto metóda sa pozrie na hodnotu v strede intervalu a na základe jej kladnosti/zápornosti určí, v ktorej polovici intervalu sa nachádza koreň. Takto interval zmenšuje, až kým nedosiahne požadovanú presnosť. Navyše garantuje, že nájdený bod sa od skutočného koreňa nebude líšiť o viac ako zadanú presnosť. Priemerne je to najpomalšia z metód.
-s: Sečnicová metóda
Táto metóda je podobná metóde polením, ale na rozdiel od nej nevyberá stred intervalu, ale taký bod, kde by bol koreň, ak by bol zadaný polynóm lineárna funkcia zachovávajúca hodnoty na krajoch intervalu. Priemerne je to rýchlejšia metóda ako polenie intervalu.
-n: Newtonova metóda
Táto metóda na rozdiel od predošlých metód nezmenšuje interval. Na začiatku si vezme bod - stred intervalu. Zráta v ňom dotyčnicu a bod, v ktorom pretne x-ovú os, vezme ako ďalší. Takto pokračuje až do požadovanej presnosti. Je to najrýchlejšia z ponúkaných metód, ale v patologických prípadoch sa môže od skutočného koreňa vzďaľovať. Preto v prípade, že bod nevyjde vnútri intervalu, vypíše varovanie a spustí sečnicovú metódu.
root [poly] ([číslo], [číslo]) {-b|-s|-n} {[číslo]}
koren [poly] ([číslo], [číslo]) {-b|-s|-n} {[číslo]}
Nájde koreň polynómu [poly] v zadanom polootvorenom intervale (ľavý bod doň patrí, pravý nie). Interval musí byť zadaný ako dve reálne čísla ohraničené zátvorkami, pričom prvé číslo musí byť menšierovné druhéhu. Navyše polynóm musí byť na jednom konci intervalu kladný a na druhom záporný (alebo na ľavom kraji 0), ináč sa vygeneruje chyba 9.
Príkaz má dva nepovinné parametre. Prvý určuje metódu, ktorou sa bude koreň hľadať a druhý presnosť hľadania. Ak nie je niektorý z nich uvedený, použije sa Newtonova metóda resp. presnosť na 10 desatinných miest. Viac informácii vyššie.
> A = (1, 0, -2) A = 1.00x2 + 0.00x - 2.00 > > root A (0, 3) Pouzivam Newtonovu metodu. x = 1.41421356240 A(x) = 0.00000000001 > > root A (0, 3) -b 2 Pouzivam metodu polenia intervalov. x = 1.415 A(x) = 0.00233554840
solve [poly] {-b|-s|-n} {[číslo]}
vyries [poly] {-b|-s|-n} {[číslo]}
Nájde korene polynómu [poly] na celom definičnom obore.
Príkaz má dva nepovinné parametre. Prvý určuje metódu, ktorou sa bude koreň hľadať a druhý presnosť hľadania. Ak nie je niektorý z nich uvedený, použije sa Newtonova metóda resp. presnosť na 10 desatinných miest. V prípade, že stupeň polynómu je menší než 3, korene sa vypočítajú vzorcom. Viac informácii vyššie.
> A = (-1 3 -2 0) A = -1.00x3 + 3.00x2 - 2.00x + 0.00 > > solve A Pouzivam Newtonovu metodu. Pocet najdenych korenov: 3 x_1 = -0.00000000000 x_2 = 1.00000000000 x_3 = 2.00000000000 > > solve (1 -2 -2 4) -b 2 Pouzivam metodu polenia intervalov. Pocet najdenych korenov: 3 x_1 = -1.41358319220 x_2 = 1.41194304230 x_3 = 2.00163875120 > > solve () Pouzivam Newtonovu metodu. Polynom je nulovy - ma nekonecno korenov.