首页 > 解决方案 > sympy 的 plot_parametric 说 TypeError: can't convert complex to float

问题描述

我想画一条实际上是S形的曲线:</p>

  1. 画一个圆圈
  2. 将半圆的下半部分移动整个直径距离

但代码说TypeError: can't convert complex to float。复数在哪里?如何解决?谢谢

import sympy as sp
from sympy.plotting import *

u = sp.Symbol('u', real=True)
R0 = 2
boundLower = 0
boundUpper = 2 * sp.pi

x_u = sp.Piecewise(
    (R0*sp.cos(u)+R0, sp.And(boundLower <= u, u <= boundUpper/2)),
    (R0*sp.cos(u)+3*R0, sp.And(boundUpper/2 < u, u <= boundUpper)),
)

y_u = sp.Piecewise(
    (R0*sp.sin(u), sp.And(boundLower <= u,  u <= boundUpper/2)),
    (R0*sp.sin(u), sp.And(boundUpper/2 < u, u <= boundUpper)),
)

plot_parametric(x_u, y_u, (u, boundLower, boundUpper))

标签: pythonplotsympyparametric-equations

解决方案


SymPyplot涉及一些易于出错的操作,旨在提高绘图的性能;它们涉及complex数据类型,当涉及不等式时,有时会导致错误。在这种情况下,减少不等式的数量会有所帮助:

x_u = sp.Piecewise(
    (R0*sp.cos(u)+R0, u <= boundUpper/2),
    (R0*sp.cos(u)+3*R0, u <= boundUpper),
)

y_u = sp.Piecewise(
    (R0*sp.sin(u), u <= boundUpper/2),
    (R0*sp.sin(u), u <= boundUpper),
)

plot_parametric(x_u, y_u, (u, boundLower, boundUpper))

以上是在 SymPy 中通常如何呈现 Piecewise:条件按照给定的顺序进行评估,第一个为 True 的结果会导致对相应表达式的评估。(顺便说一句,u <= boundUpper可以用 代替True。)结果:

分段的

这仍然不理想。当然,从 0 到 4 的水平线不应该存在 - 这是绘图的产物。此外,此代码显示

UserWarning:表达式的评估有问题。我们正在尝试一种可能仍然有效的故障恢复方法。请将此报告为错误。

我建议在绘图时避免分段。而是使用extend如下所示的组合图。

x_u1 = R0*sp.cos(u)+R0
x_u2 = R0*sp.cos(u)+3*R0

y_u1 = R0*sp.sin(u)
y_u2 = R0*sp.sin(u)

p = plot_parametric(x_u1, y_u1, (u, boundLower, boundUpper/2), show=False)
p.extend(plot_parametric(x_u2, y_u2, (u, boundUpper/2, boundUpper), show=False))
p.show()

输出(无警告,无伪影)。

更好的


推荐阅读