реализация использования серии Маклорена e ^ x в python - PullRequest
5 голосов
/ 09 июля 2020

У меня есть массив numpy, и я хочу использовать степенные серии, такие как серия Тейлора e^x, и мне интересно, как реализовать это в python. Для простоты я думаю, что могу использовать серию маклорена в x0=0, где x - это массив numpy. В принципе, у меня есть 1 тусклый пиксельный вектор, и я хочу нелинейно расширить каждое значение пикселя, используя расширение серии Тейлора для e ^ x. Другими словами, в выходном векторе каждый пиксель будет заменен первым и вторым членами члена расширения ряда Тейлора. Любая идея сделать это в python?

математической концепции :

вот простая математическая концепция, которую я хочу реализовать sh, где nunmpy array is ожидается, что он будет нелинейно расширен за счет использования степенных рядов, таких как ряд маклорена e^x.

enter image description here

my attempt:

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)

new update 2:

Precisely, F is taylor series of e^x, x is each pixel value, x0 is approximation point at 0. For example if we have 8 pixel in 1 dim vector, then after we used taylor series of e^x for each pixel value, first and second term of taylor expansion will be considered as ouput.

введите описание изображения здесь

как сделать это в python? какой обходной путь для достижения sh реализации серии Maclaurin для e^x более компактным способом? любая мысль?

ожидаемый результат

например, у нас есть 1 тусклый вектор пикселей [1,2,3,4,5,6,7,8], затем мы применяем математическое уравнение выше для аппроксимации каждого значения пикселя с помощью серии маклурина of e ^ x:

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

, то первый и второй член ряда Тейлора e ^ x для каждого значения пикселя будет моим окончательным результатом.

Ответы [ 2 ]

3 голосов
/ 15 июля 2020

Согласно обновленному определению, это может быть что-то вроде этого:

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]
2 голосов
/ 14 июля 2020
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]]

означает небольшое отличное от нуля. Ваша основная проблема заключалась не в приведении факториала, что приводило к целочисленному делению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...