基于泰勒级数的五点中心有限差分一阶导数权重计算结果异常排查
基于泰勒级数的五点中心有限差分一阶导数权重计算结果异常排查
哈哈,我一眼就揪出问题所在了——你的代码里的矩阵A写错了关键一行,直接导致方程组解完全偏离预期!咱们一步步理清楚:
1. 直接Bug:矩阵第四行的符号错误
你在理论推导里的第四个方程是:
系数 of $f^{(3)}(x)$: $8a + b - d - 8e = 0$
但你的代码里把矩阵A的第四行写成了:
[8, 1, 0, -1, 8] # 这里最后一个元素是+8,应该是-8!
正确的第四行应该是:
[8, 1, 0, -1, -8]
就是这个不起眼的符号错误,让你的方程组解出来完全不是想要的结果。
2. 验证修正后的结果
把矩阵A的第四行改对后运行代码,你会得到:
[-0.08333333 0.66666667 0. -0.66666667 0.08333333]
对应的分数形式就是你预期的 [-1/12, 2/3, 0, -2/3, 1/12],完美匹配理论结果!
3. 额外补充:泰勒展开的细节说明
虽然这次的直接问题是符号写错,但我还是提一下泰勒展开的隐藏逻辑:你在推导方程组时,其实是把Δx和泰勒展开阶乘的倒数都合并到了权重a,b,c,d,e中,这本身是没问题的。对应标准的五点一阶导数公式:
$$
f'(x) \approx \frac{-f(x+2\Delta x) + 8f(x+\Delta x) - 8f(x-\Delta x) + f(x-2\Delta x)}{12\Delta x}
$$
你的权重a,b,c,d,e其实就是公式里分子部分除以$\Delta x$的结果,当$\Delta x=1$时,权重就等于分子的分数值,和修正后代码的输出完全一致。
修正后的完整代码
import numpy as np A = np.array([ [1, 1, 1, 1, 1], # Coefficients of f(x) [2, 1, 0, -1, -2], # Coefficients of f'(x) [4, 1, 0, 1, 4], # Coefficients of f''(x) [8, 1, 0, -1, -8], # 修正这里的符号错误 [16, 1, 0, 1, 16] # Coefficients of f''''(x) ]) b = np.array([0, 1, 0, 0, 0]) # Targeting the first derivative z = np.linalg.solve(A, b) print(z)
备注:内容来源于stack exchange,提问作者Bhavninder Singh Virdi
相关产品推荐
相关产品推荐

