2014-11-06 1 views
4

Я изучаю динамику затухающего, движимый маятник с вторым порядком ОДОЙ определяется как so, а именно я progamming:Python решение 2-го ОДЫ порядка с функцией квадратора

d^2y/дт^2 + с * д/дт + грех (у) = а * соз (вес)

import numpy as np 
import matplotlib.pyplot as plt 
from scipy import integrate 


def pendeq(t,y,a,c,w): 
    y0 = -c*y[1] - np.sin(y[0]) + a*np.cos(w*t) 
    y1 = y[1] 
    z = np.array([y0, y1]) 
    return z 

a = 2.1 
c = 1e-4 
w = 0.666667  # driving angular frequency 

t = np.array([0, 5000]) # interval of integration 
y = np.array([0, 0])  # initial conditions 

yp = integrate.quad(pendeq, t[0], t[1], args=(y,a,c,w)) 

Эта проблема действительно выглядит очень похожа на Need help solving a second order non-linear ODE in python, но я получаю ошибку

Supplied function does not return a valid float. 

Что я делать неправильно ??

+0

Похоже, вы решаете позицию маятника как функцию нескольких параметров, верно? –

+0

Да, это правильно. –

+1

'quad' интегрирует скалярную функцию. Он не решает обыкновенного дифференциального уравнения. Посмотрите еще раз на пример, к которому вы подключились - 'sipy.integrate.odeint' (а не' quad') используется для генерации решения. См. Также http://wiki.scipy.org/Cookbook/CoupledSpringMassSystem –

ответ

3

integrate.quad требует, чтобы функция поставки (pendeq, в вашем случае) возвращает только поплавок. Ваша функция возвращает массив.

+0

Я ответил на часть вопроса «Что я делаю неправильно?», Но я все еще пытаюсь понять, как это сделать правильно. Я отредактирую свой ответ, если смогу это выяснить. На данный момент это скорее проблема физики, чем проблема программирования. –