Sunday, March 15, 2026

TI-84 Plus CE Python: Traceable Plots in Python

TI-84 Plus CE Python: Traceable Plots in Python


These two scripts are an easy way on how to create plots that are traceable. A traceable plot allows the user to trace along a scatter plot or functional plot by using the right and left arrow keys, just like if you made a plot in a graphing calculators’ graph mode.



The two scripts presented are:



TIRNDPLT: makes a scatter plot of ten random points between 0 and 1. The x axis is the plot marker while the y axis is the random point.

TIFXPLT: makes a plot of a single function y(x). Radians mode as assumed and the plot is made of 50 points. You specify the minimum and maximum values of x. Radians mode is assumed and the math module has imported, allowing for scientific functions. A caveat is to plot a function where it is defined for all of the domain given. For instance, for sqrt(x), no negative values should be included in the domain [xmin, xmax].



The two scripts can be downloaded here:

https://drive.google.com/file/d/1D3oB7Vrt9cd1e-wXrEkhZbr8VJ_7V4qB/view?usp=sharing



However I am going to list the code because there are things to be pointed out.



TIRNDPLT



Code:

# TI-84+: Traceable Plot

# Edward Shore 2026-02-20
# tirndplt.py

# Plot ten random elements

# import modules
from math import *
from random import *
from ti_system import *
# plot module is imported differently
import ti_plotlib as plt


# build a random list
x=[i for i in range(1,11)]
y=[round(random(),4) for i in range(1,11)]

# set up the key
# left (2) and right (1) is the trace, enter to exit (5)
k=0

# set the pointer
p=0

# constant elements
# clear the screen
plt.cls()
# set window to allow room for text
plt.window(0,11,-0.5,1.5)
plt.axes("axes")

# plot gray grid
plt.color(192,192,192)
plt.grid(1,0.1)

# main loop, faster?, redraw only replaceable elements
while k!=5:
  # scatter plot, filled dot default
  plt.color(0,0,0)
  plt.scatter(x,y)
  # text at line 1
  plt.text_at(1,"<-, ->, press enter to exit","left",1)
  # string at line 12
  s="x = {0:.0f}, y = {1:.4f}".format(x[p],y[p])
  plt.text_at(12,s,"left",1)
  # plot pointer with cross, blue
  plt.color(0,0,255)
  plt.plot(x[p],y[p],"x")
  # get key
  k=wait_key()
  # left and right keys
  if k==2:
    # clear
    plt.color(255,255,255)
    plt.plot(x[p],y[p],"x")
    # replace
    plt.color(0,0,0)
    plt.plot(x[p],y[p])
    p=(p-1)%10
  elif k==1:
    plt.color(255,255,255)
    plt.plot(x[p],y[p],"x")
    plt.color(0,0,0)
    plt.plot(x[p],y[p])
    p=(p+1)%10

# show draw at the end
plt.text_at(1,"DONE","left",1)
plt.show_plot()


Notes:


1. Modules used: math, random, ti_system, and ti_plotlib. The calling of math and random modules allow the user to include math and random functions. The ti_system has the command wait_key(), which calls for the user to press a key, and returns a specific code value when a key is pressed. The module ti_plotlib is for the specific graphics commands.

2. The y minimum and maximum values for the plot have a padding of 2 to allow room for the top and bottom lines which will contain information. The top line will give instructions for the keys: ← to trace left, → to trace right, and pressing the [ enter ] exits the program.

3. The script has plots in two sections. Outside the loop are elements that will stay permanent: the window, the axis, and the scatter plot. Inside the loop will be the pointer because it changes.

4. Every time an arrow key is processed, the pointer first must be “erased” off the previous position, then move to the next. The pointer is in blue. The variable p is used for the pointer and will take the value between 0 and 9.

5. In Python, the percent symbol is used as a modulus function. So, the expression (p-1)%10 means (p – 1) mod 10. Similarly, (p+1)%10 means (p + 1) mod 10. This is what keeps p in the range of [0, 9]. p is an integer.

6. The use of the format is required to make reading the coordinates readable.

7. Any script using ti_plotlib must have a plt.show_plot() command, at least at the end. It’s primary purpose is to show the final picture and freeze the screen in graphics mode.


TIFXPLT.py




Code:

# TI-84+: Traceable Plot
# Edward Shore 2026-02-22
# tifxplt.py


# Plot a traceable function

