zoukankan      html  css  js  c++  java
  • python写泰勒展开式

    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],'(近似值)	',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()
  • 相关阅读:
    分块
    BZOJ 2957 楼房重建-线段树
    [NOI2016]区间-线段树
    [ZJOI2007]矩阵游戏-二分图匹配
    BZOJ3714 [PA2014]Kuglarz -最小生成树
    HNOI2005狡猾的商人-差分约束系统
    Android开发之带你轻松集成友盟统计
    Android6.0动态申请权限
    Android6.0动态权限申请
    极光推送JPush的快速集成
  • 原文地址:https://www.cnblogs.com/xiaochi/p/11236023.html
Copyright © 2011-2022 走看看