Python 为什么Sympy.Norm()不将实值符号视为实数?为什么Sympy积分声称0.25不能用a*x**b的形式表示?

Python 为什么Sympy.Norm()不将实值符号视为实数?为什么Sympy积分声称0.25不能用a*x**b的形式表示?,python,sympy,Python,Sympy,我有两个问题,我想解决,我与我的代码 问题1: 正如您在下面的代码中所看到的,我想找到向量的范数,并将“t”和“L”声明为实符号,但输出似乎将变量“t”和“L”视为复杂变量,尽管它们声明为实变量。在使用.norm()函数时,如何将变量视为实数? 代码: 输出: sqrt(Abs(cos(2*t*L)/(sin(2*t*L) + 1))**2 + 1) 结果应该是这样的(或者至少是一个简化程度较低的版本): 问题2: 这是一个由两部分组成的问题。对于第一部分,我收到一条错误消息,指出当我尝试进行

我有两个问题,我想解决,我与我的代码

问题1: 正如您在下面的代码中所看到的,我想找到向量的范数,并将“t”和“L”声明为实符号,但输出似乎将变量“t”和“L”视为复杂变量,尽管它们声明为实变量。在使用.norm()函数时,如何将变量视为实数?

代码:

输出:

sqrt(Abs(cos(2*t*L)/(sin(2*t*L) + 1))**2 + 1)
结果应该是这样的(或者至少是一个简化程度较低的版本):

问题2: 这是一个由两部分组成的问题。对于第一部分,我收到一条错误消息,指出当我尝试进行此积分时,0.25不能用
a*x**b
的形式表示,即使0.25可以用
a*x**b
的形式表示,其中a=1,x=2,b=-2;如何解决此错误?当我把它应用到更广义的矩阵时,同样的积分实际上是有效的。对于特定情况,我将“a”设置为0.1,否则“a”将是一个真正的非负符号。

广义矩阵:

x=Matrix([[-2*a*sin(t*L)**2+a+sin(t*L)**2,I*(2*a-1)*sin(2*t*L)/2],[I*(1- 2*a)*sin(2*t*L)/2,-2*a*cos(t*L)**2+a+cos(t*L)**2]])
特定矩阵(其中a=0.1):

特定矩阵的代码:

from sympy import Symbol
from sympy import Matrix
from sympy import cos
from sympy import sin
from sympy import exp
from sympy import I
from sympy import diff
from sympy import integrate
from sympy import oo

L=Symbol("L",real=True)
t=Symbol("t",real=True,nonnegative=True)
a=Symbol("a",real=True,nonnegative=True)
k=Symbol("k")

x=Matrix([[0.5-0.4*cos(2*t*L),-0.4*I*sin(2*t*L)],[0.4*I*sin(2*t*L),0.4*cos(2*t*L)+0.5]])
y=diff(x,L)
z=2*integrate(exp(-x*k)*(y*exp(-x*k)),(k,0,oo))
print(z)
该特定情况下产生的矩阵“z”应为:

Matrix([[1.6*t*sin(2*t*L),-1.6*I*t*cos(2*t*L)],[1.6*I*t*cos(2*t*L),-1.6*t*sin(2*t*L)]])
但是,我收到以下错误消息:

