Kategoriarkiv: Matte

math-quiz

Den här julen har jag för första gången under min studietid på LiU haft jullov på riktigt. Med det menas att jag inte behövt plugga inför några januaritentor alls, vilken lyx!

Denna möjlighet att spendera julen med att göra precis vad jag velat har resulterat i en app jag kallar math-quiz. Framtagandet av math-quiz har inkluderat både programmering och matematik, så lustigt nog blev det inte alltför stor skillnad mot tentaplugget. Många kanske undrar varför jag valde att skapa math-quiz och hur det gick till på vägen. Därför tänkte jag försöka besvara dessa frågor med just det här inlägget.

Syfte

Något som ofta nämns i samband med civilingenjörsutbildningar är hur matematikintensiva de är. I examenskraven för civ.ing. i mjukvaruteknik står att minst 45hp kurser inom matematik eller tillämpning inom matematik ska ingå i utbildningen. I min utbildning sprids dessa 45hp ut i början på utbildningen och därmed är det examenskravet uppfyllt redan efter de första tre åren.

När jag nu gick första terminen på det fjärde året märkte jag en ganska stor förändring i det att jag inte längre läste någon mattekurs med föreläsningar, lektioner, frustration och allt det roliga som det innebär. Det var inte helt utan obehag som jag insåg att kurserna jag valt (designmönster, mjukvarutekniskt entreprenörskap, interaktionsprogrammering, etc) inte krävde några matematikkunskaper över huvud taget. Jag blev fundersam över om jag läst all matematik helt i onödan. Än värre, jag slogs av tanken att mina hårt förvärvade matematikkunskaper sakta skulle förvittra utan underhåll. ”Not on my watch” tänkte jag och började klura på hur jag kunde hålla igång mattekunskaperna på bästa sätt. Jag gillar quizar och tipspromenader så om jag kunde kombinera detta med en webb-applikation skulle det bli perfekt uppvärmning inför kurserna i webbprogrammering som jag ska läsa nu till vårterminen.

Metod

Jag började med att googla på ”JavaScript quiz library” och fick en träff på en React-baserad lösning kallad JavaScript Quiz som utgjorde en perfekt grund att bygga vidare på. React är ju dessutom väldigt poppis och jag såg fram emot att lära mig mer om det. Jag var till och med så optimistisk att jag trodde det skulle gå snabbt och enkelt att skapa min matte-quiz. I själva verket skulle det gå långsamt och svårt, men det är ju förväntat när man ger sig ut på okänd mark.

Grafer <3

Tidigt i processen fick jag en idé om att jag ville presentera resultatet från quizen som en spindelgraf. Alltså, användaren besvarar frågor inom olika matematiska områden och får därefter en tydlig bild över dennes kunskap inom de olika områdena.

I min grupps kandidatprojekt Knekt använde vi oss av Highcharts med stor framgång. Jag körde vidare på det vinnande konceptet och efter några npm-installationer (react-highcharts för grundfunktionalitet och highcharts-more för spindeln) och en del bök lyckades jag smälla upp en fet graf som ni ser på bilden nedan.

Spindelgraf över resultatet från en omgång av math-quiz.

Jag gillar verkligen grafer.

Inställningar

Jag ville utöka funktionaliteten från den mycket enkla JavaScript Quiz och gjorde en Settings-sida där användaren bland annat kan välja vilka matematiska områden och hur många frågor quizen ska innehålla. Detta var ganska straight-forward med undantag för att jag valde att använda mig av react-numeric-input för lite enklare hantering av antal-frågor-väljaren. Jag skriver ”ganska straight-forward”, men med mina obefintliga kunskaper inom React ger bilden nedan en rättvisare beskrivning. Det är dock förvånansvärt hur lång man kan komma med Google och Stack Overflow. ;)

I have no idea what I'm doing dog

All I want for Quiz-mas is a nice little matrix

Efter allt strul med Settings-funktionaliteten var det dags att få till lite schyssta matte-frågor. För detta krävdes ett snyggt sätt att representera matematiska formler, integraltecken och matriser. Självklart ville jag använda mig av Latex, men det skulle visa sig vara en mycket hård nöt att knäcka. Jag började med att prova react-latex och react-matrix, men det var inte alls vad jag behövde. När jag snubblade över react-katex trodde jag att jag hittat den heliga graalen. K:et i katex står för Khan som i Khan Academy som jag tidigare haft stor användning av. Deras latex-lösning skulle definitivt duga för mig, dessutom ritas formlerna snabbt utan lång väntetid. Tyvärr lyckades jag aldrig få katex att fungera på rätt sätt utan mina formler ritades ut både TeX-ifierade och som vanlig text, mycket likt detta issue på GitHub. Jag slet i en dag med det men lämnade till slut Katex för en motsvarande lösning, MathJax.

