0

在Julia中,我想使用DifferentialEquations.jl包来解决

\ddot{u} + f(u,\dot{u},p) = g(t)

其中 g(t) 是在时间 t 的等距离瞬间给出的值向量。

这种情况与https://diffeq.sciml.ai/stable/tutorials/ode_example/中的情况不同, 其中强制函数 M(t) 是连续的。

这种情况的解决方案是按照

求解具有读入外强迫的 ODE 系统

但是,我不想插入强制函数 g(t),而是想尝试回调命令。

对于受到地面运动的二阶线性单自由度系统,我已经尝试过

using DifferentialEquations

rhs = rand(10); # ground accel.
deltat = 0.02;

function affect!(integrator)
  integrator.p[3] = rhseval(integrator.t)
end

cb = PeriodicCallback(affect!,deltat)

function rhseval(x)
    return rhs[floor(Int,x/deltat)+1]
end

function sdof!(du,u,p,t)
    omg = p[1]
    zeta = p[2]
    du[1] = u[2]
    du[2] = - omg^2 * u[1] - 2zeta * omg * u[2] - p[3]
end

disp0 = 0;
velo0 = 0;
u0 = [disp0, velo0];

tspan = (0.0,0.1);

p = [2pi,0.02,0];

prob = ODEProblem(sdof!,u0,tspan,p,callback = cb)
sol = solve(prob,abstol = 1e-8, reltol = 1e-8,saveat=0.02)

但得到的结果并不令人满意。

有没有其他方法,不是插值g(t),而是使用回调,即PeriodicCallback、DiscreteCallback?

4

1 回答 1

0

这个问题似乎只是评论中解决的用户错误。

于 2021-05-21T12:26:49.297 回答