Traceback (most recent call last):

  File "/Users/mk/Documents/MD/P.py", line 39, in <module>
    z=2*integrate(exp(-x*k)*(y*exp(-x*k)),(k,0,oo))

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 1545, in integrate
    return integral.doit(**doit_flags)

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 447, in doit
    return function.applyfunc(

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/matrices/common.py", line 1862, in applyfunc
    return self._eval_applyfunc(f)

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/matrices/common.py", line 1802, in _eval_applyfunc
    out = self._new(self.rows, self.cols, [f(x) for x in self])

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/matrices/common.py", line 1802, in <listcomp>
    out = self._new(self.rows, self.cols, [f(x) for x in self])

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 448, in <lambda>
    lambda f: self.func(f, self.limits).doit(**hints))

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 577, in doit
    ret = try_meijerg(function, xab)

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 549, in try_meijerg
    res = meijerint_definite(function, x, a, b)

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 1818, in meijerint_definite
    res = _meijerint_definite_2(f, x)

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 1927, in _meijerint_definite_2
    res = _meijerint_definite_3(g, x)

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 1944, in _meijerint_definite_3
    ress = [_meijerint_definite_4(g, x) for g in f.args]

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 1944, in <listcomp>
    ress = [_meijerint_definite_4(g, x) for g in f.args]

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 1997, in _meijerint_definite_4
    gs = _rewrite2(f, x)

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 1583, in _rewrite2
    if any(_rewrite_single(expr, x, False) is None for expr in _mul_args(g)):

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 1583, in <genexpr>
    if any(_rewrite_single(expr, x, False) is None for expr in _mul_args(g)):

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 1471, in _rewrite_single
    r1 = _get_coeff_exp(unpolarify(fac.subs(subs).subs(z, x),

  File "/Users/mk/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/meijerint.py", line 338, in _get_coeff_exp
    raise _CoeffExpValueError('expr not of form a*x**b: %s' % expr)

_CoeffExpValueError: expr not of form a*x**b: 0.250000000000000
而不是一路简化到:

Matrix([[2*t*(1-2*a)*sin(2*t*L),2*I*t*(2*a-1)*cos(2*t*L)],[2*I*t*(1-2*a)*cos(2*t*L),2*t*(2*a-1)*sin(2*t*L)]])

当我使用另一个公式来求“z”时,我得到了进一步的简化版本,但我想坚持使用这个公式,因为它更一般化。有没有一种方法可以在仍然使用此公式的情况下接收更简化的矩阵?

您对假设非常谨慎,但Symphy没有对表达式进行特殊处理,以将其识别为非负。但是,您可以通过将该表达式替换为具有该假设的单个符号来推动它,让Abs自动简化,删除临时符号,然后触发SIMP以获得预期结果:

>>> from sympy import Dummy
>>> nn = Dummy(nonnegative=True)
>>> eq = sqrt(Abs(cos(2*L*t)/(sin(2*L*t) + 1))**2 + 1)
>>> eq.subs(sin(2*L*t) + 1,nn).subs(nn,sin(2*L*t) + 1)
sqrt(1 + cos(2*L*t)**2/(sin(2*L*t) + 1)**2)
>>> trigsimp(_)
sqrt(2)*sqrt(1/(sin(2*L*t) + 1))
在我为这种行为打开的上给出了一个更健壮的解决方案(变通)。但对于您的具体情况,您似乎希望有一个表达式,在重要的上下文中(如
sqrt
abs
),trig函数的值永远不会为+/-1。也许这将满足该要求:

def trig_ne1(q):
  from sympy import cos, sin, tanh
  t = [i for i in q.atoms(cos, sin, tanh) if i.is_real]
  reps = dict(zip(t,[Dummy(positive=1)-1 for i in t]))
  qs = q.xreplace(reps)
  qs = qs.xreplace({v+1:k+1 for k,v in reps.items()})
  reps = dict(zip(t,[Dummy(negative=1)+1 for i in t]))
  qs = q.xreplace(reps)
  qs = qs.xreplace({v-1:k-1 for k,v in reps.items()})
  return qs

请去掉称呼语。不要用这么多粗体字。尽量在页面上节省空间。你的答案有一些格式问题(特别是打字错误)。试着改善这一点来澄清问题。[提示]:对路径和代码片段使用
`
括号。要从新行开始,请在行尾使用双空格-问题比在任何地方使用
Enter
都要清楚得多。@maciejwww我已经做了这些编辑。这是我关于堆栈溢出的第一篇文章。变量L是实的,但不是非负的,所以这个解决方案仍然适用,还是我应该使用另一个链接中的变通方法?另外,当我添加以下代码行时,
xx=trigsimp(z)
y=xx*Dagger(xx)
zz=(Dagger(xx)*(x*xx))[0,0]
print(simplify(zz))
在使用您的解决方案后,我得到以下输出:
0.5*sqrt(1/(sin(2*L*t)+1))*共轭(1/(sin(sin(2*L*t))
)。工作循环的输出比该溶液的输出长得多,但也包含共轭物。有没有一种方法可以去除共轭,从而将其简化为0.5(因为t和L都是实的)?将
trig_nonneg
(从参考问题页面)应用到共轭的结果,它将简化为0.5这是trig_nonneg函数的输出:
(I*(-sqrt(-sin(2*L*t)-1)*(-2*a*sin L*t)**2+2*b*sin L*t)**2-b+1.0 2-b+1.2 2-b+1.0 2-b+2-2-b+2-2-b+2-b+1-2-b+2-b+1.0 b+2-2-b+1.0级b+2-b+1.0)**cos(2*L*L*t*t十十十十十十十十十十十十十十十十十个)及(2*b b+2-2-b+2-2-b+2-2-2-b+2-2-2-b+1.b+1.0)b+2-2-2-2-2-2-2-2-b+2-2-2-2-2-b+1.b+2-1.b+1.2-2-1.2-1.2-1.b+1.0 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10 10共轭(1/sqrt(sin(2*L*t)+1))/(4*(sin(2*L*t)+1))
触发非负(0.5*sqrt(1/(sin(2*L*t)+1))*共轭(1/sqrt(1/(sin(2*L*t)+1))->0.500000000000000
共轭不能简化的原因是不确定
sqrt(2*L*t)!=-1
;如果您只关心该情况,则修改
trig_nonneg
(对于“trig大于或等于负1”,应称为
trig_gen1
),以使用
正的
假设,而不是
非负的
。这样做并应用于包含共轭的长表达式,然后应用trigsimp得到0.5。
Matrix([I*t*(2*a*exp(4*I*t*L)-2*a-exp(4*I*t*L)+1)*exp(-2*I*t*L),I*t*(2*a*exp(4*I*t*L)+2*a-exp(4*I*t*L)-1)*exp(-2*I*t*L)],[I*t*(-2*a*exp(4*I*t*L)-2*a+exp(4*I*t*L)+1)*exp(-2*I*t*L),I*t*(-2*a*exp(4*I*t*L)+2*a+exp(4*I*t*L)-1)*exp(-2*I*t*L)]])
Matrix([[2*t*(1-2*a)*sin(2*t*L),2*I*t*(2*a-1)*cos(2*t*L)],[2*I*t*(1-2*a)*cos(2*t*L),2*t*(2*a-1)*sin(2*t*L)]])
>>> from sympy import Dummy
>>> nn = Dummy(nonnegative=True)
>>> eq = sqrt(Abs(cos(2*L*t)/(sin(2*L*t) + 1))**2 + 1)
>>> eq.subs(sin(2*L*t) + 1,nn).subs(nn,sin(2*L*t) + 1)
sqrt(1 + cos(2*L*t)**2/(sin(2*L*t) + 1)**2)
>>> trigsimp(_)
sqrt(2)*sqrt(1/(sin(2*L*t) + 1))
def trig_ne1(q):
  from sympy import cos, sin, tanh
  t = [i for i in q.atoms(cos, sin, tanh) if i.is_real]
  reps = dict(zip(t,[Dummy(positive=1)-1 for i in t]))
  qs = q.xreplace(reps)
  qs = qs.xreplace({v+1:k+1 for k,v in reps.items()})
  reps = dict(zip(t,[Dummy(negative=1)+1 for i in t]))
  qs = q.xreplace(reps)
  qs = qs.xreplace({v-1:k-1 for k,v in reps.items()})
  return qs