## Introduction

gold Here is some eTCL starter code for probability and the exponential density function for modeling product lifetimes. The impetus for these calculations was checking product lifetimes in some lightbulbs. Most of the testcases involve replicas or models, using assumptions and rules of thumb.

## Testcases

In planning any software, it is advisable to gather a number of testcases to check the results of the program. Additional significant figures are used to check the eTCL calculator, not to infer the accuracy of inputs and product reports. The product lifetime for the testcases was greater than 750 hours and the exponential coefficient was 1/750, 0.00133, or rounded up to even significant figures, 0.0014. Using 0.0014 as the exponential density coefficient, the following three testcases were run.

1) The probability for product lifetime up to 500 hours was 0.5034 in the eTCL calculator. The hand calculator returned 1.-exp({-0.0014*500.}),0.5034146. The probability for product lifetime of the interval between 1000 and 1500 hours was 0.1241 from eTCL. The hand calculator returned (1.-exp({* -0.0014 1500. })) -(1.-exp({* -0.0014 1000. })), 0.12414050.

2) The probability for product lifetime up to 1000 hours was 0.7534 in the eTCL calculator. The hand calculator returned 1.-exp({-0.0014*1000.}), 0.7534030. The probability for product lifetime of the interval between 1200 and 1500 hours was 0.06391 from eTCL. The hand calculator returned (1.-exp({* -0.0014 1500. })) -(1.-exp({* -0.0014 1200. })), 0.06391750.

3) The probability for product lifetime up to 1200 hours was 0.8136 in the eTCL calculator. The hand calculator returned 1.-exp({-0.0014*1200.}), 0.8136260. The probability for product lifetime of the interval between 1200 and 2000 hours was 0.0616 from eTCL. The hand calculator returned (1.-exp({* -0.0014 2000. })) -(1.-exp({* -0.0014 1200. })), 0.061646360. The eTCL calculator is working well in the expected operating range.

Using the three testcases, another way to check the internal consistency is to use similar time intervals. For example, enter time1=500 hours, time2=0.000001 hours, and time3=500 hours. The result for the first interval between zero and 500 hours is 0.5034146962085905 and the second interval between 0.00001 and 500 hours is 0.5034146948085905, showing agreement to 3 significant figures. Similar intervals for zero/0.000001 to 1000 shows 0.7534030360583935 and 0.7534030346583935 and for zero/0.000001 to 1200 shows 0.81362602396059 and 0.81362602256059. Since the lower limit, 1E-6 hours only approximates zero, differences between interval evaluations can be expected at 6 decimal places and beyond. For another internal consistency check, since the area of the exponential density function is equal to unity between zero and infinity in the plus direction, the eTCL calculator returns ~1 for large intervals of time (time1>>10000.). For example, enter time1=10000 hours, time2=0.000001 hours, and time3=10000 hours and the result is 0.99999916, approaching unity.

The eTCL calculator used an exponential density coefficient, which can be converted from most incandescent lightbulb packaging or specs. The original formula was mean or average, expected product lifetime equals 1/coefficient. Rearranging terms, the exponential coefficient equals 1/lifetime. A solution using the exponential density coefficient has to keep the time units consistent, whether hours, minutes, or years. One standard 60-watt light bulb cited 1.4 years use for 3 hours a day, converting years*hours*days_in_year, 1.4*365*3, 1533 hours. The suggested coefficient was 1/(1533 hours) or 0.00065 for the standard bulb. One extralife 60-watt light bulb cited 1.8 years use for 3 hours a day, converting years*hours*days_in_year, 1.8*365*3, 1972 hours. The suggested coefficient was 1/(1972 hours) or 0.00050 for the extralife bulb. Using round numbers, compare the standard bulb to the extralife bulb, both at 1500 hours use. Solve {1500,750,1500,0.00065} in the eTCL calculator for the standard bulb and solve {1500,750,1500,0.0005} for the extralife bulb. The probability for the standard bulb lasting longer than 1500 hours was 0.397. The probability for the extralife bulb lasting longer than 1500 hours was 0.472. Considering the halflife period of the standard bulb from 0.0001 to 750 hours (1500/2), the probability for the standard bulb was 0.386 and the extralife bulb was 0.315 in the halflife interval. There was lower probability of the extralife bulb expiring during the first 750 hours of life.

## Extended Uses for Calculator

A famous coffee shop has long lines in the morning and some reduced customers in midmorning. What is the probability that successive customers will arrive between 2 to 4 minutes and the probability that successive arrivals will be more than 10 minutes apart? Customer arrivals by the minute were were averaged {+ 2 2 1 2 2 1 1 2 2 5 2 2 5 10 3 15 10 12 2 10 11 5 10 12 2 } /25, 131 minutes/25 customers, 5.24 minutes. The exponential coefficient was 1/5.24, 0.190839. In the eTCL calculator, load time1(10), time2(2), time3(4), and coefficient(0.191). From the eTCL calculator, the probability that customers will arrive in the interval between 2 to 4 minutes is 0.2167 . The probability that successive customers will arrive more than 10 minutes apart is 0.148 . As a bonus finding from the eTCL calculator, the probability that successive customers will arrive between zero and 10 minutes (t1<10) is 0.851. Clearly, the bulk of the customers will arrive within 10 minutes apart.

