Om DigiMat School

DigiMat är ny utbildning i matematik för skola och högskola för det nya digitala samhället.

DigiMat lanseras som MOOC på edX under våren 20 i form av DigiMat Basic, DigiMat-School och DigiMat Pro.

DigiMat ger en konkret realisering av den nya läroplanen för grundskolan 2018 med programmering som del av matematikämnet. Se även plan 18.

DigiMat använder den nya web-editorn p5.js för JavaScript (lanserad av Processing), men kan kombineras med valfritt programmeringsspråk. I den tidigare versionen Matematik-IT  användes plattformen Codea.

DigiMat Pro anknyter till FEniCS Project som open source plattform för automatiserad matematisk simulering.

DigiMat Basic har vunnit stöd av Vinnova med 1.7 milj April 19 – Juli 20.

DigiMat är en sammanhållen utbildning med gemensamma teman som varierar i djup och bredd från tidig skola till avancerad akademisk och professionell nivå.

DigiMat erbjuder nya former av

  • skolmatematik
  • inledande matematikutbildning vid högskola
  • fortbildning för matematiklärare.

Huvudprincipen i DigiMat är att alla matematiska objekt konstrueras/beräknas genom exekvering av korta datorprogram med rikt output: (se översiktsplan)

  • Konstruktion av de naturliga talen 1, 2, 3, osv genom upprepning av den grundläggande operationen +1. Representation i binär och decimal form.
  • Konstruktion de hela talen genom upprepning av operationen -1.
  • Konstruktion av tal på fraktionell binär och decimal form.
  • Konstruktion addition, subtraktion, multiplikation och division för binära och decimala tal.
  • Konstruktion av linje, plan, koordinatsystem.
  • Konstruktion och rumslig representation i koordinatsystem av geometriska objekt: linje, cirkel, rektangel, triangel.
  • Konstruktion av rörelse av geometriska objekt i koordinatsystem.
  • Konstruktiv Calculus som tidstegning  av dx=v*dt.
  • Konstruktiv mekanik och fysik med Calculus.
  • Konstruktiv matematisk modellering av olika system i fysik, kemi, ekonomi…
  • Konstruktion av spel som interaktiv matematisk modellering.

Konstruktionerna är datorprogram skapade genom programmering som har formen av maskiner för olika uppgifter. En första uppgift kan vara programmering av en maskin för addition av binära heltal med vidare utveckling till en räknemaskin för binära eller decimala fraktionella tal, osv till spelmaskiner och vidare till datamaskiner för allmännare uppgifter.

Matematiken får på detta sätt en direkt realisering  i form av (korta) datorprogram som eleven själv skriver och därmed ges kommando över matematiken: Det man själv har konstruerat kan man också förstå, och vidareutveckla…

Basics listar en sekvens i JavaScript som direkt kopplar till ovanstående plan. Exemplen i Codea/Lua på denna site  låter sig direkt omformuleras i JavaScript.

Vad gäller binära tal, betänk enkelheten uttryckt i följande tabeller för de grundläggande aritmetiska operationerna:

  • addition (+)  table: 0 + 0 = 0,\, 0 + 1 = 1,\, 1 + 0 = 1,\, 1 + 1 = 10.
  • subtraction (-) table: 0 - 0 = 0,\, 1 - 0 = 1,\, 0 - 1 = - 1,\, 1 - 1 = 0.
  • multiplication (x) table: 0\times  0 = 0,\, 0\times 1 = 0,\, 1\times  0 = 0,\, 1\times 1 = 1.
  • division table (/): 1/1 = 1, 1/10 = 0.1 or 0.1\times 10 = 1.

Vad Är Digital Matematik?

jumbojet

Digitala Samhällets Matematik

Det digitala samhället bygger på digital matematik i form av digital datorberäkning styrd av den formella matematikens metod och språk översatt till datorkod genom programmering och exekverad av datorns mikroprocessor. 

DigiMat är ny matematikutbildning i form av

  • digital matematik = matematik + programmering + dator.

DigiMat är utvecklat av forskare i digital matematik vid KTH med världsledande forskning presenterad på edX: High Performance Finite Element Modeling Part 1 och Part2.

DigiMat är fritt läromedel tillgängligt genom webbläsare med koppling till web-editor för JavaScript.

DigiMat ger en tematiskt sammanhållen matematikutbildning från skola till universitet med successivt ökande bredd och djup.

DigiMat uppfyller intentionerna bakom den nya läroplanen för grundskolan med programmering som del av matematikämnet, vilka speglar matematikens nya roll i det digitala samhället i form av digital matematik.

