python - sympy 的 plot_parametric 说 TypeError: can't convert complex to float
问题描述
我想画一条实际上是S形的曲线:</p>
- 画一个圆圈
- 将半圆的下半部分移动整个直径距离
但代码说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))
解决方案
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()
输出(无警告,无伪影)。
推荐阅读
- python - 如果我启动程序就会退出,你能帮我吗?
- flutter - 如何在 Flutter 的 Stack 中实现负责任的容器?
- python - 导入 Pygame 播放 mp3 时出现内存错误
- google-play-console - 无法在 Play 商店中发布应用
- javascript - 在 map 函数中动态评估级别
- python - 即使没有主机监听,Python 套接字也不返回异常并恢复正常
- python - 为什么 TensorFlow 对象检测 2.x 在训练模型时不显示 mAP
- regex - 正则表达式为括号选择错误的花括号
- javascript - StripeInvalidRequestError:创建“account_onboarding”类型的帐户链接时,您必须提供具有功能的帐户
- linux - 我可以在同一行的 file.txt 上写吗