# scipy.optimize.newton gives TypeError: ufunc 'isfinite' not supported

Here is the code

import scipy.optimize
f(x) = x^2 - 4*sin(x)
fp(x) = diff(f(x),x)
scipy.optimize.newton(f,1.5,fp)


and get type error

TypeError: ufunc 'isfinite' not supported for the input types, and the inputs could not be safely coerced to any supported types according to the casting rule ''safe''

How to solve this error?

Some other information:

Run in Sagemath 9.4 on Cocalc.com

This code from the book "Numerical Analysis Using Sage by George A. Anastassiou, Razvan A. Mezei" which use "Sage Version 6.3, Release Date: 2014-08-10". Here, I edited the origin code (removing comment, and print command), the original code is:

#import the following library
import scipy.optimize
#the function f(x) from our problem
f(x) = x^2-4*sin(x)
#compute the derivative of f
fp(x)=diff(f(x),x)
#call the Newton’s method and output the result
print "solution = " , scipy.optimize.newton(f, 1.5, fp)


An extra question, is this code work on the old version of Sage in the above book, i.e. "Sage Version 6.3, Release Date: 2014-08-10"?

edit retag close merge delete

You can also define Python function to the same effect :

sage: def f(x): return x^2-4*sin(x)
sage: def fp(x): return 2*x-4*cos(x)
sage: import scipy.optimize
sage: scipy.optimize.newton(f,1.5,fp)
1.93375376282702


see Sagecell...

Sort by » oldest newest most voted

scipy.optimize.newton is numerical and requires f and fp to be callable, so a simple way to solve the issue is to transform f and fp into numerical callable functions with the fast_callable function :

sage: scipy.optimize.newton(fast_callable(f),1.5,fast_callable(fp))
1.93375376282702

more

You can also define f and fp as Python functions : see Sagecell...

The problem with that code is that you can not deduce fp from f since a Python function has no such thing as "a derivative".