DigiMat lär eleverna att med start i det enkla skriva datorprogram som konstruerar matematik, som sedan utforskas och används som byggstenar för vidare konstruktion.

DigiMat är learning-by-doing och creating-by-programming, vilket gör matematiken begriplig och användbar för många.

DigiMat kan jämföras med musikundervisning där eleven ges ett fint instrument (dator, iPad, mobil), som en Bösendorfer konsertflygel eller Stradivarius fiol, och lär sig spela och skapa musik, själv och tillsammans med andra.

DigiMat kan anpassas efter olika elevers förutsättningar och intressen.

DigiMat leder eleven till självständigt arbete och frigör läraren till individualiserad undervisning och egen utveckling.

DigiMat lär fler elever mer relevant matematik på kortare tid och kan stärka Sverige som industri och IT-land.

DigiMat kommer att lanseras internationellt med särskilt syfte att ge skolan i utvecklingsländer ett snabbspår till utveckling.

Digital Matematik – Automatiserad Beräkning

Digital matematik skapas genom korta datorprogram som producerar rikt output vid upprepad exekvering. Ett första datorprogram, som eleven kan skriva så snart läsning och skrivning av enkel text behärskas, är följande instruktioner som upprepas:

•     n = n + 1
•     print(n)

med n=0 som start. Detta korta program som har formen av iteration (upprepning) konstruerar de naturliga talen 1, 2, 3,…Få instruktioner/kort program som producerar mycket vid upprepning.

Detta är principen för automatisering, som är grunden för det både industriella samhället byggt på automatiserad materiell produktion och det digitala samhället byggt på automatiserad digital beräkning. Principen är att en och samma serie av instruktioner  upprepas många gånger och då skapar mycket: Alla de naturliga talen från instruktionen n = n + 1 .

När så eleven själv skapat de naturliga talen är nästa steg att utforska talens egenskaper per konstruktion, inklusive digital representation i olika baser från datorns binära med nollor och ettor till den vanliga decimala med siffrorna 0 till 9, samt användning av tal i sina många former.

Så skriver eleven själv de korta datorprogram som automatiserar addition, subtraktion, multiplikation och division. Eleven kan därmed bygga sin egen kalkylator så snart eleven kan läsa och skriva enkel text, dvs redan i åk 2, och därefter börja mäta världen med hjälp av tal bättre än en vuxen.

En elev som själv skrivit koden för sin kalkylator kan uppmuntras att använda den för att utforska vida möjligheter. Detta är motsatsen till traditionell matematikundervisning med främst räkning för hand och mycket begränsade möjligheter.

I nästa steg skapar eleven själv Digital Calculus som vår tids digitala version av Newton’s Calculus = matematik för förändring = grunden för den industriella revolutionen, genom iterationen:

•   t = t + dt
•   x = x + v(t)*dt

där t anger tid, x kan ange position i rum, v(t) är en given hastighet som funktion av t, och dt ett (litet) tidssteg, med givna startvärden för t och x. Genom upprepning = tidsstegning konstrueras så positionen x(t) som funktion av t som integralen av hastigheten v(t). Här kan x = x+v(t)*dt skrivas dx = v(t)*dt, vilket ger dx/dt = v(t), dvs v(t) som derivatan av positionen x(t) som ändring dx av x per tidsenhet dt.

Så skapas en virtuell värld av förändring som en film (med tex 16 bilder per sekund) med en liten ändring från en bild till nästa i en illusion av kontinuerlig rörelse.

Eleven skapar/konstruerar alltså själv både talen, de fyra räknesätten, Descartes analytiska geometri och Newton’s Calculus och Newton’s mekanik med hjälp av korta datorprogam och kan så bygga en kapacitet som tidigare bara burits av professorer i matematik, om ens det.

Detta innebär en genomgripande rationalisering av matematikutbildingen, där fler elever kan lära sig mycket mer på kortare tid. Det är som att låta eleven styra ett flygplan, efter viss pilotutbildning, istället för att tvinga eleven att gå genom en djungel som få kommer igenom.

DigiMat kan sammanfattas i en trappa som eleven själv bygger:

  • Konstruera Talen
  • Mät Världen: Digitala Världen
  • Bygg Kalkylator
  • Bygg Simulator av Världen – Digitala Världen
  • Förstå (Digitala) Världen – Förändra och styr (Digitala) Världen
  • Väx i kunskap, kompetens och självförtroende.

Digital Matematik: Automatiserad Programmering = FEniCS

