在python中使用e^x的Maclaurin系列的实现

2024-07-02 13:37:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

数学概念

这是我想要实现的简单数学概念,其中nunmpy数组预期通过使用幂级数(如e^x的maclaurin级数)进行非线性扩展

enter image description here

我的尝试

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个像素,那么在我们对每个像素值使用e^x的泰勒级数之后,泰勒展开的第一项和第二项将被视为输出

enter image description here

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

预期产出

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

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

然后,对于每个像素值,e^x的泰勒级数的第一项和第二项将是我的最终输出


Tags: numpy概念npres数学像素数组向量
2条回答

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

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()

a周围的e^(x)的扩展是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]
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]]

意味着小的非零差异 您的主要问题是没有强制转换阶乘,因此导致整数除法

相关问题 更多 >