Как преобразовать значения x и y в полярной форме из этих связанных ODE в декартовую форму и построить их график? - PullRequest
0 голосов
/ 15 декабря 2018

Я написал этот код для моделирования движения пружинного маятника

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.Однако, когда я отображаю приведенный выше код, он дает мне:

enter image description here

Вместо этого я должен получить изображение, похожее на это: enter image description here

Первая часть кода - от «def Deriv (Z, T): до Sol: Odeint (производная ...», где генерируются значения х и у, ииспользуя это, я могу затем превратить их в прямоугольные координаты и построить их график. Как я могу изменить свой код, чтобы сделать это? Я новичок в Python, поэтому я могу не понимать некоторые термины. Спасибо!

1 Ответ

0 голосов
/ 15 декабря 2018

Первое решение должно дать вам ожидаемый результат, но в реализации оды есть ошибка.

Функция, которую вы передаете odeint, должна возвращать массив, содержащий решения системы дифференциальных уравнений 1st -приложения.

В вашем случае вы решаете

enter image description here

В то время как вместо этого вы должны решить

enter image description here

Для того, чтобы сделатьпоэтому измените свой код на этот

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()

enter image description here

Вторая часть кода выглядит так, как будто вы пытаетесь изменить координату.Я не уверен, почему вы пытаетесь решить оду снова вместо того, чтобы просто делать это.

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))

На данный момент, что вы делаете там, это решение этой системы:

enter image description here

Что приводит к x = e ^ t и y = e ^ t и n '= (0,4 + e ^ t) * sin (e ^ t) u' = (0,4+ е ^ т) * соз (е ^ т).

Не вдаваясь слишком в детали, с некоторой интуицией вы можете увидеть, что это приведет к аттрактору, так как производные от n и u начнут переключатьсяПодпишите быстрее и с большей величиной по экспоненте, что приведет к коллапсу n и u на аттракторе, как показано на вашем графике.

Если вы на самом деле пытаетесьРешите другое дифференциальное уравнение. Мне нужно его увидеть, чтобы помочь вам в дальнейшем.

Это то, что произойдет, если вы выполните преобразование и установите время 1000:

enter image description here

...