我是python的新手,遇到了问题。我定义了复杂的方程,它们是参数a,b的函数,并使用hold = true来节省计算时间。例如,我已根据其他数量A,B,C,D,E,F,as,
定义了gIn [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。
答案 0 :(得分:1)
hold=True
不是真正的SymPy选项。你想要evaluate=False
。请注意,MatMul
默认情况下尚未评估。
re
和im
仅presently定义为对标量而非矩阵进行操作。这就是你得到错误的原因。使用re(g, evaluate=False)
应该有效,因为来自NumPy的lambdified re
将只在数组上广播。