我有一个看起来像的照片:
Poly(0.764635937801645*I**4 + 7.14650839258644*I**3 - 0.667712176660315*I**2 - 2.81663805543677*I - 0.623299856233272, I, domain='RR')
我正在使用以下代码转换为mpc:
a = val.subs('I',1.0j)
b = sy.re(a)
c = sy.im(a)
d = mpmath.mpc(b,c)
两个问题。
a
到d
的转换是否存在精度损失?除此之外:同情似乎在这里对待我就像一个符号。如何简化此多项式?
编辑:我也注意到以下内容代替上面的a
:
a = val.args[0]
答案 0 :(得分:1)
问题的根本原因见于val.subs('I', 1.0j)
- 您似乎将字符串作为参数传递给SymPy函数。这有一些有效的用途(例如创建高精度浮点数),但是当涉及到符号时,使用字符串会导致混淆。字符串' I'隐式转换为SymPy表达式Symbol('I')
,这与SymPy表达式I
不同。 <答案
如何简化此多项式?
是重新审视创建该多项式的过程,并修复它。如果您确实需要从字符串创建它,请使用locals
参数:
>>> S('3.3*I**2 + 2*I', locals={'I': I})
-3.3 + 2*I
如果不需要Poly结构,请使用Poly的as_expr()
方法从中获取表达式。
使用从a到d的转换是否存在精度损失
是的,分成实部和虚部,然后重新组合可能导致精度损失。将SymPy对象直接传递给mpc
,如果您知道它是一个复数。或者mpmathify
如果你想要mpmath来决定它应该具有什么类型。一个例子:
>>> val = S('1.111111111111111111111111111111111111111111111111')*I**3 - 2
>>> val
-2 - 1.111111111111111111111111111111111111111111111111*I
>>> import mpmath
>>> mpmath.mp.dps = 40
>>> mpmath.mpc(val)
mpc(real='-2.0', imag='-1.111111111111111111111111111111111111111111')
>>> mpmath.mpmathify(val)
mpc(real='-2.0', imag='-1.111111111111111111111111111111111111111111')
>>> mpmath.mpc(re(val), im(val))
mpc(real='-2.0', imag='-1.111111111111111111111111111111111111111114')
观察:
I**3
评估佛-I
,你不必做任何事情来实现它。 S
代表sympify
。也可以更直接地使用Float('1.1111111111111111111111111')
以上大部分内容只是围绕XY问题进行讨论。你对我的表达并不是你想象的那样,所以你试图做一些不需要的奇怪事情,而我的答案主要是浪费时间。
答案 1 :(得分:0)
我在这里添加了自己的答案,因为FTP的答案虽然相关且非常有帮助,却没有(直接)解决我的问题(从问题tbh来看并不清楚) 。当我在他的例子中运行代码时,我得到了以下内容:
>>> from sympy import *
>>> import mpmath
>>> val = S('1.111111111111111111111111111111111111111111111111')*I**3 - 2
>>> val
-2 - 1.111111111111111111111111111111111111111111111111*I
>>> mpmath.mp.dps = 40
>>> mpmath.mpc(val)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\mpmath\ctx_mp_python.py", line 373, in __new__
real = cls.context.mpf(real)
File "C:\Python27\lib\site-packages\mpmath\ctx_mp_python.py", line 77, in __new__
v._mpf_ = mpf_pos(cls.mpf_convert_arg(val, prec, rounding), prec, rounding)
File "C:\Python27\lib\site-packages\mpmath\ctx_mp_python.py", line 96, in mpf_convert_arg
raise TypeError("cannot create mpf from " + repr(x))
TypeError: cannot create mpf from -2 - 1.111111111111111111111111111111111111111111111111*I
>>> mpmath.mpmathify(val)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\mpmath\ctx_mp_python.py", line 662, in convert
return ctx._convert_fallback(x, strings)
File "C:\Python27\lib\site-packages\mpmath\ctx_mp.py", line 614, in _convert_fallback
raise TypeError("cannot create mpf from " + repr(x))
TypeError: cannot create mpf from -2 - 1.111111111111111111111111111111111111111111111111*I
>>> mpmath.mpc(re(val), im(val))
mpc(real='-2.0', imag='-1.111111111111111111111111111111111111111114')
>>> mpmath.mpmathify(val)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\mpmath\ctx_mp_python.py", line 662, in convert
return ctx._convert_fallback(x, strings)
File "C:\Python27\lib\site-packages\mpmath\ctx_mp.py", line 614, in _convert_fallback
raise TypeError("cannot create mpf from " + repr(x))
TypeError: cannot create mpf from -2 - 1.111111111111111111111111111111111111111111111111*I
更新我的同情(1.0-> 1.1.1)和mpmath(0.19-> 1.0.0)修复了异常。我没有测试哪些升级实际上解决了这个问题。