当我调用Integrate(向量表达式,t)时Python抛出错误

问题描述 投票:0回答:2

我编写了一个 Python 程序来根据给定的时变电场计算磁场。我使用 sympy.vector 中的 CoordSys3d

我今天下午就开始工作了。它给出了正确的答案。然后,我升级到最新版本的 Anaconda(更新了 SymPy 库),现在当我调用Integrate()时它会抛出错误。

这是错误回溯:

>>> integrate( jimmy, t )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 1573, in integrate
    new_args = [a.doit(**doit_flags) if isinstance(a, Integral) else a
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 1573, in <listcomp>
    new_args = [a.doit(**doit_flags) if isinstance(a, Integral) else a
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 597, in doit
    antideriv = self._eval_integral(
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/integrals.py", line 941, in _eval_integral
    result, i = risch_integrate(f, x, separate_integral=True,
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/risch.py", line 1831, in risch_integrate
    ans, i, b = integrate_hyperexponential(fa, fd, DE, conds=conds)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/risch.py", line 1564, in integrate_hyperexponential
    qa, qd, b = integrate_hyperexponential_polynomial(pp, DE, z)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/risch.py", line 1516, in integrate_hyperexponential_polynomial
    va, vd = rischDE(iDta, iDtd, Poly(aa, DE.t), Poly(ad, DE.t), DE)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/rde.py", line 774, in rischDE
    _, (fa, fd) = weak_normalizer(fa, fd, DE)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/integrals/rde.py", line 126, in weak_normalizer
    r = (a - Poly(z, DE.t)*derivation(d1, DE)).as_poly(DE.t).resultant(
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/polys/polytools.py", line 65, in wrapper
    return func(f, g)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/polys/polytools.py", line 4104, in __sub__
    return f.sub(g)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/polys/polytools.py", line 1464, in sub
    _, per, F, G = f._unify(g)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/polys/polytools.py", line 465, in _unify
    dom, lev = f.rep.dom.unify(g.rep.dom, gens), len(gens) - 1
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/polys/domains/domain.py", line 686, in unify
    return K0.unify_with_symbols(K1, symbols)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/polys/domains/domain.py", line 666, in unify_with_symbols
    return K0.unify(K1)
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/polys/domains/domain.py", line 725, in unify
    domain = domain.get_ring()
  File "/opt/anaconda3/lib/python3.8/site-packages/sympy/polys/domains/complexfield.py", line 98, in get_ring
    raise DomainError("there is no ring associated with %s" % self)
sympy.polys.polyerrors.DomainError: there is no ring associated with CC

这是代码:


import numpy as np
import sympy as smp
import matplotlib.pyplot as plt

from sympy import *
from sympy import symbols
from sympy.vector import divergence
from sympy.vector import curl
from sympy import diff
from sympy import exp
from sympy import integrate

from sympy.vector import CoordSys3D


R = CoordSys3D('R')

#  Variables
X, Y, Z = symbols('X Y Z')
X = R.x
Y = R.y
Z = R.z

#  Basis Unit Vectors
i,j,k = symbols('i j k')
i = R.i
j = R.j
k = R.k

#  Symbols
x,t = symbols('x t')

Ex = smp.Function('Ex')(x,t)
Ey = smp.Function('Ey')(x,t)
Ez = smp.Function('Ez')(x,t)

wavenumber = symbols('k')
E_0 = symbols('E_0')         #  Amplitude of E field
w = symbols('w' , real=True, positive=True)



#  Define Ey(x,t)
Ey = E_0 * smp.exp( 1j * (wavenumber*X - w*t ))

#  The Electric Field
E = Ex*i + Ey*j + Ez*k



init_printing(use_unicode=True, wrap_line=False)



#  curl E   =   - dB/dt
#  integrate( (curl E) , t )   =   - B


jimmy = curl( E )
B = -integrate( jimmy, t )
pprint( B )
B = -integrate( jimmy, t ).doit()
pprint( B )
python vector sympy symbolic-integration
2个回答
0
投票

通常我们会要求用户在询问错误时包含完整的回溯。

sympy
上下文中,当结果是包含积分符号的表达式时,我希望看到“不会积分”描述。类似地,对于“无法解决”结果,结果是原始表达式,或者是勉强简化的表达式。

您的情况是一个实际错误。

In [6]: jimmy = curl( E, R )

In [7]: jimmy
Out[7]: 
            1.0⋅ⅈ⋅(Rₓ⋅k - t⋅w)
1.0⋅ⅈ⋅E₀⋅k⋅ℯ                   r_z


In [8]: smp.integrate( jimmy, t )
/usr/local/lib/python3.8/dist-packages/sympy/core/sympify.py:456: SymPyDeprecationWarning: 

String fallback in sympify has been deprecated since SymPy 1.6. Use
sympify(str(obj)) or sympy.core.sympify.converter or obj._sympy_
instead. See https://github.com/sympy/sympy/issues/18066 for more
info.

  SymPyDeprecationWarning(
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
ValueError: Error from parse_expr with transformed code: "Float ('1.0' )*I *Symbol ('E_0' )*Symbol ('k' )*exp (Float ('1.0' )*I *(Symbol ('R_x' )*Symbol ('k' )-Symbol ('t' )*Symbol ('w' )))*Symbol ('R' ).z "

The above exception was the direct cause of the following exception:

AttributeError                            Traceback (most recent call last)
<ipython-input-8-8d40c4ce949f> in <module>
----> 1 smp.integrate( jimmy, t )

/usr/local/lib/python3.8/dist-packages/sympy/integrals/integrals.py in integrate(meijerg, conds, risch, heurisch, manual, *args, **kwargs)
   1566         'manual': manual
   1567         }
-> 1568     integral = Integral(*args, **kwargs)
   1569 
   1570     if isinstance(integral, Integral):

/usr/local/lib/python3.8/dist-packages/sympy/integrals/integrals.py in __new__(cls, function, *symbols, **assumptions)
     89                 useinstead="the as_expr or integrate methods of Poly").warn()
     90 
---> 91         obj = AddWithLimits.__new__(cls, function, *symbols, **assumptions)
     92         return obj
     93 

/usr/local/lib/python3.8/dist-packages/sympy/concrete/expr_with_limits.py in __new__(cls, function, *symbols, **assumptions)
    496 
    497     def __new__(cls, function, *symbols, **assumptions):
--> 498         pre = _common_new(cls, function, *symbols, **assumptions)
    499         if type(pre) is tuple:
    500             function, limits, orientation = pre

/usr/local/lib/python3.8/dist-packages/sympy/concrete/expr_with_limits.py in _common_new(cls, function, *symbols, **assumptions)
     23     (function, limits, orientation). This code is common to
     24     both ExprWithLimits and AddWithLimits."""
---> 25     function = sympify(function)
     26 
     27     if isinstance(function, Equality):

/usr/local/lib/python3.8/dist-packages/sympy/core/sympify.py in sympify(a, locals, convert_xor, strict, rational, evaluate)
    477     try:
    478         a = a.replace('\n', '')
--> 479         expr = parse_expr(a, local_dict=locals, transformations=transformations, evaluate=evaluate)
    480     except (TokenError, SyntaxError) as exc:
    481         raise SympifyError('could not parse %r' % a, exc)

....

AttributeError: 'Symbol' object has no attribute 'z'

所以同时:

In [9]: R.z
Out[9]: r_z

它已将其替换为:

In [10]: parse_expr(Symbol ('R' ).z)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-10-60a85cf12db4> in <module>
----> 1 parse_expr(Symbol ('R' ).z)

AttributeError: 'Symbol' object has no attribute 'z'

我不太了解

sympy
来理解这个问题,但它比“不会集成”提供更多信息。


0
投票

我发现问题是由我使用“1j”代表“i”引起的。我将其更改为“I”,现在可以使用了。

导致错误:

Ey = E_0 * smp.exp( 1j * (wavenumber*X - w*t ))

工作正常:

Ey = E_0 * smp.exp( I * (wavenumber*X - w*t ))
© www.soinside.com 2019 - 2024. All rights reserved.