cogburn
May 24, 2012
**Rockets**
There are lots of programs, including many commercial programs, that will predict the maximum altitude of a model rocket. There are some inexpensive altimeters out there also that can give altitude results when placed inside your model during flight. Are they trustworthy? I wasn't sure so I had an idea to see if I could come up with a LB program that would predict accurately (within 5%) the height of a model rocket. Of course this program is more involved than the others presented on this page so I needed some help. I got a great deal of help from Mr. John Fisher who lives in Merry Old England. I had the ideas of what I wanted to do and he developed the code that would get me there. I give all credit to him.
I knew published data was available for model rocket thrust curves. I was not sure how accurate this data was as I was concerned that companies that make the motors might tend to exaggerate the numbers. I began a series of tests using an analog to digital interface and a force probe to measure force and time data and integrated these curves to obtain impulse data for various rocket motors. I have to say that the published data is very close to my measurements. The first bit of code presented here represents a rocket flight simulation for an Estes A-8 rocket motor pushing a 37 gram rocket. This includes a parachute deployment and subsequent terminal velocity to ground.
[[code format="lb"]]
'EstesA8.bas
'This program uses the thrust data to draw a position/time, velocity/time, and acceleration/time
'graph for a rocket of mass 37 grams and an A-8 Estes engine.
nomainwin
UpperLeftX = 10
UpperLeftY = 10
WindowWidth = 1100
WindowHeight = 700
graphicbox #w.g, 10, 10, 1010, 610
textbox #w.t, 10, 620, 610, 30
open "Rocket vertical flight simulation" for window as #w
#w, "trapclose [quit]"
#w.g, "size 2 ; goto 5 505 ; down ; goto 950 505"
RocketBodyMass = 0.030 ' fixed mass of rocket body
RocketFuelMass = 0.0033 ' 3.3 gram of fuel
EngineCasingMass = 0.0164 ' 17gram casing & nozzle.
burntime = .7 ' burn lasts for this time
burnrate = RocketFuelMass / burntime ' assume linear reaction rate
Area = 0.0004 ' cross sectional area of rocket
Gravity = 9.81 ' acceleration of gravity
AirDensity = 1.2 ' density of air
DragCoefficient = 0.75 ' allows for the streamlined shape
y = 0 ' initial vertical height
vy = 0 ' initial vertical displacement
time = 0 ' initial time
deltat = 0.001 ' time interval between updates
acceleration = 0
hasTakenOff = 0
global RocketBodyMass, RocketFuelMass, EngineCasingMass, burntime, burnrate
global Area, Gravity, DragCoefficient, y, vy, time, deltat , Gravity, AirDensity
[here]
force =thrust( time) - Gravity * mass( time) - drag( time)
if hasTakenOff <>0 then acceleration =force / mass( time) else acceleration =0
if thrust( time) >( mass( time) *Gravity) then hasTakenOff =1
vy = vy + acceleration *deltat
#w.g, "color green ; set "; 5 +600 *time /10; " "; 505 -500 *vy /250
y = y + vy *deltat
time = time + deltat
#w.t, " Time = "; using( "##.###", time); " force = "; using( "##.###", force);_
" acceleration = "; using( "#####.##", acceleration); " velocity = "; using( "###.##", vy);_
" and height = "; using("#######.##", y)
#w.g, "color black ; set "; 5 +600 *time /10; " "; 505 -500 *y /120
scan
if y <500 and y >-.1 then goto [here]
wait
' _____________________________________________________________________
function thrust( tt)
th =0
if tt <=.7 then th = -0.0229 *tt +2.362
if tt <=0.395 then th = -10.9 *tt +6.662
if tt <=0.27 then th = -151.3 *tt +44.54
if tt <=0.225 then th = 53.49 *tt -2.049
if tt <0.035 then th = 0.0
' if tt <=1.6 then th =3
'if tt <=0.3 then th=10 -80 *( tt -0.2)
' if tt <=0.2 then th =50 *tt
#w.g, "color red ; set "; 5 +600 *time /10; " "; 505 -500 *th /50
thrust =th
end function
' _____________________________________________________________________
function mass( tt)
select case tt
case tt <=1.6 ' it burns 0.0035kg in 0.7s.
m =RocketBodyMass +EngineCasingMass + RocketFuelMass - tt *burnrate
case else
m =RocketBodyMass +EngineCasingMass
end select
mass =m
end function
'____________________________________________________________________________
function drag( tt)
if vy >0 then drag =0.5 *AirDensity*vy^2 *DragCoefficient *Area else drag = -0.5 *AirDensity *vy^2 *DragCoefficient *Area
if tt >6 then drag =-0.5 *AirDensity *vy^2 *DragCoefficient *0.05
end function
[quit]
close #w
end
[[code]]