MathJax fungerade! Tyvärr sker en liten fördröjning vid utritningen och av en outgrundlig anledning minskas dess font-storlek efter första frågan så texten blir lite för liten. Men ingen mjukvara utan buggar tänkte jag och valde att släppa math-quiz lös på internet.

Framtida arbete

För dig som tycker att math-quiz verkar intressant och vill bygga vidare på det finns projektet på GitHub. Förutom att fixa visuella buggar och snygga till GUI:t vore det även nice med fler frågor och utökad funktionalitet. Har du feedback eller vill bidra till math-quiz är jag idel öra!

Slutsats

Jag är tacksam över att kunna stå på de giganters axlar som skapat React, npm och alla små fina paket för formler, grafer, etc. WebStorm är en bra IDE, webbprogrammering är svårt och solo-programmering kan vara ganska jobbigt om än lärorikt.

För övrigt tänkte jag nu försöka ha jullov på riktigt. God fortsättning!

Skrytbrädan #1

Håll i hatten för nu blir det åka av! Jag tänkte skriva om mina fantastiska bedrifter och framgångar från den senaste tiden. Det är väl knappt att man får vara såhär mallig i dagens samhälle, men jag tänkte att på min egen blogg som nästan ingen läser borde det vara okej.

Statistik och sannolikhetslära – no problem!

Höstterminen 2015 läste jag kursen TDAB01, en grundkurs i statistik och sannolikhetslära. Efter en dålig start med lektionsuppgifterna lyckades jag aldrig fokusera på att lära mig och förstå materialet och då kursen var helt ny fanns inga gamla tentor att plugga in och därför var den första kuggningen i mitt studieliv ett faktum, det sved. Efter att ha pluggat ytterligare till omtentan i januari, och faktiskt lärt mig saker, var jag en ynka poäng ifrån godkänt. Close but no cigarr och jag fick vänta till augusti på nästa chans. Juli spenderades med att förstå materialet än en gång och utan att plugga jättemycket flöt nu intuitionen för statistiken i mina ådror. Nåja, tentan gick väldigt bra och jag dunkade in en stark 4:a i betyg!

Personlig tentastatistik för kursen TDAB01

Med mina nyvunna kunskaper kan jag nu till exempel skapa snygga diagram med R och ggplot2.

Fysik och mekanik – no problem!

Tillbaka till höstterminen 2015! Efter att ha misslyckandet från TDAB01 färskt i huvudet var det dags för fysik, ett ämne som legat i dvala hos mig sedan 2007. Med en kurs som tillät en att inte behöva förstå någonting à la ”slentrianskriva anteckningar hela föreläsningen/lektionen utan eftertanke” och en totalbrist på motivation bådade det inte gott inför tentan. Det blev ett bottenrekord, 0 poäng! Jag förstod mig varken på acceleration eller friktionskraft, så illa var det. Juli spenderade jag med att lära mig grunderna i fysik på högstadie-  och gymnasienivå och insåg att fysik är ganska coolt ändå. Ensam på omtentan lyckades jag klämma till med en stabil 3:a och jag är väldigt tacksam över att slippa släpa på en 1400 sidors fysikbok i fortsättningen.

Kandidatexamen – no problem!

Min första akademiska publikation är gjord! Min kandidatgrupps rapport finns att läsa här och den handlar om hur vi utvecklat en interaktivt webbapp för kryptoanalys, Knekt, och vilka lärdomar vi kunnat dra från projektet. Jag vet att rapporter för de flesta inte är världens mest spännande läsning men låt mig säga detta: Varje gruppmedlem skrev en individuell del i rapporten och min del handlar om parprogrammering och kodgranskning. Om inte det väcker intresset vill jag tillägga att mina grafer är gjorda i ggplot2 och bakom dem ligger mycket slit. Så ge lite kärlek till figur D.3 ;)

Checkpoint reached!

Tack vare en lyckosam omtenta-period i augusti har jag alltså avklarat tre kompletta år på Linköpings universitet och därmed fått en kandidatexamen på meritlistan. Detta har förstås flera fördelar, men det bästa är att jag nu kan använda detta som SMS-signal:

Jag vill passa på att tacka mina gruppkamrater från kandidatprojektet som inte bara såg till att vi lyckades väl med projektet utan att vi också hade väldigt kul på vägen! Jag vill även skicka iväg en shoutout till Khan Academy som hjälpte mig mycket med både statistiken och fysiken och som gör ett dunderjobb i att lära ut grundpelarna för att man sedan ska kunna lära sig mer avancerade koncept.

Tack för mig!

 

 

Partiell integration med Tic-Tac-Toe

Nyligen såg jag filmen Stand and Deliver från 1988 som handlar om hur Jaime Escalante, en hyperengagerande mattelärare, undervisar några High School-kids i Calculus. Filmen innehåller både spanska och 80-talets LA och är verklighetsbaserad så what’s not to like? But wait there’s more! Man kan till och med lära sig lite tips för när man räknar matte och det ska vi kika närmare på i det här inlägget.

I en av filmens scener får vi se hur Mr. Escalante lär ut ett trick för att lösa integraler med partiell integration, vilket kan vara både enkelt och svårt. Enkelt för att det är såhär man gör:

\int \! f(x)g(x) \, \mathrm{d}x = F(x)g(x) - \int \! F(x)g'(x) \, \mathrm{d}x

Svårt för att som vi ser i formeln ovan ges en ny integral som vi eventuellt måste lösa med en ny partiell integration. Håller man inte tungan rätt i mun kan man hamna i en oändlig loop av integraler, och det är ingen dunderhit. Dessutom måste man hålla koll på minustecknen, något som kan ställa till det även för den bäste. Med Tic-Tac-Toe-metoden blir det förhoppningsvis lite lättare. Vi tar ett exempel för att visa hur det går till. Integralen vi vill lösa lyder som följer:

\int \! x^3sin(x) \, \mathrm{d}x

Av uppenbara orsaker väljer vi att derivera polynomet och integrera den trigonometriska funktionen. (Om det inte är uppenbart för läsaren kan ni prova att göra tvärtom.) Vi börjar med att ställa upp en tabell med tre kolumner där den vänstra kolumnen består av upprepade deriveringar av vårt polynom, ända tills vi får 0. Låt mig demonstrera:

x^3
3x^2
6x
6
0

Nästa steg är att fylla den mittersta kolumnen med upprepade integrationer av vår trigonometriska funktion sin(x). Detta pågår lika många gånger som vi deriverade polynomet. Såhär alltså:

x^3 sin(x)
3x^2 -cos(x)
6x -sin(x)
6 cos(x)
0 sin(x)

Den tredje och sista kolumnen ska fyllas med omväxlande plus- och minus-tecken. Den översta raden har ingen betydelse, så där skriver jag ”Tecken” och därefter fyller jag i kolumnen. Först plus, sen minus, sen plus osv.

x^3 sin(x) Tecken
3x^2 -cos(x) +
6x -sin(x) -
6 cos(x) +
0 sin(x) -

Tabellen är ifylld och nu är det äntligen dags att spela Tic-Tac-Toe! Vi ska skapa grupper om tre delar: en del polynom, en del trigfunk och ett tecken. Grupperingen sker genom att ta den översta vänstra cellens polynom, gå snett neråt höger för trigfunktionen och sen ett steg åt höger för tecknet. Det där var lite krångligt att skriva, så jag slänger på lite visuella förbättringar i tabellen i form av färger och pilar:

x^3 sin(x) Tecken
3x^2 -cos(x) +
6x -sin(x) -
6 cos(x) +
0 sin(x) -

Det enda som återstår nu är att multiplicera ihop delarna i våra grupper och sedan summera resultatet, och glöm för allt i världen inte bort konstanten C:

\int \! x^3sin(x) \, \mathrm{d}x = -x^3cos(x)+3x^2sin(x)+6xcos(x)-6sin(x)+ C

Det där, mina kära läsare, är hur man integrerar med hjälp av Luffarschack. Jag hoppas att mitt exempel visade på styrkan hos den här metoden. Om inte, prova öka graden på polynomet. Metoden är inget jag använde i mina tidigare mattekurser, helt enkelt för att jag inte visste att den fanns, men jag tror att den kan fungera väl för att undvika enkla misstag som teckenfel.

