I have been tinkering with the TI-95 and its MATH and STAT ROMs. I discovered that the Newtons Root method (option NTN in option ZRO) has a bug that causes the solution FOR ANY FUNCTION to jump to huge numbers and then overflow. I tested my fx(x)=exp(x)-3*x^2 and fx(x)=x^2-5*x+6 functions and both bombed out. I inserted a pause (PAU) command in my function code to trace the values used by NTN and found that it does the following:

1) Evaluate fx at you initial guess (call it X).

2) Evaluate fx at X plus a small increment.

3) Evaluate fx at X minus a small increment.

4) Evaluate fx at a large number.

5) Repeat step 4 with different large numbers until the calculations overflow.

I also noticed that the TI-95 emulator by HrastProgrammer has the same bug in his port of the MATH ROM! I guess his ported the binary image of the MATH ROM.

Anyone else out there has seen this bug?

The Bisection method in the MATH ROM works fine!

Namir

Based on the

source code of

NTN starting at line

683A I wrote these functions in

Python:

Code:

`from math import exp, hypot`

ε = 1e-9

def df(f, x):

return (

(f(ε) - f(-ε)) / ε / 2

if x == 0

else (f(x * (1 + ε)) - f(x * (1 - ε))) / ε / 2 / x

)

def ntn(f, x_0, δ, n):

x = x_0

for i in range(n):

fx = f(x)

dx = fx / df(f, x)

if hypot(dx, fx) <= δ:

break

x -= dx

else:

print("#it REACHED")

return x

def f(x):

return exp(x) - 3 * x**2

def g(x):

return x**2 - 5 * x + 6

This is the mapping of the variables to the registers:

- 0000: \(x\)
- 0001: \(\varepsilon = 10^{-9}\)
- 0005: \(x_0\)
- 0006: \(f(x)\)
- 0009: \(\delta\)
- 0010: \(i\)

Examples
\(

\begin{align}

f(x) &= e^x - 3x^2 \\

x &= -0.458962 \\

x &= 0.910008 \\

x &= 3.73308 \\

\end{align}

\)

Code:

`ntn(f, -1, 1e-10, 10)`

-0.45896226753694863

Code:

`ntn(f, 1, 1e-10, 10)`

0.9100075724887092

Code:

`ntn(f, 4, 1e-10, 10)`

3.7330790286328144

\(

\begin{align}

g(x) &= x^2 - 5 x + 6 \\

x &= 2 \\

x &= 3 \\

\end{align}

\)

Code:

`ntn(g, 0, 1e-10, 10)`

1.9999999999942588

Code:

`ntn(g, 4, 1e-10, 10)`

3.0000000000000013

To me the implementation in the MATH ROM looks solid.

However, I was able to get nonsensical results if the starting value was close to a critical point where the derivative is

0.

Examples
Code:

`ntn(f, 2.833, 1e-10, 5)`

#it REACHED

-271.9295080855029

Code:

`ntn(g, 2.5, 1e-10, 10)`

#it REACHED

-2746.2796055906856

Though I haven't tried it in an emulator, I assume that both the accuracy \(\delta\) and the maximal number of iterations \(n\) have to be stored in registers

0009 and

0010 respectively.

Also if the value in register

0010 is

0, the default value

10 is used instead.

Maybe you can check if the value in register

0009 is not

0?

It should be a fairly small value, like maybe \(10^{-5}\).

But I'm not sure if that helps.

Thanks Thomas.

I used the PoketEmul simulator on my iPhone torun the TI-95 emulator and loaeded the MATH rom. I GOT THE SAME OVERFLOW ERROR WITH THE NEWTON METHOD!

My conclusion is that while the listing you provided me is correct (and the Python code your provided runs correctly), there may be a last minute bug introduced in the ROM (kind of remind us with the last minute code change for the HP-15LE firmware that caused the famous and annoying PAUSE bug!).

I recieved another MATH rom pack yesterday. So I will test that ROM on my TI-95.

Namir

Thank you Thomas for solving the riddle. I was NOT enclosing the expression for fx in parentheses!! When I coded fx like you did on the TI-95 emulator and a real TI-95, it worked in both cases!!!

Thank you for helping solve the mystery!!!

Namir