1. Domácí úkol: Interpolace
Úvod
V tomto úkolu budeme implementovat jednoduchý interpolační algoritmus. Na problém interpolace narazíme v mnoha formách v počítačové grafice, počítačově asistovaném designu (CAD) nebo v datové analýze. V rámci tohoto dokumentu nejprve popíšeme konkrétní algoritmus a poté shrneme požadavky na implementaci.
Teoretický základ
Nechť je dána konečná neprázdná množina bodů , kde , a dále liché . Bez újmy na obecnosti nyní předpokládejme, že . Naším cílem je nalézt polynomů stupně nejvýše tvaru , , a kde jsou zatím neznámé koeficienty. Každý z těchto polynomů uvažujeme jako definovaný na intervalu . Na tyto polynomy postupně naklademe následující podmínky:
- pro každé platí a (tj. rovnic; polynomy prochází na svých definičních oborech předepsanými body),
- pro každé a pro každé platí (tj. rovnic; polynomy na sebe hezky navazují),
- v krajních bodech (tj. a ) explicitně předepíšeme pro a derivace stupně až .
Neznámých koeficientů () máme , musí splňovat výše uvedených
lineárních rovnic pro neznámé koeficienty. Jde o tzv. splajny (spline) lichého stupně s předepsanými okrajovými derivacemi.
Tuto soustavu je možné vyřešit pomocí nástrojů lineární algebry. Za výše uvedených podmínek je i známo, že tato soustava má právě jedno řešení (to zde podrobněji rozebírat nebudeme). Tím získáme neznámé koeficienty polynomů . Pokud následně dostaneme hodnotu , tak stačí určit do jakého intervalu , , patří a následně vyhodnotit funkční hodnotu .
Implementační pokyny
Typ Interpolate{T}
V souboru src/interpol.jl je předpřipravený modul Interpolation v rámci
něhož je potřeba implementovat parametrický typ Interpolate{T}. Typový
parametr T omezme na reálná čísla (abstraktní typ Real). Konstruktor
tohoto typu bude popořadě přijímat poziční argumenty
x: vektor -ových souřadnic interpolovaných bodů, hodnoty typuT,y: vektor -ových souřadnic interpolovaných bodů, hodnoty typuT
a klíč-hodnota argumenty
order(role výše): liché přirozené číslo představující maximální stupeň interpolačních polynomů; výchozí hodnota1,left: vektor předepsaných derivací v levém krajním bodě (od nejmenší po největší; tedy od do , pro je tato podmínka prázdná); výchozí hodnotaT[],right: vektor předepsaných derivací v pravém krajním bodě (od nejmenší po největší; tedy od do , pro je tato podmínka prázdná); výchozí hodnotaT[].
Vektory x, y, left a right jsou stejného typu Vector{T}.
Pokud dostaneme vektory celočíselného nebo racionálního typu, tak všechny
hodnoty převedeme do typu Float64.
Pokud argumenty nesplňují uvedené podmínky, dojde k vyvolání výjimky
ArgumentError s vhodným textovým popisem. Viz testy v souboru
test/test_constructor.jl, konkrétně jde o:
- typové požadavky uvedené výše,
- pole
xaymusí být stejné délky, stejně tak poleleftaright, - pole
xnesmí obsahovat duplicitní hodnoty (kontrola stačí vzhledem k==), orderje omezen pouze na liché hodnotyInt64,- délka polí
leftarightzávisí správně na hodnotěorder.
Hodnoty v poli x nemusí být seřazené podle velikosti, v rámci přípravy
dat je nutné si tyto hodnoty seřadit. Nezapomeňte na odpovídající seřazení
i pole hodnot y!
Objekty typu Interpolate{T} bude možné vyhodnotit v zadaném bodě z::T.
Pokud je hodnota z mimo rozsah daný minimální a maximální hodnotou v poli x
(včetně), tak dojde k vyvolání výjimky DomainError s vhodným textovým popisem.
V opačném případě vrátíme uživateli hodnotu příslušného interpolačního polynomu
v bodě z. Pokud dostaneme na vstupu hodnotu jiného typu než T, tak se ji do
tohoto typu nejprve pokusíme konvertovat.
Například:
julia> include("src/interpol.jl");
julia> f = Interpolation.Interpolate([1.,2.],[3.,4.], order=1);
julia> f(1.3)
3.3Další ukázky lze nalézt v adresáři test.
Další náležitosti
Vedle výše uvedeného typu a metod (konstruktor, volání) můžete v modulu implementovat i další pomocné funkce pro zpřehlednění kódu. Je to velmi vhodné k zpřehlednění vašeho kódu. Modul a implementované metody opatřete vhodnými docstringy, aby případný čtenář dokázal pochopit jejich smysl. Snažte se svůj kód psát konzistentně s některým ze stylů nabízených balíčkem JuliaFormatter (např. BlueStyle).
Pokud použijete nástroje umělé inteligence (LLM; doplňování kódu v editoru, chat, nebo agentní mód), tak do textového popisu Merge requestu v Gitlabu sepište stručný report (reflexi použití) obsahující:
- Jaký model a v jaké verzi jste při práci použili.
- V jakém módu jste tyto nástroje využívali (doplňování kódu v editoru, web chat, v případě agentního módu uveďte i použitý postroj).
- Jakým způsobem jste nástroj používali a ověřovali správnou funkčnost kódu (přímé generování, vlastní implementace a LLM review, atp.).
- Uveďte problémy, na které jste při práci s nástrojem narazili. Například navrhnuté chybné řešení a jak jste ho následně odhalili.
V opačném případě do textového popisu uveďte, že se jedná o "ruční práci". Tento report bude i vstupem pro výsledné hodnocení, na základě tohoto reportu také bude klást důraz na některé aspekty odevzdaného kódu.
Lokální spouštění testů
Toto zadání je úmyslně vytvořeno lehce "na koleni" a nevyužívá například Julia projekty ke správě závislostí (látka, ke které se dostaneme později během semestru).
K lokálnímu spuštění budete proto pravděpodobně potřebovat doinstalovat balíček
Glob.
import Pkg; Pkg.add("Glob")Poté v kořenovém adresáři tohoto zadání stačí z příkazové řádky spustit
$ julia --color=yes test/runtests.jlTímto příkazem spustíte všechny testy v souborech test/test_*.jl.
Případně tak do adresáře test můžete snadno přidat i další pomocné vlastní
testy vlastních pomocných metod, jen je musíte pojmenovat ve tvaru test_*.jl.
Pokud vše dopadne dobře, měli byste vidět následující standardní výstup:
┌ Info:
│ Running tests in test_constructor.jl...
└ ────────────────────────────────────────────────────────────
Test Summary: | Pass Total Time
Interpolation: constructor | 15 15 3.4s
┌ Info:
│ Running tests in test_cubic.jl...
└ ────────────────────────────────────────────────────────────
Test Summary: | Pass Total Time
Interpolation: cubic, 2 points | 22 22 0.0s
Test Summary: | Pass Total Time
Interpolation: cubic, 3 points | 21 21 0.1s
Test Summary: | Pass Total Time
Interpolation: cubic, 25 points | 51 51 0.1s
┌ Info:
│ Running tests in test_linear.jl...
└ ────────────────────────────────────────────────────────────
Test Summary: | Pass Total Time
Interpolation: handling types during evaluation | 7 7 0.2s
Test Summary: | Pass Total Time
Interpolation: linear, 2 points | 10 10 0.0s
Test Summary: | Pass Total Time
Interpolation: linear, 3 points | 7 7 0.0sV opačném případě dostanete od Julie vynadáno!
Řešení a odevzdání
Ve svém repozitáři vytvořte větev odvozenou z větve assignment/01-interpolation
a nazvěte ji například solution/01-interpolation. Do solution/01-interpolation
vložte své řešení editací souboru src/interpol.jl případně přidáním testů do
složky test. Až budete se svým řešením spokojeni, vytvořte MR (to můžete i dříve,
alespoň uvidíte výsledek testů, pokud je nespouštíte lokálně) a přiřaďte mě k němu
jako assignee. Tímto aktem úkol odevzdáte.