DigiMat för principen av automatisering ett steg vidare från automatiserad beräkning till automatiserad programmering, där datorkoden efter specifikation i den formella matematikens termer av mänsklig hand, produceras automatiskt.

DigiMat kopplar därmed till FEniCS Project som första open source mjukvara för automatisk programmering av matematiska modeller av verkliga eller tänkta fenomen i form av differentialekvationer, till datorkod för digital beräkning = virtual reality.

Nästa steg är att automatisera skapandet av den matematiska modellen, typiskt i form av differentialekvationer för förändring, vilket är en form av Artificiell Intelligence AI  där modellen automatiskt modifieras (lär sig) efter jämförelse mellan verklighet och virtual reality producerad via automatisk programmering och beräkning.

DigiMat innehåller hela kedjan från grunden med de naturliga talen till forskningsfronten med AI.

 

Om Matematik-IT

Matematik-IT är ett reformprogram för matematikundervisning i grundskola och gymnasium, som bygger på en ny syntes av

  • formell matematik – algebra/geometri/analys
  • numerisk beräkning – datorprogrammering/kodning
  • tillämpning.

Matematik-IT erbjuder en konkret realisering av de nya läroplaner för matematik och teknik, som beslutades av Regeringen 2017-03-09 med programmering som nytt väsentligt moment i undervisningen. Matematik-IT bygger på reformprogrammet BodyandSoul för universitet och högskola utvecklat av ledande forskare och ger därigenom en sammanhållen utbildning över alla nivåer med i princip samma syntes av formell matematik (soul) och beräkning (body) bara i olika tappningar från grund till toppnivå. Det är den syntes som utgör grunden för IT-samhället och som dagens elever skall förberedas att möta.

En översikt av olika aspekter av Matematik-IT ges under huvudmenyn med Shortcut i sidomenyn till uppe till höger. Se också Kort Presentation.

Med datorspel menas här regelstyrda interaktiva system i form av matematiska modeller för olika större eller mindre verkliga eller tänkta världar, som eleverna själva bygger genom programmering i lämplig datormiljö. I en serie poster Spel1, Spel2,… leds eleven till detta mål med start i det enkla.

Matematik-IT kommer att lanseras i appform på App Store där delar nu är tillgängliga.

Matematik-IT är en syntes av matematik och programmering: Se en introduktion i denna menypost Allt ur +1.

Matematik-IT är konstruktiv matematik där eleverna själva hands-on genom datorprogram skapar alla matematiska objekt, vilket ökar både förståelse och användbarhet i tillämpning.

En vanlig reaktion från matematiklärare är att det inte finns utrymme för programmering i matematikundervisningen, vilken omfattar totalt 1125 timmar i grundskolan, eftersom den existerande läroplanen fyller det tillgänglig utrymmet med råge. Argumentet är att 1+1 = 2  och att 2 är större än 1. Programmering får helt enkelt inte plats. Om programmering skall ingå i matematik, så fordras betydligt fler timmar än 1125 (3 tim/vecka under 40 veckor i 9 år!).

Men det är inte alltid så att 1+1 = 2. Tex löses 1 kg socker i 1 liter vatten utan större volymsändring (och soppan blir godare åtminstone för unga sinnen och säkerligen mer näringsrik). Och det är detsamma med Matematik-IT: Genom att fullt integrera programmering och matematik får matematiken en turbo i form av datorberäkning och matematikundervisningen kan därmed utvidgas till betydligt rikare och mer stimulerande ängder. Detta framgår av läroplanen för Matematik-IT med realisering i sekvensen av Spel 1-50. Prova själv och se vad som kan vinnas med datorberäkning som turbo!

Men en sak är säker: Om programmering införs i matematikämnet på ett seriöst sätt och om därmed beräkningsmatematik får spelrum, då kommer matematikämnet att i grunden förändras vad gäller mål, mening, form och innehåll. Tänk på det!

Och titta här om Du vill få veta hemligheten varför det går att flyga, avslöjad med Matematik-IT.

Läs också Skolverkets rapport Översikt avseende forskning och erfarenheter kring programmering i förskola och grundskola med bl a följande avsnitt:

  • På Lugnets Skola i Hammarby Sjöstad pågår pilotprojektet IT-matematik20 i samarbete med Claes Johnson, professor i tillämpad matematik vid Chalmers Tekniska Högskola och Kungliga Tekniska Högskolan. I projektet används appen Codea. Johnson visar hur 10- åringar på Lugnets skola kan använda samma programmeringsspråk som studenter på Chalmers. Barnen utforskar programmering och prövar sig fram och kan med viss handledning såväl programmera spel, förstå spel och spela dem. Johnson tolkning är att detta beror på att datalogiskt tänkande ligger nära barns lek och dataspelande (Intervju, 2015-12-01). Tillsammans med andra forskare har Johnson skrivit fram ett förslag för ett nytt kärnämne där programmering integreras med matematik: IT-matematik21.

     

