I'm currently trying to make an interact for newton fractals that accepts most functions. This is my code for newton's method:
import numpy as np
def newton(z0,f,fp,MAX_IT):
cnt = 0
TOL = 1e-10
z = z0
condition = fp(z) != 0
a = z[condition]
for i in range(MAX_IT):
dz = f(a)/fp(a)
adz = np.absolute(dz)
if np.all(adz < TOL) :
return a
cnt += 1
a -= dz
return False
Input:
var('a')
x = np.linspace(-2,2,20)
y = np.linspace(-2,2,20)
xx,yy = np.meshgrid(x,y)
g(x) = sin(x)
f = fast_callable(g, vars=(a))
fp = fast_callable(diff(g), vars(a))
newton(xx+yy*1j,f,fp,100)
Output:
array[[3.14159265+0.00000000j, -3.14159265+0.00000000j, ...,
3.14159265+0.00000000j, -3.14159265+0.00000000j]]
I'm supposed to get 0
or 2*pi
in addition to the above. When I use numpy
functions I don't have this issue. Is fast_callable
breaking something?