我编写了一个 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 )
通常我们会要求用户在询问错误时包含完整的回溯。
在
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
来理解这个问题,但它比“不会集成”提供更多信息。
我发现问题是由我使用“1j”代表“i”引起的。我将其更改为“I”,现在可以使用了。
导致错误:
Ey = E_0 * smp.exp( 1j * (wavenumber*X - w*t ))
工作正常:
Ey = E_0 * smp.exp( I * (wavenumber*X - w*t ))