我正在尝试使用不同的差分方法来实现功能。欧拉向前和向后。我用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)
我想以图形方式比较两个不同的结果。
答案 0 :(得分:0)
微分函数内部的c
变量与外部的c
变量之间存在混淆:内部的c
实际上为1(它是从外部的{{1 }}。
另一个问题是您的函数不返回任何内容,因此打印仅显示c[-1]
。我猜应该返回None
或euler
。
在python 3中解决这两个问题似乎就足够了。在python 2中,请注意backward
(t/Nt
)的结果实际上是10/11
。
将所有内容放在一起,您会在以下几行中找到一些东西:
0