ちょっと変わったバグに遭遇しましたが、何が原因なのかよくわかりません。
ラムダ関数を含むリストがあり、以下に示すように、このリストをグローバル変数に設定しました。グローバル変数は、必要な関数入力を使用して「残差」関数内で参照されます。
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]