Här kan man läsa om historiken: Programmering på schemat (igen) – hur gick det till?

Spel0: Abacus as Binary Calculator

abacusOne can use a standard 10 bead Abacus with N rows for binary computation, for example as follows:

  1. Start with all beads to the left = 0.
  2. Count +1 by shifting a bead in row 1 (top row) from left to the right.
  3. For row n= 1, 2, to N-1, shift every 2 right beads in row n back to the left and shift one bead from left to right in row n+1.
  4. At end of counting find the binary representation as the column of beads to the right.

Addition of two binary numbers can be done first shifting the abacus representation of the first number to the right followed by shifting also the representation of the second number to the right and then cleaning up by step 3 above to a representation of the sum to the right.

Of course a 10 bead Abacus is really meant to be used for the decimal system. So what you can do as a practical exercise in preschool is to build a Binary Abacus with 2 beads per row by using cotton pulp balls and grill sticks fastened on a cardboard frame (in fact one bead per row is enough as are 9 beads per row for decimal numbers).

After addition, you are then prepared for multiplication through repeated addition.

The next step is write code for a Binary Abacus, where you click to add digits and update representation.

 

Spel1: Introduktion-Översikt

Matematik-IT bygger på enkla principer, som även unga elever kan lära sig använda och med hjälp av datorns beräkningskraft utforska världen i all sin komplexitet. Denna post ger i några korta datorprogram en inledning till den spännande värld av Matematik-IT, som sedan utforskas i mer detalj i en serie poster av vilka många är representerade på App Store. Se huvudmenyn Spel 1-100.

Huvudmenyn beskriver olika aspekter av Matematik-IT.

1. Konstruktion av de Naturliga Talen.

Matematikern Leopold Kronecker (1823-1891) sade: Gud gav oss de naturliga talen 1,2,3,…, resten är människans skapelse. Låt oss här istället själva med hjälp av spelplattformen Codea konstruera de naturliga talen genom att upprepning av +1, och skriva ut dem på konsol och skärm.

–Konstruktion av naturliga tal

function setup()
print(“Konstruera de Naturliga Talen 1,2,3,…”)
print(“Skriv på Konsolen och Skärmen”)
n=0
end

function draw()
background(40, 40, 50)
n=n+1
print(n)
font(“AmericanTypewriter”)
fontSize(50)
text(n,300,500)
end

2. Utforska Skärmens Pixlar

function setup()
print(“Utforska Skärmens Pixlar”)
end

function draw()
background(40, 40, 50)
font(“AmericanTypewriter”)
fontSize(50)
fill(238, 16, 46, 255)
text(CurrentTouch.x,CurrentTouch.x,CurrentTouch.y)
text(CurrentTouch.y,CurrentTouch.x,CurrentTouch.y-50)
end

3. Konstruktion av Binära Heltal

Binära tal använder de två siffrorna 1 och 0, med följande räkneregler: 0+0=0, 1+0=1, 0+1=1, 1+1 =10, där således med vanliga siffror 10 (binärt) = 2 (decimalt), 100 (binärt) = 4 (decimalt), 111 (binärt) = 7 (decimalt) osv.

Med binära tal kan barn lära sig addera, subtrahera och multiplicera godtyckliga heltal från 4 år. Datorn räknar också binärt, eftersom det är enkelt och går fort.

function setup()
print(“Binär Representation av Naturliga Tal via Tabell/Lista”)

bit={}
I=100
for i=1,I do
bit[i]=0
end

end

function draw()

background(40, 40, 50)

bit[1]=bit[1]+1
for i=1,I do
if bit[i]>1 then
bit[i+1]=bit[i+1]+1
bit[i]=0
end
end

font(“AmericanTypewriter”)
fontSize(50)
fill(238, 16, 46, 255)
for i=1,I do
text(bit[i],700-50*i,800)
end

end

4. Lutning av Skärmen: Ratt

Styrning av vår färd genom världen är fundamental för överlevnad och glädje. En iPad ger möjlighet till styrning via lutning av plattan i form av ratt-styrning som i en bil eller gravitationskraft-styrning som genom lutande plan.

function setup()
print(“Lutning som Ratt”)
pos=vec2(0,0)
end

