【问题标题】:Use matplotlib quiver function with SymPy symbolic expressions将 matplotlib quiver 函数与 SymPy 符号表达式一起使用
【发布时间】:2018-02-22 18:20:33
【问题描述】:
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',并且根据转换规则 ''safe'' 无法安全地将输入强制转换为任何支持的类型

【问题讨论】:

    标签: matplotlib sympy


    【解决方案1】:

    您正在混合符号和数字。 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 数组并获取值数组成为可能。然后绘图按预期工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 2015-11-21
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 2018-06-04
      相关资源
      最近更新 更多