# import modules
from math import *
from random import *
from ti_system import *
# plot module is imported differently
import ti_plotlib as plt

# build f(x)
fx=input("y(x)? ")
xmin=eval(input("xmin? "))
xmax=eval(input("xmax? "))
chgx=(xmax-xmin)/50

xl=[]
yl=[]

x=xmin
while x<=xmax:
  y=eval(fx)
  xl.append(x)
  yl.append(y)
  x+=chgx

ymin=min(yl)-2
ymax=max(yl)+2

# set up the key
# left (2) and right (1) is the trace, enter to exit (5)
k=0

# set the pointer
p=0

# constant elements
# clear the screen
plt.cls()
# set window to allow room for text
plt.window(xmin,xmax,ymin,ymax)
plt.color(16,16,16)
plt.axes("on")

plt.color(0,0,0)
plt.plot(xl,yl,".")

# main loop, faster?, redraw only replaceable elements
while k!=5:
  # scatter plot, filled dot default
  # text at line 1
  plt.text_at(1,"<-, ->, press enter to exit","left",1)
  # string at line 12
  s="x = {0:.1f}, y = {1:.4f}".format(xl[p],yl[p])
  plt.text_at(12,s,"left",1)
  # plot pointer with cross, blue
  plt.color(0,0,255)
  plt.plot(xl[p],yl[p],"x")
  # get key
  k=wait_key()
  # left and right keys
  if k==2:
    # clear
    plt.color(255,255,255)
    plt.plot(xl[p],yl[p],"x")
    # replace
    plt.color(0,0,0)
    plt.plot(xl[p],yl[p])
    p=(p-1)%50
  elif k==1:
    plt.color(255,255,255)
    plt.plot(xl[p],yl[p],"x")
    plt.color(0,0,0)
    plt.plot(xl[p],yl[p])
    p=(p+1)%50

# show draw at the end
plt.text_at(1,"DONE","left",1)
plt.show_plot()



Notes:

1. Modules used: math, random, ti_system, and ti_plotlib. The calling of math and random modules allow the user to include math and random functions. The ti_system has the command wait_key(), which calls for the user to press a key, and returns a specific code value when a key is pressed. The module ti_plotlib is for the specific graphics commands.

2. The y minimum and maximum values for the plot have a padding of 2 to allow room for the top and bottom lines which will contain information. The top line will give instructions for the keys: ← to trace left, → to trace right, and pressing the [ enter ] exits the program.

3. The script has plots in two sections. Outside the loop are elements that will stay permanent: the window, the axis, and the plot of the function. Inside the loop will be the pointer because it changes.

4. Every time an arrow key is processed, the pointer first must be “erased” off the previous position, then move to the next. The pointer is in blue. The variable p is used for the pointer and will take the value between 0 and 49.

5. In Python, the percent symbol is used as a modulus function. So, the expression (p-1)%50 means (p – 1) mod 50. Similarly, (p+1)%50 means (p + 1) mod 50. This is what keeps p in the range of [0, 49]. p is an integer.

6. The use of the format is required to make reading the coordinates readable.

7. Any script using ti_plotlib must have a plt.show_plot() command, at least at the end. It’s primary purpose is to show the final picture and freeze the screen in graphics mode.



I hope you enjoy these programs as I did making them,



Eddie


All original content copyright, © 2011-2026. Edward Shore. Unauthorized use and/or unauthorized distribution for commercial purposes without express and written permission from the author is strictly prohibited. This blog entry may be distributed for noncommercial purposes, provided that full credit is given to the author.

Saturday, March 14, 2026

Commodore P50 Programs

Commodore P50 Programs



A collection of programs from the vintage Commodore P50 from 1978. Check out my review from last April: https://edspi31415.blogspot.com/2025/04/spotlight-commodore-p50.html.



Air Density


This equation calculates air density, in m/kg³ given the temperature of Celsius. The standard equations are used.


ρ = p ÷ (R * (T°C + 273.15)) ≈ 359.98728 ÷ (T°C + 273.15)

p = 101,325 Pa (absolute pressure)

R = 287.05 J/(kg * K) (specific gas constant)

p/R = 101325 / 287.05 ≈ 359.98728



With limited storage space of 24 steps, the equation had to be simplified.

(The step numbers are for reference, since steps cannot be reviewed on the P50.)



Start with temperature in the display. Press GOTO 00, R/S. The air density is displayed.

00 +

01 2

02 7

03 3

04 .