function draw()
sprite(“SpaceCute:Background”,WIDTH/2,HEIGHT/2,HEIGHT)
pos=pos+20*vec2(Gravity.x,Gravity.y)
sprite(“SpaceCute:Beetle Ship”,pos.x,pos.y,100)
end

5. Lutning av Skärmen: Kraft

Jämför rattstyrning med kraftstyrning och upplev att det kraftstyrning är mycket svårare.

function setup()
print(“Lutning som Ratt”)
pos=vec2(0,0)
vel=vec2(0,0)
dt=0.1
end

function draw()
sprite(“SpaceCute:Background”,WIDTH/2,HEIGHT/2,HEIGHT)
vel=vel+20*vec2(Gravity.x,Gravity.y)*dt
pos=pos+vel*dt
sprite(“SpaceCute:Beetle Ship”,pos.x,pos.y,100)
end

6. Newtons mekanik: Basic 

function setup()

print(“Newtons ekvationer”)

pos={}
hast={}
acc={}
N=10

for n=1,N do
pos[n]=vec2(math.random(-100,100),math.random(-100,100))
hast[n]=math.random(-2,2)*vec2(pos[n].y,-pos[n].x)
acc[n]=vec2(0,0)
end

dt=0.1

end

function draw()

background(40, 40, 50)
fontSize(50)
fill(219, 14, 36, 255)
text(“Newtons ekvationer:”,300,900)
text(“a=F/m, dv=adt, dx=vdt”,300,800)

for n=1,N do
acc[n]=-pos[n]
hast[n]=hast[n]+acc[n]*dt
pos[n]=pos[n]+hast[n]*dt
sprite(“SpaceCute:Star”,pos[n].x+300,pos[n].y+500,100)
end

end

7. Newtons Mekanik: Planetsystem

function setup()

I=20

print(“Planet”)
print(“force~1/r^2”)
print(“acc=force/mass”)
print(“vel=vel+acc*dt”)
print(“pos=pos+vel*dt”)

pos = {}
vel = {}
acc= {}
force = {}
m={}

dt =0.001

for i=1,I do
pos[i]=vec2(math.random(200,400),math.random(300,600))
vel[i]=vec2(math.random(-100,100),math.random(-100,100))
m[i] = math.random(1,100)
end

end

function draw()

font(“AmericanTypewriter-Condensed”)
fontSize(30)
fill(0, 22, 255, 255)
text(“Motion-Force: Newton’s 2nd Law”,250, 800)
text(“force = mass x acceleration, f = m x a”,250, 750)
text(“acc=force/mass”,250, 700)
text(“vel=vel+acc*dt”,250, 650)
text(“pos=pos+vel*dt”,250, 600)

stroke(43, 203, 22, 108)
strokeWidth(1)

for i=1,I do
force[i]=vec2(0,0)
for j=1,I do
r = (pos[i]-pos[j]):len()
force[i]=force[i]-(1000000/(r+10)^3)*(pos[i]-pos[j])
end
acc[i] = force[i]
vel[i]=vel[i]+acc[i]*dt
pos[i]=pos[i]+vel[i]*dt
end

fill(42, 0, 255, 255)
for i=1,I do
ellipse(pos[i].x,pos[i].y,10,10)
end

end

8. Parametrar

function setup()
print(“Parameter”)
parameter.integer(“Radie”,1,200,10)
parameter.number(“Massa”,0,1,0.5)
end

function draw()
background(40, 40, 50)
sprite(“SpaceCute:Health Heart”,300,500,Radie)
text(Massa,300,300)
end

9. Touch

function setup()

print(“Touch Me!”)
started=vec2(0,0)
moving=vec2(0,0)
finished=vec2(0,0)

end

function draw()

background(40, 40, 50)
fontSize(30)
fill(7, 7, 232, 255)
text(started.x,started.x,started.y)
text(started.y,started.x,started.y-50)
fill(5, 255, 0, 255)
text(moving.x,moving.x+100,moving.y)
text(moving.y,moving.x+100,moving.y-50)
fill(255, 0, 10, 255)
text(finished.x,finished.x,finished.y)
text(finished.y,finished.x,finished.y-50)

end

function touched(touch)

if CurrentTouch.state==BEGAN then
started=vec2(CurrentTouch.x,CurrentTouch.y)
end
if CurrentTouch.state==MOVING then
moving=vec2(CurrentTouch.x,CurrentTouch.y)
end
if CurrentTouch.state==ENDED then
finished=vec2(CurrentTouch.x,CurrentTouch.y)
end

