使用带有SymPy符号表达式的matplotlib箭头函数

时间:2018-02-22 18:20:34

标签: matplotlib sympy

from sympy import *
import matplotlib.pyplot as plt
import numpy as np

V0 = 1
L = 1

x = Symbol('x')
y = Symbol('y')
v = -V0*y/(cosh(x/L)*cosh(x/L))
dv = diff(v,y)
u = -integrate(dv,x)

print(dv)
print(u)

plt.figure()
x = np.arange(0,5,1)
y = np.arange(0,5,1)

plt.quiver(x,y,u,v)

这部分无法绘图,错误是

  

ufunc' isfinite'不支持输入类型,并且根据投射规则无法安全地将输入强制转换为任何支持的类型'''

1 个答案:

答案 0 :(得分:2)

您正在混合符号和数字。 quiver需要数字输入,您无法为其指定符号表达式uv。此外,您将x,y重新定义为符号后的数组 - 这不是“为符号赋值”,它只是变量重用的一个令人困惑的实例。不要那样做。找到符号表达式u和v后,执行此操作(请注意x,y将其原始含义保留为SymPy符号):

from sympy.utilities.autowrap import ufuncify
X, Y = np.meshgrid(np.arange(0,5,1), np.arange(0,5,1))
uxy = ufuncify((x, y), u)
vxy = ufuncify((x, y), v)
plt.figure()
plt.quiver(X, Y, uxy(X, Y), vxy(X, Y))

这里,ufuncify生成支持numpy数组广播的二进制函数(uxy,vxy)。这样就可以插入X,Y数组并获得一组值。然后绘图按预期工作。

quiver plot