A certain car tire was rated at 10000 or 1E4 kilometers. What is the probability the tire will last longer than 10000 kilometers? The exponential coefficient was 1/(1E4 kilometers), 1E-4, or 0.0001. The coefficient was found for kilometers distance (not time! ) and the corresponding interval limits for t1,t2, and t3 should be kilometers. The eTCL calculator will accept engineering notation as powers of 10, which is useful for large numbers. In the eTCL calculator, load t1(1E4), t2(1E-6), t3(1E4), and coefficient(1E-4). The probability that the tire will last more than 1E4 kilometers is 0.368. The loading used similar intervals, so 0.632 appeared twice in the display as solution up to t1 and the interval between t2 and t3. For check on solutions, the probabilities before t1 (0.632) and after t1 (0.368) should sum to unity, {+ 0.632 0.368 } = ? 1.0.

Continuing with the tire problem, the calculator can address duration of tire use. What is the probability the tire will last longer than 100 weeks? Suppose the driver travel averaged 100 km per week, then the tire upper limit was 10000 km /100 km per week or 100 weeks of driving. Now the exponential coefficient can be linked to time, the coefficient was 1/(100 weeks) or 0.01. In the eTCL calculator, load time1(100), time2(1E-6), time3(100), and coefficient(0.01). The probability that the tire will last more than 100 weeks is 0.368 from eTCL. The probability is the same number as before, but in a different units context. One sees different sales pitches for tires that last 10000 km or two years, (100 weeks /52 weeks per year), depending on average consumer driving.

## Procedures

For the eTCL calculator, the recommended procedure is push testcase and fill frame to initialize the display. Then change first three entries etc, and push solve. The coefficient for the exponential density function can be changed for different testcases. The calculations for the first interval up to time1 and the second interval between time2 and time3 are carried in separate tracks inside the eTCL program. Meaning, changing time1 will not effect the calculations for time2 and time3. Report allows copy and paste from console.

### Pseudocode and Equations

```  liters = [* volume_in_cubic_cm .001]
price? = raw materials + labor  +  profit
price? = raw materials + heat process
price? = raw materials + labor
average price per unit  = revenue  / units sold```

### Testcases Section

In planning any software, it is advisable to gather a number of testcases to check the results of the program. The math for the testcases can be checked by pasting statements in the TCL console. Aside from the TCL calculator display, when one presses the report button on the calculator, one will have console show access to the capacity functions (subroutines).

#### Testcase 1

table 1printed in tcl wiki format
quantity value comment, if any
testcase number:1
500.0 :up to hours =<t1 only
1000.0 :interval minimum hours =>t2
1500.0 :interval maximum hours =< t3
0.0014 : exponential density coefficient (optional)
0.503 : probability up to =<t1 only
0.496 :probability =>t1
0.124 :probability interval =>t2 to =<t3
1.0 :probability =<t1+=>t1 approx unity

#### Testcase 2

table 2printed in tcl wiki format
quantity value comment, if any
testcase number:2
1000.0 :up to hours =<t1 only
1200.0 :interval minimum hours =>t2
1500.0 :interval maximum hours =< t3
0.0014 : exponential density coefficient (optional)
0.753 : probability up to =<t1 only
0.246 :probability =>t1
0.063 :probability interval =>t2 to =<t3
1.0 :probability =<t1+=>t1 approx unity

#### Testcase 3

table 3printed in tcl wiki format
quantity value comment, if any
testcase number:3
1200.0 :up to hours =<t1 only
1500.0 :interval minimum hours =>t2
2000.0 :interval maximum hours =< t3
0.0014 : exponential density coefficient (optional)
0.813 : probability up to =<t1 only
0.186 :probability =>t1
0.0616 :probability interval =>t2 to =<t3
1.0 :probability =<t1+=>t1 approx unity

### Screenshots Section

#### figure 1. • Productivity

## Appendix Code

### appendix TCL programs and scripts