05 1

06 5

07 =

08 1/x

09 ×

10 3

11 5

12 2

13 .

14 9

15 8

16 7

17 2

18 8

19 =

20 r/s

21 GOTO

22 00


Examples:


Example 1: Input: 0°C, Output: 1.2922837 m/kg³

Example 2: Input: 15°C, Output: 1.2250123 m/kg³

Example 3: Input: 37.8°C, Output: 1.1351898 m/kg³



Speed of Sound



This equation calculates the speed of sound (in dry air) in m/s given the temperature of Celsius.

c_air ≈ 20.05 * √(273.15 + T°C)



Start with temperature in the display. Press GOTO 00, R/S. The speed of air is displayed.

00 +

01 2

02 7

03 3

04 .

05 1

06 5

07 =

08 √x

09 ×

10 2

11 0

12 .

13 0

14 5

15 =

16 r/s

17 GOTO

18 00


Examples:

Example 1: Input: 0°C, Output: 331.37137 m/s

Example 2: Input: 20°C, Output: 343.28856 m/s

Example 3: Input: 37.8°C, Output: 353.55718 m/s



Decibel Gain/Loss from Power Ratio



dB = 10 * log(power output ÷ power input)



Start with power output. Press GOTO 00, R/S. Then enter power input, press R/S. The decibel gain/loss is displayed.


00 ÷

01 r/s

02 =

03 log

04 ×

05 1

06 0

07 =

08 r/s

09 GOTO

10 00


Examples:

Example 1: power output = 25 W, power input = 5 W

Input: 25 GOTO 00 r/s, 5 r/s. Output: 6.9897 dB

Example 2: power output = 30 W, power input = 42 W

Input: 30 GOTO 00 r/s, 42 r/s. Output: -1.4612804 dB

Example 3: power output = 3 W, power input = 1 W

Input: 3 GOTO 00 r/s, 1 r/s. Output: 4.7712125 dB



“Radio Mathematics” ARRL. Retrieved November 1, 2025. https://www.arrl.org/files/file/ARRL%20Handbook%20Supplemental%20Files/2023%20Edition/Radio%20Supplement.pdf



Plus or Minus Operation



This program calculates a ± b (a + b and a – b). The program leaves a – b in the display and a + b in memory, which can be toggled by the memory exchange [ x ←→ M ] key.


The program uses the memory exchange key. Enter b (the term to both be added and subtracted first), then a.


00 STO

01 r/s

02 +

03 RCL

04 =

05 r/s

06 x ←→ M

07 ×

08 2

09 =

10 ±

11 +

12 RCL

13 =

14 r/s

15 GTO

16 00


Examples:

Remember, enter the second number (b) first.

Example 1: 5 ± 9

Input: 9 GOTO 00 r/s, 5, r/s. Output: 14 r/s -4

Example 2: 36 ± 20

Input: 20 GOTO 00 r/s, 36 r/s. Output: 56 r/s 16

Example 3: 310 ± 240

Input: 240 GOTO 00 r/s, 310 r/s. Output: 550 r/s 70



Combination



This is the combination function:



nCr = n! ÷ (r! * (n – r)!)



Due to only having one memory register and the factorial function does not distribute, one of the arguments (r) will need to be entered twice.



Input: n GOTO 00 r/s, r r/s, r r/s (again). Output: nCr.



00 STO

01 -

02 r/s

03 =

04 n!

05 1/x

06 ×

07 RCL

08 n!

09 ÷

10 r/s

11 n!

12 =

13 r/s

14 GOTO

15 00



Examples:

Example 1: 52 C 5

Input: 52 GOTO 00 r/s, 5 r/s, 5 r/s. Output: 2,598,960

Example 2: 34 C 12

Input: 34 GOTO 00 r/s, 12, r/s, 12 r/s. Output: 5.4835404 E 08

Example 3: 10 C 4

Input: 10 GOTO 00 r/s, 4 r/s, 4 r/s. Output: 210


Eddie


All original content copyright, © 2011-2026. Edward Shore. Unauthorized use and/or unauthorized distribution for commercial purposes without express and written permission from the author is strictly prohibited. This blog entry may be distributed for noncommercial purposes, provided that full credit is given to the author.


Saturday, March 7, 2026

TI-84 Plus CE and Swiss Micros DM32: Blood Alcohol Level

TI-84 Plus CE and Swiss Micros DM32: Blood Alcohol Level