Det här inlägget inspirerades av videon Tabular Integration in Stand And Deliver och detta föreläsningsmaterial av Oliver Knill, Harvard University.

Latex och kedjor

Inläggets titel kan man kalla för clickbait, för även om inlägget kommer att handla om typ Latex och typ kedjor, så är det kanske inte riktigt vad de flesta förväntar sig.

Latex är, förutom gummivarianten, ett typsättningssystem som man kan använda sig av för att formatera text. Det lämpar sig ypperligt för att skriva matematiska ekvationer och annat skoj. I matematiken finns en regel för derivator som kallas kedjeregeln, så nu har vi fått med kedjorna också.

När jag läste att WordPress, som min blogg använder, stödjer Latex blev jag förstås eld och lågor. Därför tänkte jag försöka skriva en del av mina anteckningar från senaste föreläsningen i flervariabelananlys och se hur det blir.

Kedjeregeln (en variabel)
D( f( g( x) )) = f'(g(x)) \cdot g'(x)
Alltså om du tar derivatan av en funktion som har en inre funktion så får du derivatan av den yttre funktionen som fortfarande omsluter den inre oförändrade funktionen multiplicerat med derivatan av den inre funktionen. Usch, det är svårare att förklara matematik med ord än det är att bara skriva det. Vi tar ett exempel:

Om vi tar g(x) = ln x från föregående exempel får vis:
D(f(ln x)) = f'(ln x)\frac{1}{x}

Okej, om vi tar ett lite trixigare exempel:
D((ln x)^2 + ln x) = 2lnx \cdot \frac{1}{x} + \frac{1}{x} = \frac{1}{x}(2ln x + 1)

Jag har lite problem att tyda mina anteckningar och jag behöver dessutom laga mat så jag kommer i resten av inlägget inte gå in på detalj varför det står som det gör, men det är nog lika bra det, matematiken får tala för sig själv helt enkelt.

Variabelbyte (en variabel)
Eulerekvationen lyder:
x^2 y'' - 2xy' + 2y = 2x^2 (x > 0, y = y(x))

Vi gör variabelbytet t = ln x, alltså x = e^t
y(t) = y(ln x)
y_x' = y' \cdot \frac{1}{x}
y_{xx}'' = (y''(ln x) \cdot \frac{1}{x})\frac{1}{x} + y'(ln x) \cdot (- \frac{1}{x^2})

Nu börjar det hända saker, det sista steget var i alla fall produktregeln för derivata tillämpat på det vi fick ut från steget innan. Vi kan förenkla uttrycket vi fick på slutet till detta:
y_{xx}'' = (y'' - y')\frac{1}{x}

Sätter vi in detta i Euelerekvationen som visades ovan får vi:
x^2(y'' - y')\frac{1}{x} - 2x \cdot y' \cdot \frac{1}{x} + 2y = 2x^2 \Leftrightarrow y'' - 3y' + 2y = 2e^{2t} (=2x^2)

Nu har vi fått oss en fin lite differentialekvation att lösa, tror jag. Vi vill få fram den homogena lösningen till ekvationen vilket vi får mha den karakteristiska ekvationen:
r^2 - 3r + 2 = 0 \Leftrightarrow r = 1 \lor r = 2
vilket ger:
y_h = Ce^t + De^{2t}

Huga, nu börjar vi närma oss, för att hitta partikulärlösningen gör vi en ansats: (eller kanske en insats, fniss)
y = Ate^{2t}
y' = (A + 2At)e^{2t}
y'' = (2A + 4At)e^{2t}

Insatt i ekvationen vi fick lite högre upp:
(2A + 4At)e^{2t} - 3(A + 2At)e^{2t} + 2Ate^{2t} = 2e^{2t} \Leftrightarrow 2A - 3A = 2 \Leftrightarrow A = -2

Detta ger oss partikulärlösningen:
y_p = -2te^{2t}

Nästa framme nu, så:
y(t) = Ce^t + De^{2t} - 2te^{2t}
y(x) = Cx + Dx^2 - 2x^2 \cdot lnx

Och roligare än så blir det inte gott folk. Det är stor risk för att det smög med sig nåt skrivfel, och det var väl inte så rolig läsning till å börja med. Men jag fick träna på att skriva Latex och förhoppningsvis kan det komma till användning inför framtiden.

PS Jag slängde in det här i CSS:en för att latexen skulle se lite bättre ut:
.entry-content img.latex {
box-shadow: none;
position: relative;
top: 6px;
}