Implementace numerických metod v jazyce C a Python



Podobné dokumenty
Šifrování/Dešifrování s použitím hesla

Semestrální práce KIV/PC Řešení kolizí frekvencí sítě vysílačů Zdeněk Bečvář A14B0466P 10. ledna 2016

Pokud nebude na příkazové řádce uveden právě jeden argument, vypište chybové hlášení a stručný

Matematika v programovacích

Laboratorní zdroj - 6. část

IUJCE 07/08 Přednáška č. 6

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

Další aspekty architektur CISC a RISC Aktuálnost obsahu registru

Technické prostředky počítačové techniky

Břetislav Fajmon, UMAT FEKT, VUT Brno. Poznámka 1.1. A) první část hodiny (cca 50 minut): představení všech tří metod při řešení jednoho příkladu.

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Sběrnicová struktura PC Procesory PC funkce, vlastnosti Interní počítačové paměti PC

Pojem architektura je převzat z jiného oboru lidské činnosti, než počítače.

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

LED_007.c Strana: 1/5 C:\Michal\AVR\Výukové programy\archiv\ Poslední změna: :01:48

Seznámení se se zvolenou pokročilou iterativní metodou na problému batohu

Distanční opora předmětu: Programování v jazyce C Tématický blok č. 8: Dynamické datové struktury, ladění programů Autor: RNDr. Jan Lánský, Ph.D.

Řešení problému batohu dynamickým programováním, metodou větví a hranic a aproximativním algoritmem

Linux (nejen) v Low End routerech

Paralelní LU rozklad

Klíčové pojmy: Cyklus, řídící proměnná, inicializace, test podmínky, přerušení cyklu, vnořování cyklů.

Komplexní číslo. Klíčové pojmy: Komplexní číslo, reálná část, imaginární část, algebraické počty s komplexním číslem

Elektronická dokumentace - LATEX. Maticové operace

Semestrální projekt. Předmět: Programování v jazyce C. Zadání: Operace s maticemi. Uživatelský manuál. ver. 1.0

PB071 Programování v jazyce C Jaro 2013

y = Spočtěte všechny jejich normy (vektor je také matice, typu n 1). Řádková norma (po řádcích sečteme absolutní hodnoty prvků matice a z nich

Metody operačního výzkumu cvičení

PB071 Programování v jazyce C Jaro 2015

Opakování programování

Operační systémy. Cvičení 4: Programování v C pod Unixem

2. Matice, soustavy lineárních rovnic

2 Spojité modely rozhodování

Součin matice A a čísla α definujeme jako matici αa = (d ij ) typu m n, kde d ij = αa ij pro libovolné indexy i, j.

Software je ve světě IT vše, co není Hardware. Do softwaru patří aplikace, program, proces, algoritmus, ale i data (text, obrázky), operační systém

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

Matematika I Lineární závislost a nezávislost

Technologie počítačových sítí 1. cvičení

PREPROCESOR POKRAČOVÁNÍ

Základy programování (IZP)

Interpret jazyka IFJ2011

Operační systémy 2. Přednáška číslo 2. Přidělování paměti

V 70. letech výzkumy četnosti výskytu instrukcí ukázaly, že programátoři a

GPGPU. Jan Faigl. Gerstnerova Laboratoř pro inteligentní rozhodování a řízení České vysoké učení technické v Praze

PROCESOR. Typy procesorů

Paralelní a distribuované výpočty (B4B36PDV)

5. Maticová algebra, typy matic, inverzní matice, determinant.

Úvod do programování - Java. Cvičení č.4

PROGRAMOVÁNÍ MIKROPOČÍTAČŮ CVIČENÍ 10

Spojová implementace lineárních datových struktur

8) Jaké jsou důvody pro použití víceprůchodového překladače Dříve hlavně kvůli úspoře paměti, dnes spíše z důvodu optimalizace

Operační systémy. Přednáška 8: Správa paměti II

VYUŽITÍ KNIHOVNY SWING PROGRAMOVACÍHO JAZYKU JAVA PŘI TVORBĚ UŽIVATELSKÉHO ROZHRANÍ SYSTÉMU "HOST PC - TARGET PC" PRO ŘÍZENÍ POLOVODIČOVÝCH MĚNIČŮ

Katedra aplikované matematiky FEI VŠB Technická univerzita Ostrava

Registrační číslo Hodnocení - část A Hodnocení - část B Hodnocení - část A+B

