【问题标题】:How to draw a general equation with matplotlib?如何用 matplotlib 绘制一般方程?
【发布时间】:2020-11-01 07:26:45
【问题描述】:

已经研究了以下问题 - 主要使用 python 中的 matplotlib。

“基本”函数是可能的,例如y = x^2,但如果我想绘制一个方程(由于多个 x-y 关联,它不一定是一个函数),例如:

x^2 + y^2 = 1(只是二维坐标系中以点(0/0)为中心,半径为1的基本圆)。

有没有办法用 matplotlib 或任何类似的库来绘制这样的方程?

我想到了将方程式重写为可绘制函数的想法,但由于绝对值分配,它看起来比原始方程式更难,例如将上面的等式转化为“函数”:|y| = sqrt(1-x²)-y+y

//编辑:应@mkrieger1 的要求,编辑此问题。 我的软件的目的是使用输入(由另一个函数提供;代表任何方程的字符串,例如"y^3-sqrt(sin(x^2)-2)*2 = 3x")并将其转换为绘图。我个人在解决 y 函数的方法上失败了(如前所述),尤其是对于更复杂的函数。考虑到数学输入的种类繁多,将这些方程分成“更小的部分”也非常困难,因此我认为使用轮廓求解方法将是最好的部分。 (正如@mkrieger1 建议的那样)。 再一次强调,这种方法很关键,因为在 plt.contour(X, Y, func, [0]) 和 UserWarning 中实现之前需要对等式进行“编辑”。

【问题讨论】:

  • 这能回答你的问题吗? Plot equation showing a circle
  • @mkrieger1 感谢您的快速回复,但没有。不幸的是,它们只涵盖了圆的特定情况,而我的问题旨在绘制方程(以圆为例),但通常将任何方程绘制到坐标系中,其中 ay 不能与一个 x 单一关联-value(就像我的例子一样)。
  • 是的,它被称为等高线图,我已链接的问题的公认答案显示了如何使用 matplotlib 进行绘制。您应该能够将其推广到其他方程式。如果没有,请说明您尝试过的方法以及问题所在。
  • Matplotlib 允许您绘制任意 x-y 对序列。
  • @mkrieger1 当然,但仍然需要将方程 x^2 + y^2 = 1 格式化(从给定的用户输入)为 F = x^2 + y^2 - 1 ,这可以很容易地(通过自动化)获得“标准”用户警告,因为没有给定轮廓级别(在数据范围内)。

标签: python matplotlib math graph equation


【解决方案1】:

您还可以使用sympyconvert 字符串中的表达式到一个等式,然后使用plot 它。我省略了示例的-2,因为这会导致一个非常空的情节。 Sympy 的解析器支持特殊函数以允许省略乘法(如 3x)并将 Python 的 xor 函数 (^) 转换为幂。

from sympy import plot_implicit, Eq
from sympy.parsing.sympy_parser import parse_expr
from sympy.parsing.sympy_parser import standard_transformations, convert_xor, implicit_multiplication

string = "y^3-sqrt(sin(x^2))*2 = 3x"
transformations = (standard_transformations + (implicit_multiplication,) + (convert_xor,))
lhs = parse_expr(string.split('=')[0], transformations=transformations)
rhs = parse_expr(string.split('=')[1], transformations=transformations)

plot_implicit(Eq(lhs, rhs))

另一个例子:

from sympy import plot_implicit, Eq, cos
from sympy.abc import x, y

plot_implicit(Eq(x/y, cos(y)), (x, -10, 10), (y, -10, 10))

请注意,如果没有明确设置变量的范围,plot_implicit 会假定默认范围介于 -5 和 5 之间。

【讨论】:

  • 这是一个天才的解决方案!它完全符合我正在寻找的描述。感谢您的帮助!
【解决方案2】:

如果你使用 matplotlib,你会注意到 plot 接受一对长度相等的数组,代表 x-y 对的序列。它不了解函数、方程或您提到的任何其他概念。

因此,支持绘制简单函数的断言在很大程度上是没有意义的,即使是真的。话虽如此,在笛卡尔空间中转换非函数的东西(如圆)的标准方法是将其参数化。许多流行的非函数的一种可能的参数化是使用极坐标。

例如:

t = np.linspace(0, 2 * np.pi, 100)   # the parameter
x = np.cos(t)
y = np.sin(t)

【讨论】:

    猜你喜欢
    • 2018-06-28
    • 2017-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2019-03-05
    • 1970-01-01
    • 2022-12-14
    • 2023-02-05
    相关资源
    最近更新 更多