python写泰勒展开式

霸气de小男生 提交于 2020-03-22 06:59:49
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()

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!