```
# pretty print from autoindent and ased editor
# Product lifetime exponential density calculator
# written on Windows XP on eTCL
# working under TCL version 8.5.6 and eTCL 1.0.1
# gold on TCL WIKI, 15oct2014
package require Tk
namespace path {::tcl::mathop ::tcl::mathfunc}
frame .frame -relief flat -bg aquamarine4
pack .frame -side top -fill y -anchor center
set names {{} {time up to hours =<t1:} }
lappend names {time interval hours =>t2:}
lappend names {time interval hours =<t3: }
lappend names {exponential density coefficient (optional) :}
lappend names {answers : probability =< t1 only:}
lappend names {probability => t1 only : }
lappend names {probability interval =>t2 to =<t3): }
lappend names {probability =< t1 + =>t1 only , ~ unity :}
foreach i {1 2 3 4 5 6 7 8} {
label .frame.label\$i -text [lindex \$names \$i] -anchor e
entry .frame.entry\$i -width 35 -textvariable side\$i
set msg "Calculator for Product lifetime exponential density
from TCL WIKI,
written on eTCL "
tk_messageBox -title "About" -message \$msg }
proc calculate {     } {
global side1 side2 side3 side4 side5
global side6 side7 side8
global testcase_number
incr testcase_number
set side1 [* \$side1 1. ]
set side2 [* \$side2 1. ]
set side3 [* \$side3 1. ]
set side4 [* \$side4 1. ]
set side5 [* \$side5 1. ]
set uptohours \$side1
set expcoeff \$side4
set excoef  [* \$uptohours \$expcoeff -1.]
set probability [- 1. [exp  \$excoef ]]
set probability_gt_t1 [exp  \$excoef ]
set excoef1  [* \$side2 \$expcoeff -1.]
set excoef2  [* \$side3 \$expcoeff -1.]
set term1 [- 1. [exp  \$excoef1 ]]
set term2 [- 1. [exp  \$excoef2 ]]
set probability_interval [- \$term2 \$term1 ]
set side5 [* \$probability 1. ]
set side6 [* \$probability_gt_t1 1. ]
set side7 [* \$probability_interval 1. ]
set side8 [+  \$probability  \$probability_gt_t1 ] }
proc fillup {aa bb cc dd ee ff gg hh} {
.frame.entry1 insert 0 "\$aa"
.frame.entry2 insert 0 "\$bb"
.frame.entry3 insert 0 "\$cc"
.frame.entry4 insert 0 "\$dd"
.frame.entry5 insert 0 "\$ee"
.frame.entry6 insert 0 "\$ff"
.frame.entry7 insert 0 "\$gg"
.frame.entry8 insert 0 "\$hh"
}
proc clearx {} {
foreach i {1 2 3 4 5 6 7 8 } {
.frame.entry\$i delete 0 end } }
proc reportx {} {
global side1 side2 side3 side4 side5
global side6 side7 side8
global testcase_number
console show;
puts "%|table \$testcase_number|printed in| tcl wiki format|% "
puts "&| quantity| value| comment, if any|& "
puts "&| testcase number:|\$testcase_number | |&"
puts "&| \$side1 :|up to hours =<t1 only|   |&"
puts "&| \$side2 :|interval minimum hours =>t2 | |& "
puts "&| \$side3 :|interval maximum hours =< t3| |& "
puts "&| \$side4 :| exponential density coefficient (optional) |  |&"
puts "&| \$side5  :| probability up to =<t1 only|  |&"
puts "&| \$side6  :|probability  =>t1|  |&"
puts "&| \$side7  :|probability interval =>t2 to =<t3  |  |&"
puts "&| \$side8  :|probability =<t1+=>t1   | approx unity |&"
}
frame .buttons -bg aquamarine4
::ttk::button .calculator -text "Solve" -command { calculate   }
::ttk::button .test2 -text "Testcase1" -command {clearx;fillup 500.0 1000.0 1500.0 0.0014  0.50 0.49 0.124 1.}
::ttk::button .test3 -text "Testcase2" -command {clearx;fillup 1000.0 1200.0 1500.0 0.0014  0.75 0.24 0.064 1. }
::ttk::button .test4 -text "Testcase3" -command {clearx;fillup 1200.00 1500.0 2000.0 0.0014 0.813 0.18 0.0616 1. }
::ttk::button .clearallx -text clear -command {clearx }
::ttk::button .cons -text report -command { reportx }
::ttk::button .exit -text exit -command {exit}
pack  .clearallx .cons .about .exit .test4 .test3 .test2   -side bottom -in .buttons
grid .frame .buttons -sticky ns -pady {0 10}
. configure -background aquamarine4 -highlightcolor brown -relief raised -border 30
wm title . "Product Lifetime and Exponential Density Calculator "```

### Pushbutton Operation

For the push buttons, the recommended procedure is push testcase and fill frame, change first three entries etc, push solve, and then push report. Report allows copy and paste from console.

For testcases in a computer session, the eTCL calculator increments a new testcase number internally, eg. TC(1), TC(2) , TC(3) , TC(N). The testcase number is internal to the calculator and will not be printed until the report button is pushed for the current result numbers. The current result numbers will be cleared on the next solve button. The command { calculate; reportx } or { calculate ; reportx; clearx } can be added or changed to report automatically. Another wrinkle would be to print out the current text, delimiters, and numbers in a TCL wiki style table as

```  puts " %| testcase \$testcase_number | value| units |comment |%"
puts " &| volume| \$volume| cubic meters |based on length \$side1 and width \$side2   |&"  ```