【问题标题】:perform derivative inside a loop在循环内执行导数
【发布时间】:2018-01-14 21:01:50
【问题描述】:

您好,我写了以下代码,

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=0Z=0,它会随着时间而变化,我想得到dFz/dz。我已经导入了所有必要的模块,并且在代码的开头正确定义了所有变量。但是在引入导数时出现错误。所以很可能我的方法不适合争论。是否可以向我展示我在编码过程中犯的错误。

【问题讨论】:

    标签: python numpy fluid-dynamics


    【解决方案1】:

    即使有堆栈跟踪,也很难确定。显然 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 的值,看看它们是否看起来很奇怪/可疑。

    【讨论】:

    • 我对 numpy 并不严格。是否可以使用有限差分法进行分析?例如:Fz(1)-Fz(0)/Z(1)-Z(0)
    • 将 Fz 和 Z 传递给 np.diff() 时它们的值是多少并导致错误?
    • Fz=2.53868900101 Z=1, 之后运行if语句报错
    • 嗯,epsilon 值呢?
    • 7.18944401251e+29
    猜你喜欢
    • 2014-05-18
    • 2013-11-20
    • 1970-01-01
    • 2013-07-31
    • 2013-04-13
    • 1970-01-01
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多