Just in time for the upcoming St. Patrick’s Day in a few weeks…


Introduction


The blood alcohol level is calculated by the following approximation by Walter L. Gregory Jr. using data from the CRC Handbook of Tables for Applied Engineering (1970). The program is based off the HP-97/HP-67 program listed in their Medical Practitioner pac (1979). (see source):


BAC ≈ ((ALC * OZ) ÷ 50 – T) * (3.751 ÷ WT)


ALC: Percentage of alcohol consumed. Enter as a whole number. For example, if the drink has 40% alcohol, ALC = 40. If the alcohol is measured in proof, divide the proof by 2.

OZ: The total amount of ounces consumed within the period of time. For example: six 12-oz beers total 72 ounces.

WT: The weight of the person in pounds.

T: The number of hours drinks are consumed. If T > 1, then T = hours – 1. Otherwise T = 0.


If calculated BAC is below 0, then set BAC = 0.


TI-84 Program CE: ALCOHOL

Type: TI Basic


Disp “BLOOD ALCOHOL (US)”

Input “WEIGHT (LB)? “, W

Input “OUNCES? “, O

Input “PERCENTAGE? “, P

Input “HOURS OF DRINKING? “, H

If H≤1 : Then : 0 → H

Else : H – 1 → H : End

(P * O / 50 – H) * 3.751 / W → A

Disp “BLOOD ALCOHOL: “, A


Swiss Micros DM32 (HP 32SII): ALCOHOL


A01 LBL A

A02 INPUT W

A03 INPUT O

A04 INPUT P

A05 INPUT H

A06 RCL H

A07 1

A08 x≥y?

A09 SF 1

A10 STO- H

A11 FS? 1

A12 Cl x

A13 FS? 1

A14 STO H

A15 CF 1

A16 RCL P

A17 RCL× O

A18 50

A19 ÷

A20 RCL- H

A21 3.751

A22 RCL÷ W

A23 ×

A24 x<0?

A25 Cl x

A26 RTN


Notes:


A07 1, A08 x≥y?, A09 SF 1: If hours > 1, set Flag 1. Using flags can sometimes eliminates the need for additional labels.


A24 x<0?, A25 Cl x: If the number in the display (x stack) negative, change it to zero.


Examples


Example 1:

Inputs:

Weight: W = 150 lbs

Ounces: O = 4 oz

Percentage: P = 20%

Hours: H = 0.5 hours (T = 0)

Output: 0.0400


Example 2:

Inputs:

Weight: W = 180 lbs

Ounces: O = 45 oz

Percentage: P = 50%

Hours: H = 2.5 hours (T = 1.5)

Output: 0.9065

(typo:  Thank you, Pedro Leiva)


Be sure to check your local laws for legal blood alcohol levels. This program is not suited to be evidence in legal matters.


One thing remains: DON’T DRINK AND DRIVE



Source


Hewlett Packard. HP-67/HP-97. User’s Library Solutions: Medical Practitioner. Corvallis, OR. April 1979. pp. 9-12



Eddie


All original content copyright, © 2011-2026. Edward Shore. Unauthorized use and/or unauthorized distribution for commercial purposes without express and written permission from the author is strictly prohibited. This blog entry may be distributed for noncommercial purposes, provided that full credit is given to the author.

Saturday, February 28, 2026

TI-84 Plus CE: Logistic Map

TI-84 Plus CE: Logistic Map


It feels like forever since I with the TI-84 Plus CE.


Introduction


The program LOGISTIC plots the sequence


x = r * x * (1 – x)


where x is initially in the interval (0, 1) and r is a parameter. The sequence traces out the path of recursion.


Depending on the value of r, the sequence can eventually stabilize to a single point, fluctuate then stabilize, eventually bounce between two stable points, or going into the chaos. The higher the r, chance of the latter two possibilities increase. Typically, for any r < 3, the sequence will most likely stabilize.



TI-84 Plus CE Program: LOGISTIC.8xp


Type: TI-Basic Program


ClrHome

Disp “LOGISTIC MAP”

Disp “X1=R*X0*(1-X0)”

Seq

FnOff

Menu(“LAMBDA (R)”, “ENTER”, 1, “RANDOM”, 2)

Lbl 1

Input “0<R≤4: “, R

Goto A

Lbl 2

randInt(1,80) / 20 → R

Pause R

Goto A

Lbl A

Menu(“U(1)=”, ”ENTER”, 3, “RANDOM”, 4)

