В 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), как предложено в
решить систему ODE с чтением во внешнем форсировании
Однако я не хочу интерполировать функцию принуждения g (t), но вместо этого хочу попробовать команду обратного вызова.
Для линейной системы SDOF 2-го порядка, подверженной колебаниям грунта, я уже пробовал
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?
g(t)
вp[3]
, не лучше ли это бытьdu[2] = ... + p[3]
? Дает ли исправление этой ошибки знака ожидаемые результаты? - person Lutz Lehmann   schedule 26.02.2021