end

10. Knappar

function setup()
print(“Knapp”)
knapp=vec2(300,500)
switch=1
end

function draw()
background(40, 40, 50)
if switch==1 then
sprite(“Space Art:UFO”,300,500,100)
fontSize(50)
fill(255, 0, 3, 255)
text(“On”,300,600)
end
if switch==-1 then
sprite(“Space Art:UFO”,300,500,50)
fontSize(50)
fill(0, 255, 62, 255)
text(“Off”,300,600)
end
end

function touched(touch)
dist=(vec2(CurrentTouch.x,CurrentTouch.y)-knapp):len()
if CurrentTouch.state==ENDED and dist < 20 then

switch=-switch
end
end

11. Pong

pos =vec2(WIDTH/2,HEIGHT/2)
vel =vec2(100,100)
acc =vec2(0,0)
dt = 0.1
displayMode(FULLSCREEN)

function setup()

print(“Pong”)
music(“Game Music One:Venus”,true,0.5)

end

function draw()

background(26, 231, 38, 255)

if pos.x>WIDTH then
vel.x=-vel.x
end
if pos.x1000 then
vel.y=-vel.y
end

fill(0, 56, 255, 255)
rect(CurrentTouch.x-100,100,200,40)

if (pos.x>CurrentTouch.x-100 and pos.x<CurrentTouch.x+100) and (pos.y<50) then
vel.y=-vel.y
end

vel = vel +acc*dt
pos = pos +vel*dt
fill(255, 24, 0, 255)
ellipse(pos.x,pos.y,40)

end

12. Många Bollar

function setup()

print(“Många studsande bollar som interagerar genom elastiska fjädrar som aktiveras då bollarna är i kontakt.”)
print(“Bollars position kan ändras via touch.”)
print(“Styrning av bollradie R, fjäderstyvhet E, dämpning D och gravitation D.”)

speech.volume=1
speech.rate=0.01
speech.say(“Many bouncing balls having a ball”)

I=20

parameter.number(“R”,1,200,50)
parameter.number(“E”,10,1000,100)
parameter.number(“G”,-1000,1000,100)
parameter.number(“D”,0,100,10)

x={}
xold={}
xm={}
v={}
vold={}
vm={}
a={}
f={}
F={}
mass={}

for i=1,I do
x[i]=vec2(math.random(100,400),math.random(100,800))
xold[i]=vec2(math.random(100,400),math.random(100,800))
xm[i]=vec2(math.random(100,400),math.random(100,800))
v[i]=vec2(0,0)
vold[i]=vec2(0,0)
vm[i]=vec2(0,0)
f[i]=vec2(0,0)
a[i]=vec2(0,0)
mass[i]=1
end

dt=0.01
n=0
t=0

end

function draw()

t=t+dt
print(t)
background(40, 40, 50)
fill(0, 68, 255, 255)
rect(0,200,1000,20)
rect(10,200,20,1000)
rect(450,200,20,1000)

for i=1,I do
fill(255, 0, 40, 255)
ellipse(x[i].x,x[i].y,R)
end

for p=1,4 do
for i=1,I do
f[i]=vec2(0,-G)
for j=1,I do
xm[i]=(x[i]+xold[i])/2
vm[i]=(v[i]+vold[i])/2
length=(xm[i]-xm[j]):len()
if length f[i]=f[i]+E*(xm[i]-xm[j])
end
end
if x[i].y f[i].y=f[i].y+E*10*(250-x[i].y)
end
if x[i].x420 then
f[i].x=f[i].x+E*10*(420-x[i].x)
end
a[i]=f[i]/mass[i]
v[i]=(1-0.001*D)*vold[i]+a[i]*dt
x[i]=xold[i]+vm[i]*dt
end
end

for i=1,I do
xold[i]=x[i]
vold[i]=v[i]
end

end

function touched(touch)

if touch.state==ENDED then
n=n+1
x[n]=vec2(CurrentTouch.x,CurrentTouch.y)
xm[n]= x[n]
xold[n]= x[n]
fill(255, 0, 40, 255)
ellipse(x[n].x,x[n].y,R)
end

end

12. Massor och Fjädrar

function setup()

print(“Kedja av Massor och Fjädrar”)

print(“Touch för att skapa massor länkade med fjädrar”)
links = {}
linkvels = {}
dt = 0.01
force = vec2(0,0)
N=0

end

function draw()

background(40, 40, 50)

