使用极坐标在Python中绘制相图

使用极坐标在Python中绘制相图,python,matplotlib,plot,wolfram-mathematica,polar-coordinates,Python,Matplotlib,Plot,Wolfram Mathematica,Polar Coordinates,我需要以下非线性系统的相位图,以极坐标形式给出 \点{r}=0.5*(r-r^3) \点{\theta}=1 我知道如何在数学中做到这一点 field1 = {0.5*(r - r^3), 1}; p1 = StreamPlot[Evaluate@TransformedField["Polar" -> "Cartesian", field1, {r, \[Theta]} -> {x, y}], {x, -3, 3}, {y, -3, 3}, Axes -> True, Stre

我需要以下非线性系统的相位图,以极坐标形式给出

\点{r}=0.5*(r-r^3)
\点{\theta}=1

我知道如何在数学中做到这一点

field1 = {0.5*(r - r^3), 1};
p1 = StreamPlot[Evaluate@TransformedField["Polar" -> "Cartesian", field1, {r, \[Theta]} -> {x, y}], {x, -3, 3}, {y, -3, 3}, Axes -> True, StreamStyle -> Gray, ImageSize -> Large];
Show[p1, AxesLabel->{x,y}, ImageSize -> Large]


如何在Python中使用pyplot.quiver实现同样的功能?

只是一个非常简单的实现,但可能会有所帮助

import numpy as np
import matplotlib.pyplot as plt

def dF(r, theta):
    return 0.5*(r - r**3), 1

X, Y = np.meshgrid(np.linspace(-3.0, 3.0, 30), np.linspace(-3.0, 3.0, 30))
u, v = np.zeros_like(X), np.zeros_like(X)
NI, NJ = X.shape

for i in range(NI):
    for j in range(NJ):
        x, y = X[i, j], Y[i, j]
        r, theta = (x**2 + y**2)**0.5, np.arctan2(y, x)
        fp = dF(r, theta)
        u[i,j] = (r + fp[0]) * np.cos(theta + fp[1]) - x
        v[i,j] = (r + fp[0]) * np.sin(theta + fp[1]) - y

plt.streamplot(X, Y, u, v)
plt.axis('square')
plt.axis([-3, 3, -3, 3])
plt.show()

更正先前的答案:

  • x=r*cos(θ)
    可以得到
    dx=dr*cos(θ)-r*sin(θ)*dtheta=x*dr/r-y*dtheta
  • y=r*sin(θ)
    可以得到
    dy=dr*sin(θ)+r*cos(θ)*dtheta=y*dr/r+x*dtheta
  • 可以使用numpy的矢量化操作来避免所有循环
这给出了下面的图。使用
streamplot
density
选项增加打印线的密度


你是如何定义v和u的?如何为任何其他系统定义u和v?
def dF(r, theta):
    return 0.5*r*(1 - r*r), 1+0*theta

X, Y = np.meshgrid(np.linspace(-3.0, 3.0, 30), np.linspace(-3.0, 3.0, 30))
R, Theta = (X**2 + Y**2)**0.5, np.arctan2(Y, X)
dR, dTheta = dF(R, Theta)
C, S = np.cos(Theta), np.sin(Theta)
U, V = dR*C - R*S*dTheta, dR*S+R*C*dTheta

plt.streamplot(X, Y, U, V, color='r', linewidth=0.5, density=1.6)
plt.axis('square')
plt.axis([-3, 3, -3, 3])
plt.show()