【问题标题】:implementation of using Maclaurin series of e^x in pythonpython中使用Maclaurin系列e^x的实现
【发布时间】:2020-10-30 03:34:39
【问题描述】:

我有 numpy 数组,我想使用像 e^x 的泰勒系列这样的幂级数,我想知道如何在 python 中实现它。为简单起见,我想我可以在x0=0 使用 maclaurin 系列,其中x 是 numpy 数组。基本上,我有 1 个暗像素向量,我想通过使用 e^x 的泰勒级数展开来非线性地展开每个像素值。换句话说,在输出向量中,每个像素将被替换为泰勒级数展开项的第一项和第二项。有什么想法可以在 python 中实现吗?

数学概念

这是我想要完成的简单数学概念,其中 nunmpy 数组预计将通过使用幂级数(如e^x 的麦克劳林级数)进行非线性扩展。

我的尝试

import numpy as np

arr= np.array([[120.0,24.0,12.0],[14.0,28.0,43.0]])
arr= arr/255.0

def maclurin_exp(x, power):
    res = x*0
    for i in range(power):
      res += x**i/math.factorial(i)
    return res

## test my code:
maclurin_exp(x=arr, power=3)

新更新 2

准确地说,Fe^x 的泰勒级数,x 是每个像素值,x0 是 0 处的近似点。例如,如果我们在 1 个暗淡向量中有 8 个像素,那么在我们使用 taylor每个像素值的一系列 e^x,泰勒展开的第一项和第二项将被视为输出。

如何在 python 中实现这一点?任何解决方法可以以更紧凑的方式完成e^x 的 Maclaurin 系列的实施?有什么想法吗?

预期输出

例如我们有 1 个暗像素向量 [1,2,3,4,5,6,7,8],然后我们应用上面的数学方程通过使用 e^x 的 maclurin 系列来近似每个像素值:

pixel = [1,2,3,4,5,6,7,8]

那么每个像素值的泰勒级数 e^x 的第一项和第二项将是我的最终输出。

【问题讨论】:

标签: python numpy pixel taylor-series


【解决方案1】:

根据更新后的定义,它可能是这样的:

def exp_taylor(x, x0=0, n_terms=2):
    f_a = np.exp(x0)
    terms = [f_a * ((x-x0)**i)/np.math.factorial(i) for i in range(n_terms)]
    return np.dstack(terms).ravel()

根据e^(x) 围绕a 的扩展是e^(a) + e^(a)(x-a) + e^(a)(x-a)^2/2! 等等。然后dstackravel 的组合将这些术语交织成一个向量。所以如果你有[np.array([a0,b0,c0]), np.array([a1,b1,c1])],它会将它们合并到np.array([a0,a1,b0,b1,c0,c1])

x = np.array([1, 1, 2, 3, 5, 8, 13, 21])
x_ = exp_taylor(x, x0=1, n_terms=3)
print(x_)
>>>
[  2.71828183   0.           0.           2.71828183   0.
   0.           2.71828183   2.71828183   1.35914091   2.71828183
   5.43656366   5.43656366   2.71828183  10.87312731  21.74625463
   2.71828183  19.0279728   66.5979048    2.71828183  32.61938194
 195.71629165   2.71828183  54.36563657 543.65636569]

【讨论】:

    【解决方案2】:
    import numpy as np
    import math
    
    
    def maclurin_exp(x, power):
        res = np.zeros_like(x)
        for i in range(power):
            res += x ** i / np.float(math.factorial(i))
        return res
    
    
    def maclurin_test():
        arr = np.array([[120.0, 24.0, 12.0], [14.0, 28.0, 43.0]])
        arr = arr / 255.0
        # arr = np.array([0, 1, 2], dtype=np.float)
    
        power = 10
        mc_result = maclurin_exp(arr, power)
        exp_result = np.exp(arr)
    
        diff = np.abs(mc_result - exp_result)
        return diff
    
    if __name__ == "__main__":
        print(maclurin_test())
    

    输出:

    [[1.53308255e-10 2.22044605e-16 2.22044605e-16] [4.44089210e-16 2.22044605e-16 5.32907052e-15]]

    意思是小的非零差异 您的主要问题是没有转换阶乘,从而导致整数除法。

    【讨论】:

    • 除非您仍在使用 Python 2,否则整数除法工作正常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 2016-02-29
    • 2017-01-15
    • 1970-01-01
    相关资源
    最近更新 更多