您好我写了以下代码,
Z=1 #particle position
dz=0.1
time=1
dt=0.1
v=0
Fz=0
for time in np.arange(1, 10, dt):
#####simulation loop#######
theta=np.arccos(-Z/R) #contact angle
theta_e=((math.pi*110)/180) #equilibrium contact angle
Z_e=-R*np.cos(theta_e)#equilibrium position of particle
C=3.14*gamma*(R-Z_e) #additive constant
Fsz= (gamma*math.pi*(Z-Z_e)**2)+(tau*2*math.pi*math.sqrt(R**2-Z**2))+C
Fz=Fsz+(0.5*deltaF*np.sin((2*math.pi/lamda)*(Z-Z_e)-phi))#surface force
w_a=gamma*lamda_m**2*(1-np.cos(theta_e)) #work of adhesion
epsilon_z=2*math.pi*R*np.sin(theta)*mu*(nu/(lamda_m**3))*np.exp(w_a/KbT)#transitional drag
epsilon_s=khi*mu*((4*math.pi**2*R**2)/math.sqrt(Ad))*(1-(Z/R)**2)
epsilon=epsilon_z+epsilon_s
Ft=math.sqrt(2*KbT*epsilon)*series #thermal force
v=(-np.diff(Fz,Z)+Ft)/epsilon ##new velocity
Z=v*dt #new position
我试图计算dFz/dz
,但它给了我以下错误,
File "C:/Users/mohammad.hossain1/Desktop/particle.py", line 62, in <module>
v=(-np.diff(Fz,Z)+Ft)/epsilon ##new velocity
File "C:\Users\mohammad.hossain1\AppData\Local\Continuum\anaconda3\lib\site-packages\numpy\lib\function_base.py", line 1924, in diff
slice1[axis] = slice(1, None)
IndexError: list assignment index out of range
由于我的初始条件是Fz=0
Z=0
并且它随时间而变化,我想得到dFz/dz
。我已经导入了所有必要的模块,所有变量都在代码的开头正确定义。但是我在介绍导数时遇到了错误。因此,我的方法很可能与参数无关。是否有可能向我展示我在编码过程中所犯的错误。
答案 0 :(得分:0)
即使使用堆栈跟踪也很难确定。显然numpy正在尝试访问名为slice1的列表,该列表具有列表所没有的轴索引。不知道为什么会这样,但它必须是这一行:
v=(-np.diff(Fz,Z)+Ft)/epsilon
我怀疑这一行导致此问题的部分是np.diff(),因为它是np代码抛出此错误。我最好的猜测是在这种情况下Fz和Z是相等的,或者.diff方法的其他值是不可接受的。如果是这样,请尝试添加以下内容:
if Fz != Z:
v=(-np.diff(Fz,Z)+Ft)/epsilon
如果这不能阻止崩溃,请尝试在此行之前打印Fz和Z的值,看看它们是否看起来很奇怪/可疑。