在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) 是连续的。
这种情况的解决方案是按照
但是,我不想插入强制函数 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?