Kuriositeter matriser
Denna sida är en samling av "kuriositeter", "kluringar" och liknande som någon student under något kurstillfälle uttryckt intresse för. De ingår däremot inte i kursinnehållet, utan är som bäst relaterade till det.
Tillämpning av matrisalgebraiska identiteter
Följande dokument ger några exempel på att tillämpa algebraiska identiteter för matriser, till exempel för att konstruera en matris som är sin egen invers (idempotent) eller har sitt transponat som invers (ortogonal). Detta skrevs direkt för studenter på MAA140.
Kodbibliotek för (vissa) matrisberäkningar
Det här är, i princip, en lösning på problemet att implementera invers av matris, tillsammans med mycket annat. Det är däremot inte det alldeles enklaste sättet att göra detta på.
Bakgrunden är att jag ville experimentera med ett visst sätt att lösa ett visst optimeringsproblem, där några variabler var vektorer och andra variabler var matriser (dessutom med komplexa tal som element, men det är en småsak i sammanhanget). För det behövde jag en abstraktion som kunde täcka båda sorternas variabler (så att jag skulle kunna kombinera dem), och det blev Lie-grupper (efter Sophus Lie, norsk matematiker, 1842–1899); det viktiga är att detta ger ett ramverk för både "förflyttningar" (element i Lie-grupp) och "förflyttningshastighet" (element i Lie-algebra). Med det beslutet taget återstod sedan a simple matter of programming, nämligen att implementera det hela så att det passar in mot den abstraktionen…
Den efterfrågade implementationen återfinns på sidorna 21–23. Det är i huvudsak en enkel implementation via Gauss–Jordan-eliminering och radoperationer. Vissa finurligheter kommer in då språket saknar matriser som primitiv datatyp, utan matriser istället har kodats som listor av listor; hade målet varit maximal prestanda hade man sannolikt valt en annorlunda implementation, men här var målet snarast att det skulle passa väl in med ett befintligt större projekt.
En något mystisk detalj som nog behöver förklaras är att många subrutiner tar ett argument Zero som inte svarar mot något argument för motsvarande matematiska operation. Detta argument är helt enkelt en artefakt av kodpaketets anropskonvention, och skulle inte ses av en användare av dessa rutiner. Värdet kommer att vara en nollmatris av aktuell storlek, så att de olika rutinerna inte behöver ha det hårdkodat (matrisens sida hade också fungerat, men nollmatrisen visade sig vara behändigare).
Påpekas bör förmodligen också att källkoden är skriven i en stil som kallas litterat programmering, som innebär att källkoden samtidigt (ja rentav i första hand) ska vara en rapport eller dylikt om hur koden fungerar; med en preprocessor blir då källkoden körklar kod, med en annan preprocessor kan den bli en läsbar PDF. I dokumentet nedan är de konkreta kodraderna de som är numrerade. Litterat programmering har avsevärda fördelar för matematiktung kod, eftersom matematiken ofta är svår att gissa sig till från enbart koden – i synnerhet kan man före kodning behöva kolla att vissa förutsättningar är uppfyllda, men om dessa kollar inte behöver upprepas när man kör koden så har de heller inget avtryck i koden. Sidorna 45–48 ger några exempel på detta.