基于x=π/4处cos(x)泰勒级数近似cos(π/3)的误差异常排查
问题排查:泰勒级数近似cos(π/3)的误差异常问题
问题描述
编写了如下Python代码,旨在利用x=π/4处的N阶(N=0,1,2,…,10)cos(x)泰勒级数展开式近似计算cos(π/3),并绘制真相对误差(Y轴设为对数刻度)随N(X轴)变化的曲线。预期误差随N增大逐渐递减,但实际生成的曲线中Y值(误差)表现异常,与目标输出不符,希望排查该异常的原因。
原代码
import numpy as np import matplotlib.pyplot as plt def cos_taylor(x, N): s = 0 for n in range(N+1): term = ((-1)**n)*(x**(2*n))/np.math.factorial(2*n) s += term return s true_value = np.cos(np.pi/3) N_values = np.arange(11) true_relative_errors = np.zeros(N_values.size) for i, N in enumerate(N_values): approx_value = cos_taylor(np.pi/4, N) true_relative_errors[i] = np.abs((true_value - approx_value)/true_value) plt.semilogy(N_values, true_relative_errors, 'bo-') plt.grid() plt.yscale('log') plt.xlabel('Nth-order Taylor series') plt.ylabel('err') plt.show()
错误原因
- 核心逻辑错误:混淆泰勒级数的展开点与待计算点
泰勒级数的作用是在已知点a处展开,近似计算附近点x的函数值,正确的cos(x)在a点的N阶展开式为:
$$\cos(x) \approx \sum_{n=0}^N \frac{(-1)^n}{(2n)!}(x - a)^{2n}$$
原代码的cos_taylor函数直接计算x的幂次项,本质是计算cos(x)在**0点(麦克劳林级数)**的近似值,而非在π/4点的展开。并且调用时传入的是π/4,得到的是cos(π/4)的近似值,和目标cos(π/3)的误差不会随N增大递减——因为你根本没在用π/4处的展开去近似π/3。
修正后的代码
import numpy as np import matplotlib.pyplot as plt def cos_taylor(x, a, N): # x: 待计算的点,a: 泰勒展开的基点 s = 0 for n in range(N+1): term = ((-1)**n) * ((x - a)**(2*n)) / np.math.factorial(2*n) s += term return s true_value = np.cos(np.pi/3) N_values = np.arange(11) true_relative_errors = np.zeros(N_values.size) for i, N in enumerate(N_values): # 用π/4处的泰勒展开近似计算π/3处的cos值 approx_value = cos_taylor(np.pi/3, np.pi/4, N) true_relative_errors[i] = np.abs((true_value - approx_value)/true_value) plt.semilogy(N_values, true_relative_errors, 'bo-') plt.grid() plt.yscale('log') plt.xlabel('Nth-order Taylor series') plt.ylabel('True Relative Error') plt.show()
修正说明
- 给
cos_taylor函数增加了展开基点a的参数,计算项改为(x - a)的幂次,符合泰勒级数的定义 - 调用时传入待计算点
np.pi/3和展开点np.pi/4,实现用π/4处的展开近似π/3的目标 - 修正后误差会随N增大逐渐递减,符合预期
内容的提问来源于stack exchange,提问作者Jehwan Jeon
相关产品推荐
相关产品推荐

