2

我遇到了一个奇怪的错误,我真的不确定是什么原因造成的。

我有一个包含 lambda 函数的列表,我已将此列表设置为全局变量,如下所示。然后使用所需的函数输入在“残差”函数中引用全局变量。

from numpy import array

from math import exp

from guppy import hpy   
hp = hpy()
hp.setrelheap()

rate_array = [[0, "4.91*(10**-22)*(T_m**4)"],                                                
              [1, "1.4*(10**-18)*(T_m**0.928)*exp(-T_m/16200)"]]  

global k

k = [0,0]

for i in range(0,2):

    k[i] = (eval('lambda T_m,T_r,Z_initial: ' + rate_array[i][1]))


def residual(t,y,yd):

    Z_initial = 10

    res_0 = -k[1](y[2],y[3], Z_initial)*y[0]
    res_1 = -k[0](y[2],y[3],Z_initial)*y[1]

    return array([res_0,res_1 ])



y = [0,0,0,0]
yd= [0,0,0,0]
t=0

residual(t,y,yd)


print("\nMemory statistics are as follows:\n")
print hp.heap()

运行残差函数似乎给出了无效的指针错误或分段错误。代码时不时地运行,但大多数时候它不会运行。我看不出代码有什么问题,所以我不确定发生了什么。有什么特别明显的吗?

额外:我意识到这是一种奇怪的方法,但要解释一下:“rate_array”包含字符串,因为它根据用户是否要编辑它被腌制/解封。

此外,残差函数由第 3 方软件集成,它只允许显示 3 个输入,所以我不能像往常一样将数组作为输入传递给函数。我也不能将它附加到包含 rate_array 中,因为它不会将 lambda 函数作为可接受的类型。

通常 lambda 函数/表达式可能只是在残差函数本身中,只是额外的代码行,但是用户不可能在代码运行之前对其进行编辑.....真是一团糟!

编辑:抱歉,我大量削减了代码以尝试使其更易于解释,但在此过程中只是输入了完全错误的内容,现在已更正。

错误代码:

*** glibc detected *** python: free(): invalid pointer: 0x0000000002a7aa50 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x7eb96)[0x7fd857ddbb96]
/usr/local/lib/python2.7/dist-packages/guppy/sets/setsc.so(+0xbeeb)[0x7fd841bd1eeb]
/usr/local/lib/python2.7/dist-packages/guppy/sets/setsc.so(+0xbf73)[0x7fd841bd1f73]
python[0x48abf9]
python[0x48a9de]
python(PyEval_EvalFrameEx+0x52c)[0x45fb2c]
python(PyEval_EvalFrameEx+0xcb7)[0x4602b7]
python(PyEval_EvalCodeEx+0x199)[0x467209]
python(PyEval_EvalCode+0x32)[0x4d0242]
python[0x5102bb]
python(PyRun_FileExFlags+0x9a)[0x44a466]
python(PyRun_SimpleFileExFlags+0x2bc)[0x44a97a]
python(Py_Main+0xb36)[0x44b6bc]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xed)[0x7fd857d7e76d]
python[0x4ce0ad]
4

0 回答 0