Regresní a korelační analýza

Připomenutí co je to soustava lineárních rovnic

Principy operačních systémů. Lekce 2: Správa paměti

FP - SEMINÁŘ Z NUMERICKÉ MATEMATIKY. Katedra matematiky a didaktiky matematiky Technická univerzita v Liberci

Procesor. Procesor FPU ALU. Řadič mikrokód

Seminář z IVT Algoritmizace. Slovanské gymnázium Olomouc Tomáš Kühr

Ústav technické matematiky FS ( Ústav technické matematiky FS ) / 35

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

skladbu obou směsí ( v tunách komponenty na 1 tunu směsi):

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Mgr. Karel Pazourek. online prostředí, Operační program Praha Adaptabilita, registrační číslo CZ.2.17/3.1.00/31165.

Ukazatele #2, dynamická alokace paměti

Úvod do programovacích jazyků (Java)

09. Memory management. ZOS 2006, L.Pešička

Zadání projektů z BPC2 pro letní semestr 2007/2008

Řešení problému vážené splnitelnosti booleovské formule pokročilou iterativní metodou

FAKULTA ELEKTROTECHNIKY A KOMUNIKAČNÍCH TECHNOLOGIÍ. Matematika 3. RNDr. Břetislav Fajmon, PhD. Autoři textu:

Algoritmus pro hledání nejkratší cesty orientovaným grafem

Anotace. Pointery. Martin Pergel,

Přehled verzí aplikace WinTechnol

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Vícejádrový procesor. Dvě nebo více nezávislých jader Pro plné využití. podporovat multihreading

MANUÁL K OVLÁDÁNÍ POČÍTAČOVÉHO SYSTÉMU PRO KMENOVÉ PÁSOVÉ PILY

Paměťové prvky. ITP Technika personálních počítačů. Zdeněk Kotásek Marcela Šimková Pavel Bartoš

Analýza spolehlivosti tlakové nádoby metodou Monte Carlo

Gymnázium, Brno. Matice. Závěrečná maturitní práce. Jakub Juránek 4.A Školní rok 2010/11

GPGPU Aplikace GPGPU. Obecné výpočty na grafických procesorech. Jan Vacata

Architektura počítačů

Principy činnosti sběrnic

Kubatova Y36SAP procesor - control unit obvodový a mikroprogramový řadič RISC Y36SAP-control unit 1

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

HW počítače co se nalézá uvnitř počítačové skříně

Číselné soustavy. Binární číselná soustava

11. Přehled prog. jazyků

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

0. Lineární rekurence Martin Mareš,

Pokročilé architektury počítačů

Neuropočítače. podnět. vnímání (senzory)

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

Matice. Přednáška MATEMATIKA č. 2. Jiří Neubauer. Katedra ekonometrie FEM UO Brno kancelář 69a, tel

Co je obsahem numerických metod?

Zdroj:

Správa paměti. doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 /

8. Posloupnosti, vektory a matice

MATLAB základy. Roman Stanec PEF MZLU

Transkript:

Fakulta elektrotechnická Katedra matematiky Dokumentace k semestrální práci Implementace numerických metod v jazyce C a Python 2013/14 Michal Horáček a Petr Zemek Vyučující: Mgr. Zbyněk Vastl Předmět: Matematika pro FEL 4

Obsah 1 Zadání semestrální práce 3 1.1 Název..................................... 3 1.2 Zadání..................................... 3 2 Analýza úlohy 4 2.1 Ošetření uživatelského vstupu........................ 4 2.2 Zjištění vlastností matic........................... 4 2.3 Kontrola špatně podmíněných matic.................... 4 3 Matematický popis jednotlivých úloh 5 3.1 Gausova eliminace.............................. 5 3.2 Jacobiho metoda............................... 5 3.3 Metoda Gausse-Seidela............................ 6 3.4 Metoda sdružených gradientů........................ 6 4 Popis implementace v C 7 4.1 Ošetření vstupu................................ 7 4.2 Datové typy a správa paměti........................ 7 4.3 Přenositelnost................................. 8 4.4 Debugování kódu............................... 8 4.5 Přehled návratových kódů.......................... 8 5 Popis implementace v Pythonu 9 6 Uživatelská příručka programu v jazyce C 10 6.1 Překlad a spuštění.............................. 10 6.2 Chybové hlášky................................ 10 6.3 Nápověda................................... 11 6.4 Formát matice soustavy........................... 11 7 Závěr 12 7.1 Výkonnost programu............................. 12 7.1.1 Program v jazyce C......................... 12 7.1.2 Program v jazyce Python...................... 13 7.2 Možný problém na určitých systémech................... 13 7.3 Vysvětlení nestandardních konstrukcí.................... 14 7.4 Kódování zdrojových souborů........................ 14 2

