[英]What is the difference between (matplotlib) and (SymPy Plotting Module)?
①为什么上面的源码可以创建一个plot,下面的源码不行?
②你能给我指一个 web 的网站吗,它有一个比较 (matplotlib) 和 (SymPy Plotting Module) 的表格?
③(matplotlib)到(SymPy 绘图模块)转换器和一个(SymPy 绘图模块)到(matplotlib)转换器会有所帮助。
from sympy import *
def define_fn(n):
def fn(x):
if n <= x <= n + 1:
return float(x) - n
elif n + 1 <= x <= n + 2:
return 2.0 - x + n
else:
return 0.0
return fn
f3 = define_fn(3)
f8 = define_fn(8)
print("#",f3)
print("#",f8)
plot(f3,f8)
# <function define_fn.<locals>.fn at 0x000002474E838280>
# <function define_fn.<locals>.fn at 0x000002474E838310>
# SymPyDeprecationWarning: .............
让我们确保您了解链接和您的改编在做什么。 您关于 plot 软件包差异的问题表明您不清楚 package 正在做什么。
您已经定义了两个 python 函数,它们接受一个数字。
In [11]: f3(4)
Out[11]: 1.0
In [12]: f8(9)
Out[12]: 1.0
仅使用 python 我们就可以创建一个x
值列表:
In [17]: x = [i / 10 for i in range(120)]
相应的y
值:
In [18]: y1 = [f3(i) for i in x]
In [19]: y2 = [f8(i) for i in x]
和 plot 他们:
In [20]: plt.plot(x, y1, x, y2)
Out[20]:
[<matplotlib.lines.Line2D at 0x7fe2589385e0>,
<matplotlib.lines.Line2D at 0x7fe258938610>]
# plotted as you show
该链接使用np.linspace
将x
值创建为数组,并np.vectorize
将函数应用于所有这些值。 matplotlib
适用于 arrays 和列表。
matplotlib
的使用没有什么特别之处。
陈述如:
if n <= x <= n + 1:
return float(x) - n
仅适用于单个数字。 这是基本的 python。对x
使用 numpy 数组或 sympy symbol
或expression
将导致错误。
如果x
是一个sympy
符号:
In [3]: f3(x)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
Input In [3], in <module>
----> 1 f3(x)
Input In [1], in define_fn.<locals>.fn(x)
2 def fn(x):
----> 3 if n <= x <= n + 1:
4 return float(x) - n
5 elif n + 1 <= x <= n + 2:
File /usr/local/lib/python3.8/dist-packages/sympy/core/relational.py:398, in Relational.__bool__(self)
397 def __bool__(self):
--> 398 raise TypeError("cannot determine truth value of Relational")
TypeError: cannot determine truth value of Relational
和一个数组:
In [4]: f3(np.arange(3))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Input In [4], in <module>
----> 1 f3(np.arange(3))
Input In [1], in define_fn.<locals>.fn(x)
2 def fn(x):
----> 3 if n <= x <= n + 1:
4 return float(x) - n
5 elif n + 1 <= x <= n + 2:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
①为什么上面的源码可以创建一个plot,下面的源码不行?
链接示例使用 matplotlib,它与数字输入一起使用。 Matplotlib 不知道 sympy 的世界。
Sympy 的 plot 模块将 sympy 表达式转换为数值近似值,并使用 matplotlib 绘制它们。Sympy 的 plot 模块抽象出许多复杂的东西来完成这项工作,并对临时用户隐藏这些内容。
②你能给我指一个 web 的网站吗,它有一个比较 (matplotlib) 和 (SymPy Plotting Module) 的表格?
Matplotlib 非常庞大。 Sympy 的绘图模块使用了一个功能子集,仔细而巧妙地适应了符号世界。 差异不适合表格。 可以在 matplotlib.org找到 Matplotlib 的大量文档,但大多数人只查看他们正在使用的子集。 Sympy 的绘图文档适合一个大网页。 对于这两个库,您将需要额外的教程、StackOverlow,如果您需要不易获得的功能,则可能需要深入研究免费提供的源代码。
③(matplotlib)到(SymPy 绘图模块)转换器和一个(SymPy 绘图模块)到(matplotlib)转换器会有所帮助。
那将是一项艰巨的工作,有很多未定义的案例。 Sympy(以及 matplotlib)是由非常有才华的志愿者开发的,资源有限。
请注意,如果您真的想要,您可以将 sympy 图“移动”到 matplotlib 世界并在那里扩展 plot。
这是您的源代码在 sympy 中的样子。 首先是一些评论:
if
测试一起使用,您需要符号函数,例如PieceWise
。float(x)
不适用于 sympy 的符号from sympy import plot, Symbol, Piecewise, And
def define_fn(n):
def fn(x):
return Piecewise((x - n, (n <= x) & (x <= n + 1)),
(2 - x + n, (n + 1 <= x) & (x <= n + 2)),
(0, True))
return fn
f3 = define_fn(3)
f8 = define_fn(8)
x = Symbol('x', real=True)
plot(f3(x), f8(x), (x, -1, 11))
虽然这有效,但这不是 sympy 的标准方式。 通常,函数被写成表达式。 请注意如何将f3
用作包含x
的表达式,而不是上一个示例中不太灵活的f3(x)
。
from sympy import plot, Symbol, Piecewise, And
x = Symbol('x', real=True)
n = Symbol('n', real=True)
fn = Piecewise((x - n, (n <= x) & (x <= n + 1)),
(2 - x + n, (n + 1 <= x) & (x <= n + 2)),
(0, True))
f3 = fn.subs(n, 3) # Piecewise((x - 3, (x >= 3) & (x <= 4)), (5 - x, (x >= 4) & (x <= 5)), (0, True))
f8 = fn.subs(n, 8) # Piecewise((x - 8, (x >= 8) & (x <= 9)), (10 - x, (x >= 9) & (x <= 10)), (0, True))
plot(f3, f8, (x, -1, 11))
print("#",type(f3),f3)
print("#",type(f8),f8)
# <class 'function'> <function define_fn.<locals>.fn at 0x00000246464B9280>
# <class 'function'> <function define_fn.<locals>.fn at 0x00000246464B9310>
print("#",type(f3(x)),f3(x))
print("#",type(f8(x)),f8(x))
# Piecewise Piecewise((x - 3, (x >= 3) & (x <= 4)), (5 - x, (x >= 4) & (x <= 5)), (0, True))
# Piecewise Piecewise((x - 8, (x >= 8) & (x <= 9)), (10 - x, (x >= 9) & (x <= 10)), (0, True))
print("#",type(f3),f3)
print("#",type(f8),f8)
# Piecewise Piecewise((x - 3, (x >= 3) & (x <= 4)), (5 - x, (x >= 4) & (x <= 5)), (0, True))
# Piecewise Piecewise((x - 8, (x >= 8) & (x <= 9)), (10 - x, (x >= 9) & (x <= 10)), (0, True))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.