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

Spel7: Planetsystem

newton-kimdir                                      Om Newton och Newtons ekvationer.

Vi skriver datorprogram för lösning av Newton’s rörelseekvationer, med användning av 2d vektorn vec2() och tabeller för position, hastighet och acceleration

  • pos = pos +hast*dt,
  • hast = vel + acc*dt
  • acc = kraft/massa

där kraften mellan två kroppar av massa1 och massa2 med position pos1 och pos2 med avstånd r, är given av

  • kraft = (pos1 -pos2)*massa1*massa2/r^3.

Vi simulerar olika planetsystem med olika startvärden för position och hastighet  och då speciellt vårt eget med sol-jord-måne + övriga planeter. Jfr med detta. Jämför med Mechanics1 på App Store.

 

Template 1: (Följ planeters rörelse under ömsesidig gravitation och här i 3d)

function setup()
I=20

pos = {}
vel = {}
acc= {}
force = {}
m={}
for i=1,I do
pos[i] = vec2(0,0)
vel[i] = vec2(0,0)
acc[i] = vec2(0,0)
force[i] = vec2(0,0)
m[i]= 1/i
end

print(“Planet”)
print(“force~1/r^2”)
print(“acc=force/mass”)
print(“vel=vel+acc*dt”)
print(“pos=pos+vel*dt”)
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

Spel8: Kvadratroten ur 2

sqrt2

Försök beräkna kvadratroten ur 2, noterad som \sqrt{2}, dvs försök bestämma ett (positivt) tal x  sådant att

  • x*x=2.

Prova:

  • x=1 ger x*x=1 < 2, dvs x=1 är för litet
  • x=2 ger x*x = 4 > 2, dvs x=2 är för stort
  • x=1.5 ger x*x=2.25, dvs x=2.25 är för stort
  • x=1.4 ger x*x=1.96, dvs x=1.4 är för litet,
  • x=1.45 ger x*x=2.1025, dvs 1.45 är för stort,
  • fortsätt att prova med hjälp av miniräknare och bestäm fler decimaler!

Skriv sedan ett datorprogram som gör denna provning och bestäm så många decimaler som möjligt.

Prova sedan med iterationen x = 1/x+ x/2 med start x=1.  Observera att x*x=2 kan skrivas som 2*x*x = 2+x*x, dvs efter division med 2*x, som  x=1/x +x/2.

Utvidga till lösning av ekvationen x*x= a för godtyckligt a>0, tex via iterationen

  • x=a/(2*x) +x/2.

Utvidga till lösning av x^n=a för n=3,4,5,…, tex via iterationen

  • x=(n-1)*x/n+a/(n*x^(n-1)).

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

Spel9: Derivata och Integral

midpointrule

Programmera tidsstegningen

  • x=x+v*dt eller dx = v*dt

för positionen x med olika val av hastigheten v och tidssteget dt.  Börja med v=1 och dt = 1 och plotta x på skärmen. Välj sedan v = t, v = t^2, v = t^3 osv. Jämför med Möte 4.

Notera att v*dt kan tolkas som ytan av en rektangel med bas dt och höjd v* och att därför x kan tolkas som en summa av rektangelytor som tillsammans bildar ytan under hastighetskurvan.

Notera att tidsstegningen dx = v*dt kan skrivas dx/dt = v där dx/dt kallas derivatan av x med avseende på t, dvs

  • derivatan av positionen med avseende på tiden är lika med hastigheten.

Omvänt säger man att

  • Positionen x är integralen av hastigheten v om dx/dt = v.

Tidsstegningen dv =a*dt med v hastighet och a acceleration kan alltså uttryckas på följande sätt:

  • derivatan av hastigheten med avseende på tiden är lika med accelerationen
  • hastigheten är integralen av accelerationen.

Derivatan dx/dt anger hur snabbt positionen ändras (dx) med ändring av tiden (dt), vilket ju är hastigheten v=dx/dt, och dv/dt anger hur snabbt hastigheten ändras (dv) med tiden (dt), vilket är accelerationen a=dv/dt.

Notera att om dx = v*dt, eller dx/dt = v, så gäller att

  • positionen x är integralen av derivatan dx/dt av x
  • hastigheten v är derivatan av integralen x av v.

Jämför med:

  • barnet V är avkomma (barn) till föräldrarna X
  • föräldrarna X är upphov (föräldrar) till barnet V
  • X = upphov till avkomma till  X
  • V = avkomma till upphov  till V.

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

Template 1: (Följ tidsstegningen för dx=vdt med v=t,  för dt=1 och för dt=0.2)

function setup()

x = 0
v = 0
dt = 1
n=0
print(“Touch för att tidsstega dx=vdt med v=t”)

end

function draw()

fill(255,0,0,0,255)
rect(n*dt*20,200,20*dt,v*5)
ellipse(n*dt*20,200+x*5,10)
fill(0,255,0,255)
ellipse(n*dt*20, 200+v*5,10)
end

function touched(touch)

n=n+1
v=n*dt
x=x+v*dt

end