python - sympy的plot_parametric说TypeError:无法将复数转换为浮点数

我想绘制一条实际上具有S形的曲线:


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


但是代码显示为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))

最佳答案

SymPy的plot涉及一些易于出错的操作,旨在提高绘图的性能。它们涉及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中通常以逐段方式表示的方式:条件是按给定的顺序求值的,第一个条件为True的是对相应表达式求值的结果。 (顺便说一下,u <= boundUpper可以用True代替。)结果:

piecewise

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


  用户警告:表达式的评估是有问题的。我们正在尝试一种仍然可以使用的故障回复方法。请将此报告为错误。


我建议避免在绘图中使用分段式。而是使用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()


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

better

本文翻译自 https://stackoverflow.com/questions/52574265/

网站遵循 CC BY-SA 4.0 协议,转载或引用请注明出处。

标签 python plot sympy parametric-equations


相关文章:

python - 从python中的位置参数生成关键字参数

python - 使用sympy简化嵌套指数和日志

python - SymPy简化关系(不等式)表达

python - 如何编写使用pymongo连接到mongodb的函数

python - django inspectdb选项的DateTimeField

image - MATLAB imagesc命令不适用于非均匀间隔的y轴值[重复]

python - 如何用熊猫绘图

python - 更新时使用matplotlib“涂片”滚动图

python - 使用Python计算P ** n,而n接近+ oo并且P是矩阵

python - OpenCV 3.1.0:查找具有已知尺寸的平面的3D位置