首页 > 解决方案 > scipy.integrate.odeint 每个时间步更新初始条件

问题描述

我正在使用 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)

它工作正常。

但是现在我需要在每个时间步中将部分积分结果(解决方案变量)乘以 matA 变量,以再次用作下一个时间步的初始条件。

我查看了 scipy.integrate.odeint 文档,但没有看到任何相关信息。任何帮助将不胜感激。

亲切的问候

伊沃

标签: pythonscipyintegrationodeint

解决方案


如果您必须在每一步都更改解决方案,则使用逐步积分器更合乎逻辑ode。无论如何,它应该在循环中使用,因此不妨同时更改条件。这是求解y' = -sqrt(t)*y(向量值)的示例,其中 ymatA在每一步之后都乘以。

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

推荐阅读