第一次在这里问问题。
下面的代码应该绘制核的“中子滴线”。它表示,对于原子序数(Z)的每个特定值,中子数(N)的极限值,超过该极限值,增加一个中子将使核不稳定。不稳定性由分离能变为负来表示,其中分离能是指(Z,N)和(Z,N+1)组合的结合能值的差异。我使用以下步骤来实现相同的:
1.从A值列表中创建Z值和N值的数组。我定义了一个zmin()
函数来获得Z的值,并取与A的差来获得N的值。
1.取一个Z值并计算一系列N个增量值的结合能,直到(Z,N)和(Z,N+1)组合之间的间隔返回负值。将出现这种情况的N的值附加到下一个Z值上,直到列表的末尾。
import numpy as np
import matplotlib.pyplot as plt
avol = 15.5 # Initializing the coefficients
asurf = 16.8
acol = 0.72
asym = 23
def bind_en (Z, N): #Defining a function to calculate binding energy
#curve using semi-emperical mass formulae
if ((Z+N)%2)!=0 and (Z%2)==0:
apar=0
elif ((Z+N)%2)==0 and (Z%2)!=0:
apar=0
elif ((Z+N)%2)==0 and (Z%2)==0:
apar=34
elif ((Z+N)%2)!=0 and (Z%2)!=0:
apar=-34
b = avol*(Z+N)-asurf*((Z+N)**(2/3))-(acol*Z*(Z-1))/((Z+N)**(1/3))-asym*(((Z+N)-2*Z)**2)/(Z+N)+apar/((Z+N)**(3/4))
return b/A
def zmin(A):
z = (A / 2) * (1 / (1 + 0.25 * (A ** (2 / 3)) * (acol / asym)))
z = int(z)
return z
A = np.arange(1, 261, 1)
Z = []
N = []
NM=[]
for i in range(len(A)):
Z.append(zmin(A[i]))
N.append(A[i]-Z[i])
flag=False
for j in range(len(Z)):
for k in range(len(N)):
s=bind_en(Z[j],N[k+1])-bind_en(Z[j],N[k])
'''if isinstance(s, np.ndarray):
print("s is an array.")'''
if s<0:
NM.append(N[k])
flag=True
break
if flag:
break
plt.plot(NM, Z)
plt.xlabel('Number of Neutrons (N)')
plt.ylabel('Number of Protons (Z)')
plt.grid(True)
plt.show()
字符串
在执行时,会显示此错误:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[27], line 45
42 s=bind_en(Z[j],N[k+1])-bind_en(Z[j],N[k])
43 '''if isinstance(s, np.ndarray):
44 print("s is an array.")'''
---> 45 if s<0:
46 NM.append(N[k])
47 flag=True
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
型
我理解这个错误的意思是's'变量是一个数组(注解的isinstance()
函数确实验证了这一点,因此它不能与单个值0进行比较。
但我不明白它怎么会是数组。请问有什么办法能修好吗?
2条答案
按热度按时间polkgigr1#
A是一个数组,定义为:
字符串
因此,当你的函数
bind_en
返回return b/A
,其中b
是一个数字,结果也是一个数组-A的每个元素都被用作b
的除法器,新数组由结果组成。如果您期望结果是一个数字,则整个数组不应成为计算的一部分。我不确定你的代码背后的数学,但对于其他数组,你使用索引来选择某个元素(例如
bind_en(Z[j],N[k+1])
),也许你也可以用A
来做?否则,可以考虑聚合函数(例如sum(A)
)。klsxnrf12#
问题出在bind_en函数中:
字符串
您返回B/A。B/A的类型是一个numpy数组,不能与整数0进行比较。