Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python arg和atan2之间差异的原因_Python_Sympy_Complex Numbers - Fatal编程技术网

Python arg和atan2之间差异的原因

Python arg和atan2之间差异的原因,python,sympy,complex-numbers,Python,Sympy,Complex Numbers,最近,使用sympy I Play和cos(x)作为一个复杂函数,发现提供的参数函数arg和atan2函数产生不同的结果。通过绘制结果可以很容易地显示这一点 将sympy作为sp导入 c=sp.cos(x) sp.plot(sp.atan2(sp.im(c)、sp.re(c))) sp.plot(sp.arg(c)) 虽然差异只是pi的自然倍数,但我希望这两个函数都返回上面的图。这也是WolframAlpha的产量,参见和。 有趣的是,如果我用数值计算参数(使用Symphy函数),我会得到预

最近,使用sympy I Play和cos(x)作为一个复杂函数,发现提供的参数函数
arg
atan2
函数产生不同的结果。通过绘制结果可以很容易地显示这一点

将sympy作为sp导入
c=sp.cos(x)
sp.plot(sp.atan2(sp.im(c)、sp.re(c)))
sp.plot(sp.arg(c))

虽然差异只是pi的自然倍数,但我希望这两个函数都返回上面的图。这也是WolframAlpha的产量,参见和。 有趣的是,如果我用数值计算参数(使用Symphy函数),我会得到预期的结果:

将numpy导入为np
将matplotlib.pyplot作为plt导入
xv=np.linspace(-10,10200)
plt.plot(xv,[sp.arg(i)表示np.cos(xv)中的i)])

有人能给我指出其中的区别吗?也许是一个合理的解决方案,以获得相同的结果


我使用的是Symphy 0.7.5。

不同的绘图来自Symphy内部的优化。当您绘制某些内容时,sympy在内部使用numpy来评估您的函数。Symphy的函数
矢量化的\u lambdify
arg(cos(x))
转换为它的numpy等价物
np.angle(np.cos(x))
,然后Symphy为适当的numpy数组计算该值。所以sympy所做的大致相当于

import numpy as np
import matplotlib as plt

xv = np.array(np.linspace(-10,10,200), dtype=np.complex)
plt.plot(xv, np.angle(np.cos(xv)))
这将复制从-pi到pi的跳跃。有关Symphy中的重要代码行,请参见

使用atan的另一个变体重写为

np.arctan2(-np.sin(np.real(x))*np.sinh(np.imag(x)), 
            np.cos(np.real(x))*np.cosh(np.imag(x)))
这相当于numpy的,事实上,这也是跳跃的特点。因此,从我的角度来看,更重要的问题是:
sp.atan2(…)
的绘图为什么看起来不同

我还没找到原因,但我相信这可能超出了你的问题范围?!回答你的问题:

  • 只要您使用Symphy中的符号版本,您所做的一切都是正确的,两者都是等效的
  • 如果你想得到相同的结果,最简单的方法可能是绘制模2pi。或者,通过直接从numpy绘制类似于
    lambda val:(expr).subs(x,val)
    的曲线图,避免调用
    experimental\u lambdify
    ,或者完全替换lambdify:在运行第一个示例之前执行以下代码,两个曲线图看起来都像上面的曲线图:

    import sympy.plotting.experimental_lambdify sympy.plotting.experimental_lambdify.experimental_lambdify = lambda x, exp, **kwargs: vectorize(lambda val: exp.subs(x[0], val)) 导入sympy.plotting.experimental\u lambdify sympy.plotting.experimental\u lambdify.experimental\u lambdify=lambda x,exp,**kwargs:vectorize(lambda val:exp.subs(x[0],val)) (请注意,此版本的代码段仅适用于1d绘图。)


    • 这可能是一种预期行为。参数通常从-pi到pi,因为复杂平面中的分支切割发生在负实轴,而不是正实轴

      I更倾向于上图,因为Wolfram Alpha为两种方法都产生了这一点。毕竟,这似乎只是内部定义不同的结果?是的,我明白了。我的观点是要表明,这种差异源于将sympy代码翻译成numpy代码,这只是情节中的一个问题,而不是其他地方的问题。我回答的最后一行暗示了如何用两个调用生成相同的图。我将扩展这个问题的答案。谢谢你的输入!我肯定认为这是一种症状。绘制时应考虑这些差异。如果你能找出更多的原因,请记下。它们肯定是相等的<代码>arg(x).重写(atan2)给出
      atan2(im(x),re(x))