for k,link in pairs(links) do
fill(255, 0, 54, 255)
strokeWidth(0)
ellipse(links[k].x,links[k].y,40)
if k>1 then
stroke(0, 255, 66, 255)
strokeWidth(10)
line(links[k].x,links[k].y,links[k-1].x,links[k-1].y)
end
if k>2 then
for m=1,4 do
force = (links[k-2] – 2*links[k-1]+links[k])
linkvels[k-1]=linkvels[k-1]+force*dt
links[k-1]=links[k-1]+linkvels[k-1]*dt
end
end
if k force =vec2(0,0)
linkvels[1]=linkvels[1]+force*dt
links[1]=links[1]+linkvels[1]*dt
end
end

end

function touched(touch)

if touch.state == BEGAN then
N=N+1
table.insert(links, makeLink(touch.x,touch.y))
table.insert(linkvels, makeLinkVel())
end
if touch.state == ENDED then
links[N].x = touch.x
links[N].y = touch.y
end
end

function makeLink(x,y)
local link=vec2()
link.x = x
link.y = y
return link
end

function makeLinkVel()
local linkvel=vec2(0,0)
return linkvel
end

13. Fysikmotor

function setup()
print(“Test av fysikmotorn”)
N=100
body={}
for n=1,N do
body[n]=physics.body(CIRCLE,10)
body[n].x=math.random(150,600)
body[n].y=math.random(150,1000)
body[n].linearVelocity=vec2(math.random(-100,100),math.random(-100,100))
body[n].restitution=1
end
floor=physics.body(POLYGON,vec2(0,0),vec2(1000,0),vec2(1000,50),vec2(0,50))
floor.x=100
floor.y=100
floor.r=0
floor.type=STATIC
wall1=physics.body(POLYGON,vec2(0,0),vec2(20,0),vec2(20,1000),vec2(0,1000))
wall1.x=100
wall1.y=100
wall1.r=0
wall1.type=STATIC

wall2=physics.body(POLYGON,vec2(0,0),vec2(20,0),vec2(20,1000),vec2(0,1000))
wall2.x=700
wall2.y=100
wall2.r=0
wall2.type=STATIC

physics.gravity(0,-10)

end
function draw()

background(246, 246, 247, 255)
for n=1,N do
sprite(“SpaceCute:Beetle Ship”,body[n].x,body[n].y,20)
end
fill(0, 26, 255, 255)
rect(floor.x-200,floor.y+25,1000,20)
rect(wall1.x,wall1.y,20,1000)
rect(wall2.x,wall1.y,20,1000)

end

14. Hoppande Apa

Vi tränar på fysikmotorn enligt post 52.

15. Input av Text från Skärmen

Se post 51.

16. Interaktiv Berättelse

Vi tittar på hur man kan skapa en interaktiv animerad berättelse utifrån post 50.

Spel2: AngryMathBirds Easy

angrymathbirds

Vi skriver ett första datorprogram för rörelse enligt Newtons rörelseekvationer på formen (jämför med header bild av Newton med sina ekvationer)

  • vx=vx +ax*dt
  • vy =vy+ay*dt
  • x=x+vx*dt
  • y=y+vy*dt,

där här ax=0, ay=-g=-gravitationskonstant, dt>0 är tidssteg, x är horisontell koordinat, y vertikal koordinat, vx horisontell hastighet och vy vertikal hastighet. Detta är matematiken bakom fåglarnas flykt i AngryBirds. Först genom att sätta utgångsposition/hastighet direkt i programmet, i nästa steg genom införa dessa genom touch på skärmen.

Titta på AngryMathBirds Demo 1 som innehåller

  1. rörelse enligt Newton’s rörelseekvationer
  2. touch för att bestämma startvärden för position och hastighet och av Bird
  3. träff då avstånd mellan Bird och Pig är tillräckligt litet
  4. hämta bilder på Bird, Pig och Slingshot från nätet via Dropbox.

Template 1:

function setup()

x=100
y=100
vx=10
vy=10
ax=0
ay=-1
dt=1

end

function draw()

vx=vx+ax*dt
vy=vy+ay*dt
x=x+vx*dt
y=y+vy*dt

background(255,255,255,255)
fill(255,0,0,255)
ellipse(x,y,20)

end

Spel3: De Naturliga Talen: Konstruktion och Addition

adding

Uppgift 1: Skriv ett datorprogram som konstruerar de naturliga talen och skriver ut dem på konsolen (med basen 10), genom upprepning av x=x+1 med start x=0.

Uppgift 2: Binär representation av naturliga tal: 1=0+1, 10=1+1, 11=10+1, 100=11+1, 101=100+1,…

