将python numpy复杂表达式简化为实部和虚部

时间:2018-05-07 14:41:48

标签: numpy

表达式Exp(it) - Exp(6it)/ 2 + i Exp(-14it)/ 3,t为2 * pi用于绘制神秘曲线,如http://www.johndcook.com/blog/2015/06/03/mystery-curve/中所述 有一个python numpy列表来绘制这条曲线。我想使用像任何基本语言一样的过程语言来绘制这个公式。所以我把这个公式提供给了Wolfram Alpha,如下所示:
简化Exp(it) - Exp(6it)/ 2 + i Exp(-14it)/ 3
并将结果输出为:

1/3 sin(14 t)+ cos(t)-1/2 cos(6 t)+ i(sin(t)-1/2 sin(6 t)+1/3 cos(14 t) )

所以在基本语言中我使用了这样的简化:
x = Cos(t)-cos(k * t)/ 2 + Sin(14 * t)/ 3
y = Cos(14 * t)/ 3 + Sin(t)-Sin(k * t)/ 2

结果与引用页面中列出的python numpy代码完全相同 我的问题是,如何从wolfram alpha网站获得真实和想象的部分来自numpy? 所以它告诉我们实部是Cos(t) - Cos(k * t)/ 2 + Sin(14 * t)/ 3,而想象部分是Cos(14 * t)/ 3 + Sin(t) - 罪(k * t)/ 2。或类似的东西。

1 个答案:

答案 0 :(得分:1)

In [37]: def f(t):
    ...:     return np.exp(1j*t) - np.exp(6j*t)/2 + 1j*np.exp(-14j*t)/3

In [39]: t = np.linspace(0,2*np.pi, 10)
In [40]: t
Out[40]: 
array([0.        , 0.6981317 , 1.3962634 , 2.0943951 , 2.7925268 ,
       3.4906585 , 4.1887902 , 4.88692191, 5.58505361, 6.28318531])
In [41]: f(t)
Out[41]: 
array([ 0.5       +0.33333333j,  0.90203773+0.76256944j,
        0.63791071+0.8071432j , -1.28867513+0.69935874j,
       -0.36142337+0.83291557j, -1.01796187-0.71715012j,
       -0.71132487-1.03269207j,  0.20938564-0.2964469j ,
        1.13005116-1.38903119j,  0.5       +0.33333333j])

此计算的结果是具有复杂dtype的数组。也就是说,数组的元素是复数。

基本上这是因为np.exp函数在给出一个虚构的参数时返回一个复数值:

In [44]: np.exp(1j*1)
Out[44]: (0.5403023058681398+0.8414709848078965j)

使用realimag属性轻松选择这些复数的np.real()real部分:

In [42]: f(t).real
Out[42]: 
array([ 0.5       ,  0.90203773,  0.63791071, -1.28867513, -0.36142337,
       -1.01796187, -0.71132487,  0.20938564,  1.13005116,  0.5       ])
In [43]: f(t).imag
Out[43]: 
array([ 0.33333333,  0.76256944,  0.8071432 ,  0.69935874,  0.83291557,
       -0.71715012, -1.03269207, -0.2964469 , -1.38903119,  0.33333333])

Out[44]可以通过以下方式复制:

In [46]: np.cos(1) + 1j*np.sin(1)
Out[46]: (0.5403023058681398+0.8414709848078965j)

np.exp的文档表明此扩展正在内部使用,

  

对于复杂的参数,x = a + ib,我们可以写e ^ x = e ^ a e ^ {ib}。第一个词e ^ a已经知道(这是真正的论据,如上所述)。第二项e ^ {ib}是\ cos b + i \ sin b,一个大小为1且周期相位的函数。

但是numpy没有任何进行符号(代数)计算的机制。它直接与复数而不是代数表达式一起使用。

使用sympy,一个Python符号数学包:

In [1]: import sympy

In [3]: fn = sympy.sympify('exp(1j*re(x)) -exp(6j*re(x))/2 + 1j*exp(-14j*re(x))/3')
   ...: 
In [4]: fn
Out[4]: -exp(6*I*re(x))/2 + exp(I*re(x)) + I*exp(-14*I*re(x))/3
In [5]: fn.as_real_imag()
Out[5]: 
(sin(14*re(x))/3 + cos(re(x)) - cos(6*re(x))/2,
 sin(re(x)) - sin(6*re(x))/2 + cos(14*re(x))/3)

我必须使用re(x)x变量限制为真实。否则它会将表达式扩展为

exp(14*im(x))*sin(14*re(x))/3 ...