在 python 中使用 e^x 的麦克劳林级数的实现
implementation of using Maclaurin series of e^x in python
我有 numpy 数组,我想使用幂级数,例如 e^x
的泰勒级数,我想知道如何在 python 中实现它。为了简单起见,我想我可以在 x0=0
处使用麦克劳林级数,其中 x
是 numpy 数组。基本上,我有 1 个暗像素向量,我想通过使用 e^x 的泰勒级数展开来非线性展开每个像素值。换句话说,在输出向量中,每个像素将被替换为泰勒级数展开项的第一项和第二项。想在 python 中实现这一目标吗?
数学概念:
这是我想要完成的简单数学概念,其中 numpy 数组预计会通过使用幂级数进行非线性扩展,例如 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:
准确地说,F
是e^x
的泰勒级数,x
是每个像素值,x0
是0点的逼近点。比如我们有8个像素在一个昏暗的向量中,然后在我们为每个像素值使用泰勒级数 e^x 之后,泰勒展开的第一项和第二项将被视为输出。
如何在 python 中实现这一点?以更紧凑的方式为 e^x
实现麦克劳林级数的任何解决方法?有什么想法吗?
预期输出
例如我们有1个dim像素向量[1,2,3,4,5,6,7,8]
,然后我们应用上面的数学方程通过e^x的maclurin系列来近似每个像素值:
pixel = [1,2,3,4,5,6,7,8]
那么每个像素值的 e^x 泰勒级数的第一项和第二项将是我的最终输出。
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]]
意思是小的非零差异
您的主要问题不是转换阶乘,从而导致整数除法。
根据更新后的定义,它可能是这样的:
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!
等等。 dstack
和 ravel
的组合然后将这些项交织成一个向量。因此,如果您有 [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]
我有 numpy 数组,我想使用幂级数,例如 e^x
的泰勒级数,我想知道如何在 python 中实现它。为了简单起见,我想我可以在 x0=0
处使用麦克劳林级数,其中 x
是 numpy 数组。基本上,我有 1 个暗像素向量,我想通过使用 e^x 的泰勒级数展开来非线性展开每个像素值。换句话说,在输出向量中,每个像素将被替换为泰勒级数展开项的第一项和第二项。想在 python 中实现这一目标吗?
数学概念:
这是我想要完成的简单数学概念,其中 numpy 数组预计会通过使用幂级数进行非线性扩展,例如 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:
准确地说,F
是e^x
的泰勒级数,x
是每个像素值,x0
是0点的逼近点。比如我们有8个像素在一个昏暗的向量中,然后在我们为每个像素值使用泰勒级数 e^x 之后,泰勒展开的第一项和第二项将被视为输出。
如何在 python 中实现这一点?以更紧凑的方式为 e^x
实现麦克劳林级数的任何解决方法?有什么想法吗?
预期输出
例如我们有1个dim像素向量[1,2,3,4,5,6,7,8]
,然后我们应用上面的数学方程通过e^x的maclurin系列来近似每个像素值:
pixel = [1,2,3,4,5,6,7,8]
那么每个像素值的 e^x 泰勒级数的第一项和第二项将是我的最终输出。
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]]
意思是小的非零差异 您的主要问题不是转换阶乘,从而导致整数除法。
根据更新后的定义,它可能是这样的:
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!
等等。 dstack
和 ravel
的组合然后将这些项交织成一个向量。因此,如果您有 [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]