如何将极坐标形式的 x 和 y 值从这些耦合的 ODE 转换为笛卡尔形式并绘制它们?

How do I convert the x and y values in polar form from these coupled ODEs to to cartesian form and graph them?

我编写了这段代码来模拟 spring 钟摆的运动

import numpy as np
from scipy.integrate import odeint
from numpy import sin, cos, pi, array
import matplotlib.pyplot as plt

def deriv(z, t):
    
    x, y, dxdt, dydt = z

    dx2dt2=(0.415+x)*(dydt)**2-50/1.006*x+9.81*cos(y)
    dy2dt2=(-9.81*1.006*sin(y)-2*(dxdt)*(dydt))/(0.415+x)
    
    return np.array([x,y, dx2dt2, dy2dt2])

init = array([0,pi/18,0,0])
time = np.linspace(0.0,10.0,1000)
sol = odeint(deriv,init,time)

def plot(h,t):
    n,u,x,y=h
    n=(0.4+x)*sin(y)
    u=(0.4+x)*cos(y)
    return np.array([n,u,x,y])

init2 = array([0.069459271,0.393923101,0,pi/18])

time2 = np.linspace(0.0,10.0,1000)
sol2 = odeint(plot,init2,time2)

plt.xlabel("x")
plt.ylabel("y")
plt.plot(sol2[:,0], sol2[:, 1], label = 'hi')
plt.legend()
plt.show()

其中 x 和 y 是两个变量,我试图将 x 和 y 转换为极坐标 n(x 轴)和 u(y 轴),然后在图上绘制 n 和 u,其中n 在 x 轴上,u 在 y 轴上。然而,当我绘制上面的代码时,它给了我:

相反,我得到的图像应该与此类似:

代码的第一部分 - 来自 "def deriv(z,t): to sol:odeint(deriv..." 是生成 x 和 y 值的地方,然后我可以使用它们将它们转换为直角坐标并绘制它们。我如何更改我的代码来执行此操作?我是 Python 的新手,所以我可能不理解某些术语。谢谢!

第一个解决方案应该能给你预期的结果,但是在执行的时候出错了。

您传递给 odeint 的函数应该 return 一个包含 1st 阶微分方程组的解的数组。

在你的情况下你要解决的是

而你应该解决

为此,请将您的代码更改为

import numpy as np
from scipy.integrate import odeint
from numpy import sin, cos, pi, array
import matplotlib.pyplot as plt


def deriv(z, t):

    x, y, dxdt, dydt = z

    dx2dt2 = (0.415 + x) * (dydt)**2 - 50 / 1.006 * x + 9.81 * cos(y)
    dy2dt2 = (-9.81 * 1.006 * sin(y) - 2 * (dxdt) * (dydt)) / (0.415 + x)

    return np.array([dxdt, dydt, dx2dt2, dy2dt2])


init = array([0, pi / 18, 0, 0])
time = np.linspace(0.0, 10.0, 1000)
sol = odeint(deriv, init, time)

plt.plot(sol[:, 0], sol[:, 1], label='hi')
plt.show()

代码的第二部分看起来您正在尝试更改坐标。 我不确定你为什么要尝试再次解决这个问题,而不是仅仅这样做。

x = sol[:,0]
y = sol[:,1]

def plot(h):
    x, y = h
    n = (0.4 + x) * sin(y)
    u = (0.4 + x) * cos(y)
    return np.array([n, u])

n,u = plot( (x,y))

到目前为止,你正在做的是解决这个系统:

这导致 x=e^t 和 y=e^t 和 n' = (0.4 + e^t) * sin(e^t) u' = (0.4 + e^t) * cos( e^t).

无需深入细节,凭一些直觉,您会发现这将导致吸引子作为 nu[= 的导数54=] 将开始以指数速率更快且幅度更大地切换符号,导致 nu 坍缩到吸引子上,如下所示你的阴谋。

如果你真的想解另一个微分方程,我需要看看它以便进一步帮助你

如果您进行转换并将时间设置为 1000,就会发生这种情况: