python - 绘制 3D quiver plot 和 ode

标签 python matplotlib plot ode

我正在尝试绘制 3D 箭袋图并将其与 odeint 结合以求解线性化方程。基本上,我想要类似于 this 的东西但在 3D 中。我遇到的特殊问题是,在代码快结束时,当我执行 ax.quiver() 绘图时,我不断收到“val 必须是 float 或非零 float 序列”的错误消息,我不确定如何解决它。

from scipy.integrate import odeint
from numpy import *
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax =fig.add_subplot(1, 1, 1, projection='3d')
ax.set_xlabel('x')
ax.set_ylabel('u')
ax.set_zlabel('u1')

def testplot(X, t=0,c=0.2):
    x = X[0]
    u = X[1]
    u1=X[2]
    dxdt =x**2*(-1+x+u)*(1-x+(-1+c)*u**2)
    du1dt =c**2*u*(2+x*(-4+2.25*x)+(-4 + 4*x)*u**2 + 2*u**4 + x**2*u*u1)
    dudt=u1*dxdt
    return [dxdt, dudt,du1dt]
X0 = [0.01,0.995,-0.01]#initial values
t = linspace(0, 50, 250)
c=[0.2,0.5,1,2]#changing parameter

for m in c:
    sol = odeint(testplot,X0,t,mxstep=5000000,args=(m,))#solve ode
    ax.plot(sol[:,0],sol[:,1],sol[:,2],lw=1.5,label=r'$c=%.1f$'%m)

x = linspace(-3,3,15)
y = linspace(-4,4,15)
z= linspace(-2,2,15)
x,y,z = meshgrid(x,y,z) #create grid
X,Y,Z = testplot([x,y,z])
M = sqrt(X**2+Y**2+Z**2)#magnitude
M[M==0]=1.
X,Y,Z = X/M, Y/M, Z/M

ax.quiver(x,y,z,X,Y,Z,M,cmap=plt.cm.jet)
ax.minorticks_on()
ax.legend(handletextpad=0,loc='upper left')
setp(ax.get_legend().get_texts(),fontsize=12)
fig.savefig("testplot.svg",bbox_inches="tight",\
        pad_inches=.15)

最佳答案

看来您在 ax.quiver() 中有一个额外的参数。据我所知,“M”似乎是额外的参数。把它去掉,你的 quiver 调用看起来像:

ax.quiver(x,y,z,X,Y,Z,cmap=plt.cm.jet)

生成的图像如下所示: enter image description here

关于python - 绘制 3D quiver plot 和 ode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37953525/

相关文章:

python - 绘制 Pandas 数据框两列

python - Matplotlib:可以绘制从一组轴到另一组轴的线吗?

r - 在基于 ggplot2 的绘图函数中创建构面时出错

python - 如何用Python代码运行Windows powercfg的功能?

python - 模糊图像的一部分并将其与背景混合

python - 绘制 For 迭代的结果

python - 边不显示在使用 Networkx 的图形中 - Python

R:如何使用 rCharts 绘制统计函数

python - 在 Pygame 中识别群体中的单个 Sprite

python - 如何在 Python 中使用 re 替换两个数字之间的字符?