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 och ger därigenom en sammanhållen utbildning över alla nivåer.

En översikt av olika aspekter av Matematik-IT ges under huvudmenyn. 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.

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)
text(n,300,500)
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, vilket ge ge 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 mycketvå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<50 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.x<10 then
vel.x=-vel.x
end
if pos.y>1000 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<140 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<R-5 then
f[i]=f[i]+E*(xm[i]-xm[j])
end
end
if x[i].y<250 then
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<2 then
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.

Spel6: Flight Simulator Easy

Boeing737_flightsimulator_129                                                  Boeing 737 flight simulator.

Vi programmerar en första flight simulator där flygplanet styrs av via horisontell kraft)  Fx och vertikal kraft Fy som styrs via två parameter-slides på skärmen genom uppdatering av Newton’s rörelseekvationer

  • x = x + vx*dt
  • y = y + vy*dt
  • vx = vx + ax*dt
  • vy = vy + ay*dt
  • ax = Fx
  • ay = Fy.

Template 1: (Följ pilotens ändring kraften från jetmotorn)

function setup()

parameter.number(“vx”, -100, 100, 0)
parameter.number(“vy”, -100, 100, 0)
parameter.number(“Fx”, -100, 100, 0)
parameter.number(“Fy”, -100, 100, 0)
dt = 0.01
x=WIDTH/2
y=HEIGHT/2
ax=0
ay=0

end

function draw()

background(40, 40, 50)

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

sprite(“SpaceCute:Beetle Ship”,x,y,50)

stroke(251, 255, 0, 255)
strokeWidth(5)
strokeWidth(10)
line(x,y,x-ax,y-ay)
end

function touched(touch)

if touch.state == ENDED then
x = touch.x
y= touch.y
end

end