Hi all,
Beginner here to Python programming for economic research. I have just encountered a problem with the newton-raphson function that I wanted to clarify.
For background, I am coding up a CES Function of the form f(x,y) = (x^rho + y^rho)^(1/rho). I want to find the roots of a new function: it’s derivative minus a fixed constant. Using the newton-raphson function in the quantecon package, the trouble I am facing is a “failure to converge”, using most values of rho (the ones I’ve tried) that is not equal to 3. In fact, 3 should not be used at all (as the rho parameter in a Ces function has to be less than 1, and not equal to 0). Nevertheless, it is the only value that works in my code.
I am not sure if this is a problem in the starting value I am selecting, or due to an error in my code. If it is the latter, any suggestions to fix it would be much appreciated. If it is the former, I am an undergrad so please excuse my lack of knowledge of maths, any help on that would also be appreciated. Thanks very much everyone!
Setup Code:
##Load Libraries##
from numba import jit
import numpy as np
####################QuantEcon Methods#######################
from quantecon.optimize.root_finding import newton, newton_halley, newton_secant\
, bisect, brentq
##Coded Up Functions (Jitted)##
@jit
def ces(x,y,rho):
U = (x**rho + y**rho)**(1/rho)
return U # original CES Function
@jit
def ces_d(x,y,rho):
U_x = (x**(rho-1)) * ((x**rho + y**rho)**((1-rho)/rho))
return U_x # CES Derivative
@jit
def ces_dd(x,y,rho,ud):
U_xd = (x**(rho-1)) * ((x**rho + y**rho)**((1-rho)/rho)) - ud
return U_xd # New Function: CES Derivative - ud
@jit
def ces_d2(x,y,rho,z):
U_xx = (rho-1) * (x**(rho-2)) *(y**rho) * ((x**rho + y**rho)**(1/rho-2)) - z
return U_xx # New Function Derivative - z #the z is just a placeholder variable, to make it work with ces_inv, should not affect it?
@jit
def ces_d3(x,y,rho,z):
U_xxx = ( (rho-2) * (rho-1) * (x**(rho-3)) * (y**rho) * ((x*rho + y*rho)**(1/rho-2)) \
+ ((rho-1)* rho * x**(2*rho-3) * y**rho * ((x**rho + y**rho)**(1/(rho-2)-1)))/(rho-2) ) - z
return U_xxx #New Function Second Derivative - z #same reasoning as above
##Default Newton-Raphson##
@jit
def ces_inv(y,rho,ud):
args = (y,rho,ud) #order must be preserved
x_bar = newton(ces_dd, 0 ,ces_d2, args=args)
return x_bar
Trying it with rho = 3
print(ces_inv(2,3,4))
results(root=-1.922999428365063, function_calls=24, iterations=12, converged=True)
Trying it with rho = 0.005 (StackTrace Included)
Traceback (most recent call last):
File "<ipython-input-61-b8dbad107a2e>", line 44, in <module>
print(ces_inv(2,0.005,4))
File "C:\Users\Orphanides\anaconda3\lib\site-packages\quantecon\optimize\root_finding.py", line 105, in newton
raise RuntimeError(msg)
RuntimeError: Failed to converge