我正在使用scipy.integrate.odeint来解决给定系统的运动方程,并使用脚本从中选择与该特定问题最相关的部分:
# Equations of Motion function to integrate
def solveEquationsofMotion(y0, t, nRigidBodies, nCoordinates, nConstraintsByType, dataConst, Phi, dPhidq, niu, gamma, massMatrix, gVector, alpha, beta, sda_Parameters):
...
Some calculations
matA = numpy.array
...
dydt = np.hstack((qp,qpp))
return dydt
#Integrator results
solution = odeint(solveEquationsofMotion, y0, time_span,args=(nRigidBodies, nCoordinates, nConstraintsByType, dataConst, Phi, dPhidq, niu, gamma, massMatrix, gVector, alpha, beta), full_output=0)
,效果很好。
但是,现在我需要在每个时间步中将部分积分结果( solution 变量)乘以matA变量,以再次用作下一个时间步的初始条件。
我已经查看了scipy.integrate.odeint文档,但没有看到任何相关信息。 任何帮助将不胜感激。
亲切问候
伊沃(Ivo)
答案 0 :(得分:2)
如果必须在每个步骤中更改解决方案,则使用逐步集成器ode
更为合乎逻辑。无论如何,它都应该在循环中使用,因此最好同时更改条件。这是一个求解y' = -sqrt(t)*y
(向量值)的示例,其中y在每一步之后都乘以matA
。
t变量中的步骤由数组t
确定。主要步骤是y[k, :] = r.integrate(t[k])
,它获取解的下一个值,然后用r.set_initial_value(matA.dot(y[k, :]), t[k])
更改初始条件。
import numpy as np
from scipy.integrate import ode
def f(t, y):
return -np.sqrt(t)*y
matA = np.array([[0, 1], [-1, 0]])
t = np.linspace(0, 10, 20)
y_0 = [2, 3]
y = np.zeros((len(t), len(y_0)))
y[0, :] = y_0
r = ode(f)
r.set_initial_value(y[0], t[0])
for k in range(1, len(t)):
y[k, :] = r.integrate(t[k])
r.set_initial_value(matA.dot(y[k, :]), t[k])
如此获得的y
的值既不是单调的也不是正的,因为ODE的实际解将是-这表明与matA相乘会产生影响。
[[ 2.00000000e+00 3.00000000e+00]
[ 1.55052494e+00 2.32578740e+00]
[ 1.46027833e+00 -9.73518889e-01]
[-5.32831945e-01 -7.99247918e-01]
[-3.91483887e-01 2.60989258e-01]
[ 1.16154133e-01 1.74231200e-01]
[ 7.11807536e-02 -4.74538357e-02]
[-1.79307961e-02 -2.68961942e-02]
[-9.45453427e-03 6.30302285e-03]
[ 2.07088441e-03 3.10632661e-03]
[ 9.57623940e-04 -6.38415960e-04]
[-1.85274552e-04 -2.77911827e-04]
[-7.61389508e-05 5.07593005e-05]
[ 1.31604315e-05 1.97406472e-05]
[ 4.85413044e-06 -3.23608696e-06]
[-7.56142819e-07 -1.13421423e-06]
[-2.52269779e-07 1.68179853e-07]
[ 3.56625306e-08 5.34937959e-08]
[ 1.08295735e-08 -7.21971567e-09]
[-1.39690370e-09 -2.09535555e-09]]