如何在不进行评估的情况下定义长符号表达式的实部/虚部?

时间:2016-09-09 11:29:22

标签: python numpy math plot sympy

我是python的新手,遇到了问题。我定义了复杂的方程,它们是参数a,b的函数,并使用hold = true来节省计算时间。例如,我已根据其他数量A,B,C,D,E,F,as,

定义了g
In [92]: g=sympy.MatAdd(sympy.MatMul(A, B), \
    ...:     sympy.MatMul(C, D, hold=sympy.true), \
    ...:     sympy.MatMul(E, F, hold=sympy.true), hold=sympy.true)

我想定义新的数量,它们是虚部和实部的比例。例如,α= Im(g)/ Re(g)。我通过以下方式尝试了这个,

In [93]: alpha=sympy.im(g)/sympy.re(g)

,但我收到了错误,

In [94]: alpha=sympy.im(g)/sympy.re(g)
Traceback (most recent call last):

  File "<ipython-input-94-e3054aea27cc>", line 1, in <module>
    alpha=sympy.im(g)/sympy.re(g)

  File "C:\Anaconda3\lib\site-packages\sympy\core\function.py", line 385, in __new__
    result = super(Function, cls).__new__(cls, *args, **options)

  File "C:\Anaconda3\lib\site-packages\sympy\core\function.py", line 209, in __new__
    evaluated = cls.eval(*args)

  File "C:\Anaconda3\lib\site-packages\sympy\functions\elementary\complexes.py", line 158, in eval
    coeff = term.as_coefficient(S.ImaginaryUnit)

AttributeError: 'MatAdd' object has no attribute 'as_coefficient'

即使这是成功的,但我怀疑我是否想等待它完成。我的第一个问题是 - 如何在第93行修复定义,同时抑制评估?

提供这个可以以某种方式完成,我想定义f(alpha(a,b),beta(a,b)),其中beta的定义与alpha类似。我想然后绘制a和b,使得f = 0。我觉得这样的事情会起作用,

p1=sympy.plot_implicit(f(alpha(a,b),beta(a,b)),(a,0,2.5),(b,0,4))

这是最有效的方法还是更好的方法?

我在考虑使用lambdify来定义g_num,

g_num=sympy.lambdify((a,b), g, 'numpy')

之后定义一个lambda函数

lambda a,b,delta : f(alpha(a,b), beta(a,b))

但后来我不知道如何用这种方法获得隐式图f(a,b)= 0。

1 个答案:

答案 0 :(得分:1)

hold=True不是真正的SymPy选项。你想要evaluate=False。请注意,MatMul默认情况下尚未评估。

reimpresently定义为对标量而非矩阵进行操作。这就是你得到错误的原因。使用re(g, evaluate=False)应该有效,因为来自NumPy的lambdified re将只在数组上广播。