Uppgift 3: Skriv ett datorprogram som utför addition av naturliga tal i binär form utifrån additionstabellen: 0+0=0, 1+0=1, 0+1=1, 1+1=10. (Titta på Lego Computer DigiComp)

Extrauppgift: Skriv ett datorprogram som generar de rationella talen av formen p/q med p och q naturliga tal (q ej 0) med p<q och skriver ut dem på konsolen med basen 10.

Jämför med Counting på App Store och även Calculus1.

Template 1 Uppgift 1: (Kör programmet)

–Natural Numbers
function setup()
print(“Konstruktion av de hela talen genom upprepning av x=x+1 med start x=0.”)
n=0
end
function draw()

background(251, 251, 251, 255)

n=n+1

fontSize(200)
fill(0, 0, 0, 255)
text(n,300,500)

end

Template 2 Uppgift 1: (Kör programmet)

funktion setup()
print(“Konstruktion av de hela talen genom upprepning av x=x+1 med start x=0.”)
n=0

end

function draw()

background(40, 40, 50)
n1=n
n=n+1

font(“AmericanTypewriter”)
fontSize(20)
fill(229, 232, 228, 255)

for m=1,n do
for k=1,m do
text(m..”=”,30,800-20*m)
text(“+1″,20*k+40,800-20*m)
end
end

fontSize(100)
fill(255, 0, 37, 255)
text(n..”=”..n1..”+1″,300,600)
fontSize(200)
fill(0, 1, 255, 255)

text(n,300,300)

end

Template Uppgift 3:

— BinaryAdd

number1 = {}
number2 = {}
sum = {}

for i=1,20 do
number1[i]=0
number2[i]=0
sum[i]=0
end

number1[1]=1

function setup()

font(“AcademyEngravedLetPlain”)
fontSize(50)
fill(11, 0, 255, 255)
print(“Construction of Natural Numbers”)
print(“Add number 1 repeatedly”)
print(“1”)
print(“1+1 = 10”)
print(“1+1+1 = 10+1 = 11”)
print(“1+1+1+1 = 11+1 = 100”)
print(“Binary numbers: digits 0 and 1”)
print(“0+0=0,0+1=1,1+0=1,1+1=10,”)

end

function Add(number1,number2)

local carry={}
for i=1,20 do
sum[i]=0
carry[i]=0
end
for i =1,20 do
sum[i] = number1[i] + number2[i]+carry[i]
if sum[i] == 2 then
carry[i+1] = 1
sum[i]=0
end
if sum[i] == 3 then
carry[i+1] = 1
sum[i] = 1
end
end
return sum

end

function example()

for i=1,9 do
number1[i]=math.random(0,1)
number2[i]=math.random(0,1)
end
sum = Add(number1,number2)

end

example()

function draw()
background(40, 40, 50)

font(“AmericanTypewriter”)
fontSize(50)
for j=1,10 do
text(number1[j],500-40*j,800)
text(“+”, 50,750)
text(number2[j],500-40*j,750)
text(“=”,50,650)
text(sum[j],500-40*j,650)
end
end

Spel4: Elementära Funktioner: polynom, exp, log, sin…

8061786-Stacks-of-coins-showing-exponential-growth-isolated-over-white-Conceptual-for-profit-financial-growt-Stock-Photo                  Exponentiell tillväxt: antalet mynt dubblas från en hög till nästa hög.

Jämför med Calculus1 på App Store.

Uppgift 1: Skriv datorprogram för konstruktion av linjär hastighet v och kvadratisk position x genom iteration av

  • x = x + v*dt
  • v=v+a*dt

med a=1, och plotta på skärmen. Notera att iterationen kan skrivas dv/dt=a, dx/dt=v.

Uppgift 2: Skriv datorprogram för konstruktion av exponentialfunktionen genom iteration av

  • x = x + v*dt

med v=x, och plotta på skärmen. Notera att iterationen kan skrivas dx/dt=x. Reflektera över dt=dx/x.

Uppgift 3: Skriv datorprogram för konstruktion av polynomfunktioner  genom iteration av

  • x[n] = x[n] + x[n-1]*dt

för n=2,…,10, med x[1]=1, och plotta på skärmen. Notera att iterationen kan skrivas dx[n]/dt = x[n-1].

Uppgift 4: Skriv datorprogram för konstruktion av trigonometriska funktioner genom iteration av

  • x = x + y*dt
  • y = y – x*dt

och plotta på skärmen. Notera att dx/dt=y och dy/dt=-x.

Uppgift 5: Skriv program för datorspel som bygger på elementära funktioner.