如何将无效索引修复为函数中的标量变量

时间:2019-04-17 10:00:33

标签: python

我正在尝试使用不同的差分方法来实现功能。欧拉向前和向后。我用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:标量变量的索引无效。

这是可行的。

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)

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

1 个答案:

答案 0 :(得分:0)

微分函数内部的c变量与外部的c变量之间存在混淆:内部的c实际上为1(它是从外部的{{1 }}。

另一个问题是您的函数不返回任何内容,因此打印仅显示c[-1]。我猜应该返回Noneeuler

在python 3中解决这两个问题似乎就足够了。在python 2中,请注意backwardt/Nt)的结果实际上是10/11

将所有内容放在一起,您会在以下几行中找到一些东西:

0