1 Zadání semestrální práce 1.1 Název Implementace numerických metod v jazyce C a Python 1.2 Zadání Naprogramujte v jazyce C a Python přenositelnou konzolovou aplikaci, která jako vstup načte z parametru na příkazové řádce jméno souboru s maticí soustavy a ostatní potřebné údaje pro spuštění výpočtu. Implementujte Gausovu eliminační metodu, metodu sdružených gradientů, Jacobbiho metodu a Gauss-Seidelovu metodu řešení soustav linárních algebraických rovnic. Implementaci v jazyce C řeší Petr Zemek a v jazyce Python Michal Horáček. 3

2 Analýza úlohy 2.1 Ošetření uživatelského vstupu Představme si, co všechno může BFU uživatel zkoušet zadávat do vstupu programu. Je vhodné ošetřit případy, kdy je očekáváno číslo. Pokud uživatel zadá nečíselný znak, měla by se použít defaultní hodnota. Matice je vhodné načítat spíše ze souboru než z výchozího vstupu pro jejich rozsáhlost. Program by měl umět parsovat soubor s maticí soustavy. Následně by měl umět ověřit, jestli matice v souboru je opravdu čtvercová a nechybí-li některý člen. 2.2 Zjištění vlastností matic Pro celistvost programu by bylo vhodné zjišťovat vlastnosti matic a na základě získaných informací se rozhodnout, jaký algoritmus pro řešení zvolit. 2.3 Kontrola špatně podmíněných matic Před spuštěním algoritmu Jacobiho metody nebo Metody Gausse-Seidela je vhodné ověřit, že se v matici soustavy na hlavní diagonále nenachází nula, protože se v těchto metodách vektor neznámých dělí prvkem na hlavní diagonále. 4

3 Matematický popis jednotlivých úloh 3.1 Gausova eliminace Matici soustavy je třeba převést do stupňovitého tvaru na horní trojúhelníkovou matici. Pod hlavní diagonálou musí zbýt nuly. Čili na konci eliminace musí zbýt na posledním řádku a sloupci matice jedno číslo, které po vynásobení neznámou z posledního řádku a sloupce se rovná poslednímu řádku vektoru pravé strany. Pokud při eliminaci vyjde nulový řádek, soustava má nekonečně mnoho řešení. Obecný algoritmus: for k = 1... m: #Najít sloupec, kde je největší číslo (pivot): i_max := argmax (i = k... m, abs(a[i, k])) if A[i_max, k] = 0 error "Matice je singulární!" swap rows(k, i_max) # pro každý prvek pod pivotem: for i = k + 1... m: # pro všechny zbývající prvky v daném sloupci for j = k + 1... n: A[i, j] := A[i, j] - A[k, j] * (A[i, k] / A[k, k]) endfor # Naplnit spodní trojúhelníkovou matici nulami: A[i, k] := 0 endfor endfor 3.2 Jacobiho metoda Jacobiho metoda je iterační metoda, která konverguje pouze pro ryze řádkově nebo sloupcově diagonálně dominantní matice. x k+1 i = b i A ii n j=i+1 A ij A ii x k i, k 0; i = 1,..., n 5

3.3 Metoda Gausse-Seidela Je téměř shodná s Jacobiho metodou. Liší se v tom, že v každé iteraci se od vektoru neznámých odečítá aproximace z předchozího kroku. Tím se sníží počet potřebných iterací k dosažení stejné přesnosti jako při použití Jacobiho metody. x k+1 i = b i A ii i 1 j=1 A ij A ii x k+1 i n A ij A j=i+1 ii x k i, k 0; i = 1,..., n 3.4 Metoda sdružených gradientů Obecný matematický zápis: ε> 0, x 1, k = 1 b 1 = Ax 1 b, v 1 = r 1, α 1 = b1 2 Ar 1, r 1, x 2 = x 1 + α 1 v 1 while x k+1 x k > ε k = k + 1 r k = r k 1 + α k 1 Av k 1 β k 1 = rk,av k 1 Av k 1,v k 1 v k = r k + β k 1 v k 1 α = rk,v k 1 Av k,v k x k+1 = x k + α k v k end while 6

