代码之家  ›  专栏  ›  技术社区  ›  Jibbity jobby

将具有虚幂的Symphy多边形转换为mpmath mpc

  •  0
  • Jibbity jobby  · 技术社区  · 7 年前

    我有一个sympy poly,看起来像:

    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)
    

    两个问题。

    1. 假设我的mpc和Symphy类型具有相同的精度(例如100 dps),使用以下转换是否会导致精度损失 a d ?
    2. 有没有更好的转换方法?

    旁白:在这里,sympy似乎把我当成了一个象征。如何得到Symphy来简化这个多项式?

    编辑:我还注意到以下工作代替了 以上内容:

    a = val.args[0]
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   user6655984 user6655984    7 年前

    字符串和表达式

    问题的根本原因见 val.subs('I', 1.0j) --您似乎将字符串作为参数传递给Symphy函数。这有一些有效的用途(例如创建高精度浮点),但就符号而言,使用字符串会造成混淆。字符串“I”被隐式转换为Symphy表达式 Symbol('I') ,这与Symphy表达式不同 I 。那么答案是

    如何得到Symphy来简化这个多项式?

    就是重温多项式的创建过程,并修复它。如果确实需要从字符串创建它,那么使用 locals 参数:

    >>> S('3.3*I**2 + 2*I', locals={'I': I})
    -3.3 + 2*I
    

    多项式和表达式

    如果不需要多边形结构,请使用以下方法 as_expr() 从中获取表达式。

    转换为mpmath和精度损失

    使用从a到d的转换是否会导致精度损失?

    是的,拆分为实部和虚部,然后重新组合可能会导致精度损失。将Symphy对象直接传递给 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 评估fo -I ,你不必做任何事情,它就会发生。
    • 高精度十进制的字符串表示用于在Symphy中创建这样的浮点。在这里 S 代表 sympify 。也可以更直接、更实用 Float('1.1111111111111111111111111')
    • 将Symphy复数直接转换为mpmath复数比在实/复数中拆分和重新组合更好。

    结论

    以上大部分只是围绕XY问题进行讨论。你对我的表情和你想象的不一样,所以你试图做一些不需要的奇怪的事情,而我的回答大多是浪费时间。

        2
  •  0
  •   Jibbity jobby    6 年前

    我在这里添加了我自己的答案,因为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
    

    更新我的sympy(1.0->1.1.1)和mpmath(0.19->1.0.0)修复了这些异常。我没有测试这些升级中的哪一个真正解决了问题。