Cython vs python different results in scipy.optimize.fsolve

I have a cythonized function that I call a bunch of times in my code. The cython version and the original python code give me the same answers (to the extent 1e-7that, as I understand it, are related to the types of cython and python ... not a question here, but may be important).

I am trying to find the root of a function using scipy.optimize.fsolve(). The python version works fine, but the cython version diverges.

The code is pretty involved and has a large external file to prepare some arguments, so I cannot publish everything. I am posting cython code. Full code here .

def euler_outside(float b_prime, int index_b,
                  np.ndarray[np.double_t, ndim=1] b_grid, int index_y,
                  np.ndarray[np.double_t, ndim=1] y_grid,
                  np.ndarray[np.double_t, ndim=1] y_vec,
                  np.ndarray[np.double_t, ndim=2] pol_mat_b, float q,
                  np.ndarray[np.double_t, ndim=2] pol_mat_q,
                  np.ndarray[np.double_t, ndim=2] P, float beta,
                  int n_ygrid, int check=0):
    '''
    b_prime - the variable of interest. want to find b_prime that solves this
    function
    '''
    cdef double b, y, c, uc, e_ucp, eul_val
    cdef int i
    cdef np.ndarray[np.float64_t, ndim=1] uct, c_prime = np.zeros((n_ygrid,))

    b = b_grid[index_b]
    y = y_grid[index_y]

    # Get value of consumption today
    c = b + y - b_prime/q

    # Get possible values of consumption tomorrow
    if check:
        c_prime = b_prime + y_vec - b_grid[0]/q
    else:
        for i in range(n_ygrid):
            c_prime[i] = (b_prime + y_vec[i] -
                         (np.interp(b_prime, b_grid, pol_mat_b[:,i]) /
                          np.interp(b_prime, b_grid, pol_mat_q[:,i])))

    if c<0:
        return 1e10

    uc = utility_prime(c)
    uct = utility_prime(c_prime)

    e_ucp = np.inner( uct, P[index_y,:] )
    eul_val = uc - beta*q * e_ucp

    return eul_val

python , cdef . , , . , scipy fsolve , . , cython?

python 2.7 Anaconda. pyximport.

+4
1

, Python Cython , Cython float, Python double .

Cython, -, , fsolve - double , Python Cython , fsolve .


, , , . , , .

+5

All Articles