4 Popis implementace v C 4.1 Ošetření vstupu Nejdříve se ověřují parametry příkazové řádky - jestli uživatel zadal cestu k matici a číslo metody řešení (soubor rozcestnik.c; ř. 29-68). Potom se ověří, jestli existuje soubor s maticí a uživatel, pod kterým běží tento program, má oprávnění ke čtení souboru (rozcestnik.c; ř. 81-85). V případě, že uživatelský vstup prošel těmito kritérii, zjistí se počet sloupců matice(rozcestnik.c; ř. 102-160) a provede se alokace množství paměti, které odpovídá druhé mocnině zjištěných sloupců matice bez pravé strany plus jednoho sloupce navíc (pravá strana). Nyní je vytvořena matice, která se musí naplnit daty ze souboru. To řeší funkce nacist_matici() v souboru jednoduche_fce/nacist_soubor.c. Zde se provádí rozřazování prvků matice ze souboru do matice v paměti a zároveň se provádí jednoduché testování na přítomnost znaku " " oddělující matici soustavy od pravé strany (jednoduche_fce/nacist_soubor.c; ř. 17-62). Nakonec se porovná počet řádků a sloupců. Pokud počet nesouhlasí, matice není čtvercová a program skončí s návratovým kódem 1. 4.2 Datové typy a správa paměti Nejpodstatnějšími proměnnými v programu jsou matice soustavy a ostatní vektory. Program byl vyvíjen na 32-bitové architektuře a proto pro tyto proměnné byl zvolen datový typ float. Práce s tímto datovým typem na této architektuře je optimální z hlediska rychlosti běhu programu. Pokud bychom chtěli na stejné architektuře např. zdvojnásobit přesnost výpočtu, můžeme zvolit datový typ matic a vektorů s dvojnásobou přesností (double float) a nebo dvojnásobně zmenšit ε. V prvním případě docílíme toho, že se jedno desetinné číslo bude kopírovat dva procesorové cykly dlouho. Matematické operace mohou trvat až několikanásobně více procesorových cyklů déle než při použití jednoduché přesnosti. V druhém případě sice vzroste režije algoritmu, která se skládá pouze z inkrementace proměnných typu unsigned int a udržovacích podmínek, ale hlavně vzroste počet iterací, které jsou závislé na použité metodě. Efektivnější je tedy buď změnit ε, a nebo použít procesor s širší sběrnicí a přepsat konstantu datového typu v souboru headers/konstanty.h. Paměť je z většiny přidělována staticky. Ta, která se alokuje dynamicky by se mohla alokovat staticky, protože v průběhu běhu programu ji není kde dealokovat. Paměť se alokuje na začátku funkce main() (ř. 131-160) hned po zjištění rozměrů matice soustavy. Dealokuje se na konci programu - ať už skončí chybou nebo ne. 7

4.3 Přenositelnost Program není závislý na softwarové ani hardwarové platformě a neobsahuje ani absolutní cesty k souborům. Jako parametr lze předávat relativní i absolutní cesty. Pro jednodušší úpravu zdrojových kódů jsou použity konstanty. Při kompilaci programu pro HW platformu s šířkou sběrnice vyšší než 32 bitů je vhodné ověřit, jestli float má skutečně tolik bitů jako šířka sběrnice. 4.4 Debugování kódu...se provádí prostým odkomentováním řádky #define _debug v souboru headers/konstanty.h. 4.5 Přehled návratových kódů Návratový kód Význam 0 Program skončil úspěšně 1 Uživatel nezadal číslo metody řešení 2 Uživatel nezadal cestu k souboru s maticí 3 Soubor s maticí soustavy neexistuje, nebo uživatel nemá oprávnění ke čtení 4 Operační systém odmítl přidělit paměť pro matici soustavy (není žádná volná) 5 Uživatel zvolil chybné číslo metody řešení 6 Chyba syntaxe v matici soustavy: očekáván znak " " 7 Uživatel zadal neznámý parametr příkazu 10 Chyba v programu; funkce gaus_seidel(), soubor vypocetni_fcegaus-sidel.c 11 Chyba v programu; funkce jacobi(), soubor vypocetni_fcejacobi.c 12 Chyba v programu; funkce sdruzene_gradienty(), soubor vypocetni_fcegrad.c 20 Výpočet metodou Gausse-Seidela ukončen pro dosažení maximálního počtu iterací 21 Výpočet metodou Sdružených gradientů ukončen pro dosažení maximálního počtu iterací 22 Výpočet Jacobiho metodou ukončen pro dosažení maximálního počtu iterací 23 Při pokusu o spuštění algoritmu Jacobiho metody byla na diagonále matice soustavy zjištěna nula 24 Při pokusu o spuštění algoritmu Gausse-Seidela byla na diagonále matice soustavy zjištěna nula 8

