import numpy as np import matplotlib.pyplot as plt import matplotlib as mpl import math #e^x = 1 + x + x^2/2!+... def calc_e_small(x): n = 10 #累乘 cumsum是求和 #1! 2! 3! 4! 5!...10! f = np.arange(1,n+1).cumprod() #x x^2 ... x^10 b = np.array([x]*n).cumprod() return 1+np.sum(b / f) ''' e^x = ln2 + (e^ln2)/1!*(x-ln2) + (e^ln2)/2!*(x-ln2)^2+... x = a*ln2 + b k<= z |b| <= 1/2ln2 a = ln( int( x/ln2 + 0.5 ) ) b = x-a*ln2 e^x = 2^a + e^b ''' def calc_e(x): reverse = False if x < 0:#处理负数 exp(-x) = 1/exp(x) x = -x reverse = True ln2 = 0.69314718055994530941723212145818 c = x/ln2 a = int(c+0.5) b = x-a*ln2 #2的a次方乘以e的b次幂 y = (2**a)*calc_e_small(b) if reverse: return 1/y return y if __name__ == '__main__': #-2到0 十个数 t1 = np.linspace(-2,0,10,endpoint=False) #0到2 二十个数 t2 = np.linspace(0,2,20) t = np.concatenate((t1,t2)) print(t)#横轴数据 y = np.empty_like(t) for i,x in enumerate(t): y[i] = calc_e(x) print('e^',x,'=',y[i],'(近似值)\t',math.exp(x)) mpl.rcParams['font.sans-serif'] = [u'SimHei'] mpl.rcParams['axes.unicode_minus'] = False plt.plot(t, y, 'r-', linewidth=2) plt.plot(t, y, 'go', linewidth=2) plt.title(u'Taylor展开式的应用', fontsize=18) plt.xlabel('X', fontsize=15) plt.ylabel('exp(X)', fontsize=15) plt.grid(True) plt.show()
来源:https://www.cnblogs.com/xiaochi/p/11236023.html