2

ちょっと変わったバグに遭遇しましたが、何が原因なのかよくわかりません。

ラムダ関数を含むリストがあり、以下に示すように、このリストをグローバル変数に設定しました。グローバル変数は、必要な関数入力を使用して「残差」関数内で参照されます。

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 つの入力しか許可されていないため、配列を入力として関数に通常どおり渡すことはできません。また、ラムダ関数を受け入れ可能な型として使用しないため、rate_array を含めるために追加することもできません。

通常、ラムダ関数/式は、コードの余分な行として、残りの関数自体にある可能性がありますが、コードが実行される前にユーザーがそれらを編集することはできません...そのような混乱!

編集: 申し訳ありませんが、説明を簡単にするためにコードを大幅に削減しましたが、その過程で間違っていたものを入力しただけで、修正されました。

エラーコード:

*** 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