首页 > 解决方案 > 如何修复函数中标量变量的无效索引

问题描述

我试图用不同的差分方法制作一个函数。欧拉向前和向后。我用 2 个单独的 for 循环完成了它们,但我想将它们收集到一个函数中。

Ca0 = 1
t = 10 
Nt= 11 
k = 0.1 
deltat = t/Nt
c = np.zeros(Nt)
c[-1] = Ca0
def differential(c, method = 'backwards'):
if method == 'euler':
    euler = []
    for t in range(0, Nt):
        c[t] = c[t-1] - c[t-1] * k * deltat
        euler.append(c[t])
    #so i get initial value (1) in the list
    euler.insert(0, 1)
elif method == 'backwards':
    backwards = []
    for t in range(0, Nt):
        c[t] = c[t-1] * (1/(1+(k*deltat)))
        backwards.append(c[t])
    #so i get initial value (1) in the list
    backwards.insert(0, 1)

print (differential(c[-1], method = 'euler'))

但它说 IndexError: invalid index to scalar variable。

虽然这正在工作。

for t in range(0, Nt):
   c[t] = c[t-1] - c[t-1] * k * deltat
   euler.append(c[t])
euler.insert(0, 1)
#backwards differential equation
c_b = np.zeros(Nt)
c_b[-1] = Ca0
backwards = []
for t in range(0, Nt):
    c_b[t] = c_b[t-1] * (1/(1+(k*deltat)))
    backwards.append(c_b[t])
backwards.insert(0, 1)

我想以图形方式比较两个不同的结果。

标签: python

解决方案


c微分函数内部的变量和外部变量之间存在混淆c:内部,c实际上是 1(它是从外部分配的c[-1])。

另一个问题是您的函数不返回任何内容,因此您的打印显示简单None。它应该返回euler或者backward我想。

在 python 3 中解决这两个问题似乎就足够了。在 python 2 中要小心t/Nt( 10/11) 的结果实际上是0.

将它们放在一起,您会发现以下几行:

Ca0 = 1
t = 10 
Nt= 11 
k = 0.1 
deltat = t/Nt
c = np.zeros(Nt)
c[-1] = Ca0
def differential(c, method = 'backwards'):
    if method == 'euler':
        euler = []
        for t in range(0, Nt):
            c[t] = c[t-1] - c[t-1] * k * deltat
            euler.append(c[t])
        #so i get initial value (1) in the list
        euler.insert(0, 1)
        return euler
    elif method == 'backwards':
        backwards = []
        for t in range(0, Nt):
            c[t] = c[t-1] * (1/(1+(k*deltat)))
            backwards.append(c[t])
        #so i get initial value (1) in the list
        backwards.insert(0, 1)
        return backwards

print (differential(c, method = 'euler'))

推荐阅读