python scipy odeint返回值

时间:2017-04-25 16:11:58

标签: scipy odeint

我一直在使用scipy中的odeint,我无法理解函数返回的值是返回值。例如,

# -*- coding: utf-8 -*-
"""
Created on Sat Feb 04 20:01:16 2017

@author: Esash
"""

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

def MassSpring(state,t):
  # unpack the state vector
  x = state[0]
  xd = state[1]

  # these are our constants
  k = -5.5 # Newtons per metre
  m = 1.5 # Kilograms
  g = 9.8 # metres per second

  # compute acceleration xdd
  xdd = ((k*x)/m) + g

  # return the two state derivatives
  return [xd, xdd]

state0 = [0.0, 0.0]
t = np.arange(0.0, 10.0, 0.1)

state = odeint(MassSpring, state0, t)

plt.plot(t, state)
plt.xlabel('TIME (sec)')
plt.ylabel('STATES')
plt.title('Mass-Spring System')
plt.legend(('$x$ (m)', '$\dot{x}$ (m/sec)'))

在上面的代码中,我将两个参数设置为0.0和0.0,函数中的xd只是0.0,我也返回。但是返回值不仅仅是0.0,而是变化的。

In [14]: state
Out[14]: 
array([[ 0.        ,  0.        ],
       [ 0.04885046,  0.97402207],
       [ 0.19361613,  1.91243899],
       ..., 
       [ 0.10076832, -1.39206172],
       [ 0.00941998, -0.42931942],
       [ 0.01542821,  0.54911655]])

另外,如果我有一个需要发送许多参数的微分方程,那么我不能将odeint调用中的M个参数作为列表或元组发送,只返回ODE的解作为单个数组。它期望发送的参数数量应该等于函数返回的参数数量。这是为什么?

我无法理解此功能的工作原理。有人可以向我解释一下吗?如果我听起来太混乱,我道歉。

非常感谢。

1 个答案:

答案 0 :(得分:1)

  

我无法理解函数作为返回值返回的内容。

odeint的返回值是所请求时间值的计算解。也就是说,在这次电话会议之后

state = odeint(MassSpring, state0, t)

state[0]是[x(t [0]),x'(t [0])],state[1]是[x(t [1]),x'(t [1] )]等。如果您只想绘制x坐标,可以致电plt.plot(t, state[:, 0])绘制state的第一列。

  

我将两个参数设置为0.0和0.0 [...]

您所谓的“参数”通常称为初始条件。它们是t = 0时x(t)和x'(t)的值。

  

但返回值不仅仅是0.0,而是变化的。

那是因为(0,0)不是系统的平衡。看看等式

xdd = ((k*x)/m) + g

x为0时,您获得xdd = g,因此xdd最初为正数。也就是说,存在作用在质量上的非零力(重力),因此它会加速。

平衡状态是[-g * m / k,0]。

  

另外,如果我有一个需要发送许多参数的微分方程,那么我不能将odeint调用中的M个参数作为列表或元组发送,只返回ODE的解作为单个数组。它期望发送的参数数量应该等于函数返回的参数数量。这是为什么?

odeint一次仅解决系统的一组初始条件。如果您想生成多个解决方案(对应不同的初始条件),则必须多次调用odeint