某些背景信息:我有一个明确的公式,这是我问题的确切解决方案。我编写的代码实现了一个有限差分方案(显式前向欧拉,即:前向行进时间迭代方案),以近似解偏微分方程(PDE)。我把问题贬低了。
我想比较这两个并验证精确解决方案与我对解决方案的近似之间的误差确实很小。对于每个时间步和空间节点,我已将精确解的值和近似值存储在两个(NxM)
数组中。
这是我编写的代码来计算错误:
# Compute the Error
E = np.zeros((N+1, M+1)) # so that E has NxM entries--one for each time-step and node in space
for m in range(1, M+1):
for j in range(0, N+1):
E_new = np.absolute(BS[j,m] - u[j,m])
if (np.any(E_new >= E)):
E = E_new
else:
E = E
print 'Error = ', E
在这里,我正在考虑N = 100, M = 10,000
。如有必要,我可以在计算数组BS
和u
的位置发布我的代码段。两者都被定义为相同大小的数组,当我绘制它们时,我收到的输出与解决方案的外观一致。所以我相信我在正确的轨道上,我的其余代码正在按预期工作。
然而,当我在尝试计算错误时运行此特定段时,我得到的错误大致为29.我知道这是错误的,错误应该很小。
我尝试解决问题:
我认为问题可能在于包含if (np.any(E_new >= E)):
的行。我想检查数组E_new
的任何条目是否大于或等于E
。如果我只用if (E_new >= E):
运行它,我得到这个ValueError:"具有多个元素的数组的真值是不明确的。使用a.any()或a.all()。"
我也尝试过运行:if (np.any([E_new, E])):
,但又没有运气。我收到此错误消息," ValueError:设置一个带有序列"的数组元素。在我的每次尝试中,我也尝试使用np.all
代替np.any
,这似乎也无法解决问题。
以下是我希望做的一些伪代码:
E = 0
for i = 1,...,N:
E_new = | BS(x_i) - u_i |
if E_new >= E
E = E_new
else:
E = E
end
非常感谢任何和所有帮助。先感谢您!我真的被困在这里,我不知道如何前进。我不一定需要直接回答,但是对于导致问题的原因以及推进正确方向的一些见解将会非常有帮助。再次感谢!!
答案 0 :(得分:2)
也许逐行完成你的程序会有所帮助:
# Compute the Error
E = np.zeros((N+1, M+1)) # so that E has NxM entries--one for each time-step and node in space
# to get NxM use np.zeros((N, M))
for m in range(1, M+1):
for j in range(0, N+1):
# any reason you start the outer loop at 1 and the inner loop at 0?
E_new = np.absolute(BS[j,m] - u[j,m])
# if BS is MxN (or (M+1)x(N+1)) BS[j, m] selects the entry at the
# j-th row and m-th column which is a scalar. Similar for u, so in
# the end E_new will contain a scalar
if (np.any(E_new >= E)):
# at the first iteration this will compare the scalar E_new to the
# array E resulting in an array of same shape of truth values
# at all later iterations E will also be a scalar
# the array allocated for E in the beginning will be garbage
# collected
E = E_new
else:
E = E
# why the error is so large in the end I can't tell you
print 'Error = ', E
并提出建议,如果我可以:
如果你想要最大元素绝对差值作为误差测量,你可以在一行中将其作为奖励执行得更快,因为它是矢量化的。假设BS
和u
具有相同的形状:
E = np.abs(BS-u).max()