5 Popis implementace v Pythonu Hlavní výhodou je jednoduchost implementace. Jazyk Python je přímo navržen pro snadné a efektivní psaní aplikací, tudíž programátor neřeší nízkoúrovňové operace a může se plně soustředit na hlavní účel aplikace. Jelikož je to však interpretovaný jazyk, je nutné počítat s nižší rychlostí výpočtů, avšak v případě Pythonu není ztráta výkonu tak velká, neboť výkonově kritické knihovny jsou napsány v jazyce C. Nabízí se otázka, zda v Pythonu implementovat metody pro řešení soustav lineárních rovnic. Z vlastností jazyka plyne, že by nebylo vhodné jej používat pro velké soustavy rovnic, nebo opakovaně spouštět výpočet. V druhém případě by nastal problém, kdy se spotřebuje určitý čas pro spuštění interpretru Pythonu, a teprve potom se spustí výpočet samotný. Při použití všech čtyř metod na soustavu 2x2 trval běh výpočtu (vč. spuštění interpretru) 41 ms. Spuštění samotného interpretru trvalo 30 ms, tudíž výpočet zabral 11 ms, a to pro všechny čtyři metody. To znamená, že pro tak malou soustavu bylo spotřebováno přibližně 73% času jenom pro rozběhnutí výpočtu. Pokud by bylo potřeba počítat malé soustavy opakovaně, bylo by třeba interpretr spustit jednou a poté v něm opakovaně spouštět výpočty. Nepřekvapí ani paměťová náročnost. Na konci výpočtu proces využívá zhruba 3.5 MB RAM. Naštěstí v Pythonu existuje Garbage Collector, který nepotřebné proměnné dealokuje z paměti, takže i když programátor nedbá na paměťovou náročnost, neroste spotřeba paměti s každou proměnnou. Další výhodou implementace v Pythonu je skutečnost, že lze data z výpočtů snadno dále zpracovávat, například s pomocí knihovny matplotlib lze vytvářet grafy jako v prostředí Matlab. Interpretr Pythonu lze také snadno integrovat do jiných aplikací, kde jsou výpočty potřeba (takovou konzoli lze vidět například v aplikaci pro 3D modelování, Blender, kde o výpočty není nouze). Výhodou jsou také snadno dostupné funkce knihovny pro výstup, ať už v textové podobě, HTML, L A TEXu nebo PDF. 9

