无法在完成的代码

时间:2015-11-10 04:24:08

标签: python execution numba

下面我做错了什么?我已经在我的Mac和Numba上安装了Anaconda。我试图在我的Python代码上运行Numba,遵循 Python with Numba 部分中给出的说明:https://www.continuum.io/blog/developer/accelerating-python-libraries-numba-part-1

我需要通过将 zzzz 从5更改为40来隔夜运行此代码。我现在只使用 zzzz = 5 作为测试用例。这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
from numba import double
from numba.decorators import jit, autojit

@jit
def Kcrit():
    # The data of the plot will be added in these lists
    x_data_plot=[]
    y_data_plot=[]
    zzzz = 5
    for N in range(2,zzzz,2):
        #Constants and parameters
        epsilon = 0.01
        if N in range(2,11,2):
            K00 = np.logspace(0,3,100,10)
        elif N in range(12,21,2):
            K00 = np.logspace(3,3.75,100,10)
        elif N in range(22,31,2):
            K00 = np.logspace(3.75,4.15,100,10)
        else:
            K00 = np.logspace(4.15,4.5,100,10)
        len1 = len(K00)
        y0 = [0]*(3*N/2+3)
        Kplot = np.zeros((len1,1))
        Pplot = np.zeros((len1,1))
        S = [np.zeros((len1,1)) for kkkk in range(N/2+1)]
        KS = [np.zeros((len1,1)) for kkkk in range(N/2)]
        PS = [np.zeros((len1,1)) for kkkk in range(N/2)]
        Splot = [np.zeros((len1,1)) for kkkk in range(N/2+1)]
        KSplot = [np.zeros((len1,1)) for kkkk in range(N/2)]
        PSplot = [np.zeros((len1,1)) for kkkk in range(N/2)]

        for series in range(0,len1):
            K0 = K00[series]
            Q = 10
            r1 = 0.0001
            r2 = 0.001
            a = 0.001
            d = 0.001
            k = 0.999
            S10 = 1e5
            P0 = 1
            tf = 1e10
            time = np.linspace(0,tf,len1)

            #Defining dy/dt's
            def f(y,t):
                for alpha in range(0,(N/2+1)):
                    S[alpha] = y[alpha]
                for beta in range((N/2)+1,N+1):
                    KS[beta-N/2-1] = y[beta]
                for gamma in range(N+1,3*N/2+1):
                    PS[gamma-N-1] = y[gamma]
                K = y[3*N/2+1]
                P = y[3*N/2+2]

                # The model equations
                ydot = np.zeros((3*N/2+3,1))
                B = range((N/2)+1,N+1)
                G = range(N+1,3*N/2+1)
                runsumPS = 0
                runsum1 = 0
                runsumKS = 0
                runsum2 = 0

                for m in range(0,N/2):
                    runsumPS = runsumPS + PS[m]
                    runsum1 = runsum1 + S[m+1]
                    runsumKS = runsumKS + KS[m]
                    runsum2 = runsum2 + S[m]
                    ydot[B[m]] = a*K*S[m]-(d+k+r1)*KS[m]

                for i in range(0,N/2-1):
                    ydot[G[i]] = a*P*S[i+1]-(d+k+r1)*PS[i]

                for p in range(1,N/2):
                    ydot[p] = -S[p]*(r1+a*K+a*P)+k*KS[p-1]+d*(PS[p-1]+KS[p])

                ydot[0] = Q-(r1+a*K)*S[0]+d*KS[0]+k*runsumPS
                ydot[N/2] = k*KS[N/2-1]-(r2+a*P)*S[N/2]+d*PS[N/2-1]
                ydot[G[N/2-1]] = a*P*S[N/2]-(d+k+r2)*PS[N/2-1]
                ydot[3*N/2+1] = (d+k+r1)*runsumKS-a*K*runsum2
                ydot[3*N/2+2] = (d+k+r1)*(runsumPS-PS[N/2-1])- \
                                a*P*runsum1+(d+k+r2)*PS[N/2-1]

                ydot_new = []
                for j in range(0,3*N/2+3):
                    ydot_new.extend(ydot[j])
                return ydot_new

            # Initial conditions
            y0[0] = S10
            for i in range(1,3*N/2+1):
                y0[i] = 0
            y0[3*N/2+1] = K0
            y0[3*N/2+2] = P0

            # Solve the DEs
            soln = odeint(f,y0,time, mxstep = 5000)
            for alpha in range(0,(N/2+1)):
                S[alpha] = soln[:,alpha]
            for beta in range((N/2)+1,N+1):
                KS[beta-N/2-1] = soln[:,beta]
            for gamma in range(N+1,3*N/2+1):
                PS[gamma-N-1] = soln[:,gamma]

            for alpha in range(0,(N/2+1)):
                Splot[alpha][series] = soln[len1-1,alpha]
            for beta in range((N/2)+1,N+1):
                KSplot[beta-N/2-1][series] = soln[len1-1,beta]
            for gamma in range(N+1,3*N/2+1):
                PSplot[gamma-N-1][series] = soln[len1-1,gamma]

            u1 = 0
            u2 = 0
            u3 = 0

            for alpha in range(0,(N/2+1)):
                u1 = u1 + Splot[alpha]
            for beta in range((N/2)+1,N+1):
                u2 = u2 + KSplot[beta-N/2-1]
            for gamma in range(N+1,3*N/2+1):
                u3 = u3 + PSplot[gamma-N-1]

            K = soln[:,3*N/2+1]
            P = soln[:,3*N/2+2]
            Kplot[series] = soln[len1-1,3*N/2+1]
            Pplot[series] = soln[len1-1,3*N/2+2]
            utot = u1+u2+u3

        #Plot
        Kcrit = abs((Q/r2)*(1+epsilon)-utot)
        v,i = Kcrit.min(0),Kcrit.argmin(0)
        # Save the new points for x and y
        x_data_plot.append(N)
        y_data_plot.append(K00[i])

    # Make the plot of all the points together
    plt.plot(x_data_plot,y_data_plot)
    plt.xlabel('N', fontsize = 20)
    plt.ylabel('$K_{crit}$', fontsize = 20)
    plt.show()

这是我在终端输入的内容:

from numba import autojit
numba_k = autojit()(Kcrit)

这是我的错误消息:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'Kcrit' is not defined

请注意,我不是在问Numba是否会加速我的代码(这是一个完全不同的问题)。我只想问如何运行它!

帮助表示赞赏。

0 个答案:

没有答案