试图通过比较两个数组来计算错误

计算科学 pde 有限差分 Python 麻木的 抛物线pde
2021-12-11 07:00:15

一些背景:我正在使用 Black-Scholes 模型。我有一个明确的(Black-Scholes)公式,这是我的问题的确切解决方案。我已经编写了实现有限差分方案的代码(显式前向欧拉,即:向前推进的时间迭代方案)来逼近偏微分方程(PDE)的解。我已经离散化了这个问题。

我想比较这两者并验证精确解与我的近似解之间的误差确实很小。(NxM)对于空间中的每个时间步长和节点,我已将精确解和近似值的值存储在两个数组中。

这是我想做的一些伪代码:

E = 0
for i = 1,...,N:
    E_new = | BS(x_i) - u_i |
    if E_new >= E
        E = E_new
    else:
        E = E
    end

这是为计算错误而编写的代码:

# 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如有必要,我可以将我的代码段发布到我计算数组BSu. 两者都定义为相同大小的数组,当我绘制它们时,我收到的输出与解决方案的外观一致。所以我相信我走在正确的轨道上,并且我的其余代码正在按预期工作。

但是,当我运行此特定段以尝试计算错误时,我得到错误大约为 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: setting an array element with a sequence”。我也尝试过在我的每次尝试中使用np.all代替,np.any这似乎也不能解决问题。

非常感谢任何和所有帮助。先感谢您!我真的被困在这里,我不知道如何前进。我不一定需要直接的答案,但是对导致问题的原因和朝着正确方向的推动有所了解会非常有帮助。再次感谢!!

2个回答

你可以做一些“ ”的效果。这计算了范数,这似乎是你所追求的。它将为您省去编写循环的心痛/头痛,并且它在 python 中的执行速度也恰好快了大约 100 倍,因为您将工作卸载到用 C 编写的函数上。这假设“BS”是您的确切解决方案,“ u" 是你的数值解,它们都存储在 numpy 数组中。np.max(np.abs(BSu))L

我强烈建议您使用via中的norm函数,该函数将为您提供错误的规范,或者如果您设置了您可以执行numpynumpy.linalg.norm(BS - u, ord=2)2ord=numpy.infty