Lbl 3

Input “U(1)? “, U

Goto B

Lbl 4

rand → U

Pause U

Goto B

Lbl B

{U} → u(nMin)

SEQ(n+1)

“R*u(n)*(1-u(n))” → u

FnOn 1

1 → nMin

50 → nMax

0 → Ymin

1 → Ymax

0 → Xmin

50 → Xmax

DispGraph



Notes:


The Time setting is assumed: x-axis = n, y-axis = u__n


nMin: Sets the counter and the index of the first argument. Typically the counter starts with 0 or 1. Keystrokes: [ vars ], 1. Window, scroll to U/V/W, 4. nMin.


Seq: Sets Sequence mode.


I use R for λ since the TI-84 does not have Greek characters (except for π and σ).


randInt(1,80) / 20 → R: Selects random values from 0.05 and 4 with a tick mark of 0.05.


u(nMin): Store the initial conditions. The conditions are entered as a list, even there is only one initial condition. Keystrokes: [ vars ], 1. Window, scroll to U/V/W, 1. u(nMin)


SEQ(n+1): In the program editor, I had to select this from the catalog. It is listed under “SEQ(n+1) Type”. This allows for the recurring sequence to be in the format u(n+1) = f(u(n),n).

R*u(n)*(1-u(n))” → u: The u is type from the keyboard: [ 2nd ] [ 7 ].

FnOn 1: Turns the sequence u(n) on.



Examples




Left: r = 3.67, initial point = 0.2. This looks like total chaos as n grows.


Right: r = 3.1, initial point = 0.5. This sequence does not converge to a single value, but eventually provides a bifurcation between two points.


Caution: If r is too high, even if the u(1) is with in the interval [0, 1], the sequence can “escape” and an overflow can occur. I don’t recommend an r higher than 4.


Source


“Logistic map”. Wikipedia https://en.wikipedia.org/wiki/Logistic_map Retrieved October 20, 2025.



Eddie


All original content copyright, © 2011-2026. Edward Shore. Unauthorized use and/or unauthorized distribution for commercial purposes without express and written permission from the author is strictly prohibited. This blog entry may be distributed for noncommercial purposes, provided that full credit is given to the author.

Saturday, February 21, 2026

New Background

 The blog could use change in scenery:




Eddie


All original content copyright, © 2011-2026. Edward Shore. Unauthorized use and/or unauthorized distribution for commercial purposes without express and written permission from the author is strictly prohibited. This blog entry may be distributed for noncommercial purposes, provided that full credit is given to the author.


HP 12C: Quickly Approximating Arc Tangent

HP 12C: Quickly Approximating Arc Tangent



The HP 12C does not have trigonometric functions. Various sources list on how such functions are be approximated with varying degrees of accuracy. Today’s blog will feature a quick approximation, using only a 14 step function for the arc tangent (inverse tangent) function.


Formula Used in Approximation

(see Source)


arctan(x) ≈ x ÷ (1 + 0.28125 * x²) = x ÷ (1 + 9 * x² ÷ 32)


Best for -1 ≤ x ≤ 1


Maximum absolute error of 0.0049 radians, approximately 0.28°. The error gets worse outside these ranges. The program rounds the result to 2 decimal places. The angle is returned in radians.


HP 12C Program: Arc-tangent Approximations


FIX 2

01

42, 2

Program start

ENTER

02

36


ENTER

03

36


×

04

20


9

05

9


×

06

20


3

07

3


2

08

2


÷

09

10


1

10

1


+

11

40


÷

12

10


RND

13

42, 14

Round result to 2 decimal places

GTO 00

14

43, 33, 00

Program end

Examples


x = 0.1. Result: 0.10

x = 0.3. Result: 0.29

x = 0.5. Result: 0.47


Source


Sreeraman Rajan, Sichun Wang, Rober Inkol, and Alain Joyal. “Efficient Approximations for the Arctangent Function” IEEE Signal Processing Magazine. May 2006.


Eddie


All original content copyright, © 2011-2026. Edward Shore. Unauthorized use and/or unauthorized distribution for commercial purposes without express and written permission from the author is strictly prohibited. This blog entry may be distributed for noncommercial purposes, provided that full credit is given to the author.



TI-84 Plus CE Python: Traceable Plots in Python

TI-84 Plus CE Python: Traceable Plots in Python These two scripts are an easy way on how to create plots that are traceable. A tracea...