6 Uživatelská příručka programu v jazyce C 6.1 Překlad a spuštění Pro překlad bez zásahu do zdrojových kódů je nutné mít dostupný překladač gcc. Pro samotný překlad stačí zadat příkaz make v kořenovém adresáři zdrojových kódů (nachází se tam soubor Makefile. Program má jednoduché textové rozhraní. Spouští se z příkazové řádky; standardní rozměry konsole 80x25 postačují. Pro spuštění je třeba zadat cestu k matici a metodu řešení. Příklad:./slar -s matrix3.txt -m 0 Tím dojde k načtení souboru matrix3.txt a použití metody 0 - GEM. Parametr -m může nabývat těchto hodnot: Hodnota Použitá metoda 0 Gausova eliminační metoda 1 Metoda Gausse-Seidela 2 Metoda Sdružených gradientů 3 Jacobbiho metoda V závisloti na použité metodě můžete být požádání o další uživatelský vstup - o hodnotu ε a o počáteční vektor neznámých. Více informací nebude vyžadováno. Pokud zadáde jiný znak než číslo, použije se výchozí hodnota. Výchozí hodnota ε je 0.01 a vektor neznámých je defaultně 0. 6.2 Chybové hlášky Program při svém ukončení předává operačnímu systému návratový kód. Podle tohoto kódu lze usoudit, zda program skončil správně nebo chybně. Při svém ukončování také vypíše, proč končí. Např. když se stane, že ve vašem PC už nezbývá dostatek volné paměti (používáte příliš novou verzi Windows), vypíše se hláška: Chyba #4: Došla paměť! 10

6.3 Nápověda Pro výpis nápovědy zadejte:./slar -h 6.4 Formát matice soustavy Do načítaného souboru se zapisuje rozšířená matice soustavy. Matice A musí být čtvercová. Jako oddělovač pravé strany se používá znak " ". Jako oddělovač sloupců se používá mezera. Před a za oddělovačem pravé strany musí být mezera. Příklad obsahu souboru s rozšířenou maticí soustavy: 1 3 4 1 8 4 3 8 9 2 4 9 11

7 Závěr 7.1 Výkonnost programu Výkonnost programu v C a programu v Pythonu se ověřovala na stroji IBM T34 s procesorem Intel Pentium-M s taktovací frekvencí 18644 MHz. L1 cache procesoru je 64kiB, L2 cache 2MiB. Šířka pamětí, procesoru a FSB sběrnice je 32 bitů. Operační systém je linuxová distribuce Gentoo. Testovaný program byl spuštěn s prioritou nice -10, aby se omezily vlivy ostatních aplikací. Operační systém běžel pouze v příkazovém režimu, aby se redukoval počet spuštěných procesů. Program psaný v jazyce C byl testován na rychlost bez debugovacích funkcí a s defaultní hodnotou ε, maximálního počtu iterací a počáteční hodnotou vektoru neznámých. Toho se docílilo zakomentováním části kódu, která obstarává výchozí vstup. Matice použitá k měření má rozměry 200 x 200 a je přiložená v souboru matice_velka.txt v kořenovém adresáři zdrojových kódů. 7.1.1 Program v jazyce C GEM Čas běhu: 243 ms Jacobiho metoda Čas běhu: 87 ms Dosažená přesnost: 0.008262 Počet iterací: 25 Medoda sdružených gradientů Čas běhu: 122 ms Dosažená přesnost: 0.009407 Počet iterací: 9 12

Metoda Gausse-Seidela Čas běhu: 60 ms Dosažená přesnost: 0.003813 Počet iterací: 17 7.1.2 Program v jazyce Python GEM Čas běhu: 6314.017 ms Jacobiho metoda Čas běhu: 1170.088 ms Počet iterací: 35 Medoda sdružených gradientů Čas běhu: 1179.550 ms Počet iterací: 7 Metoda Gausse-Seidela Čas běhu: 248.547 ms Počet iterací: 9 7.2 Možný problém na určitých systémech Je zde jedna závada, na kterou bych chtěl upozornit - jedná se o uvolňování paměti. Objevuje se pod 32-bitovým Gentoo (i686), pod 32-bitovým Archlinuxem (arm-v6j) i na 32-bitové ditribuci Fedora 18 (i686) (kernel 3.11.10-100.fc18.i686 s glibc 2.16-34) Při použití matic menších než 7x7 se chyba neobjevuje vůbec. Na 64-bitových architekturách se paměť dealokuje v pořádku. Nástroj Valgrid vypíše, že byla veškerá paměť uvolněna, i když dealokace skončí s chybou. Výpis chyby: *** glibc detected ***./slar: free(): invalid next size (fast): 0x0804c200 *** ======= Backtrace: ========= /lib/libc.so.6(+0x79930)[0xb7753930]./slar[0x80487b4]./slar[0x8048bcd] 13

/lib/libc.so.6( libc_start_main+0xf1)[0xb76f6c31]./slar[0x80486bd] ======= Memory map: ======== 08048000-0804b000 r-xp 00000000 08:06 170979 /home/jashin/dokumenty/vyvoj/rozpracovane/m4e/slar...... 7.3 Vysvětlení nestandardních konstrukcí V programu jsem využil nekonečných cyklů a příkazů skoku. Nekonečné cykly jsou nekonečné proto, že se tím zjedoduší programování a zpětná analýza kódu. Ukončovací podmínky jsou někde uvnitř cyklů a tudíž nemůže být použit např. cyklus for, který má udržovací podmínku v parametru. V kódu jsem příliš nepoužíval standardní ANSI-C komentáře - při vývoji jsem někdy zakomentovával velké kusy kódu a zakomentovaný komentář ( /* /*komentář */ */ ) se překladačem vyhodnotí jako chyba. Proto používám komentáře z C++. 7.4 Kódování zdrojových souborů Všechny zdrojové kódy programu i dokumentace jsou uloženy v kódování UTF-8 s UNIXovým ukončením řádků. 14