Неоднородное ОДУ с функцией дискретного принуждения с использованием пакета DifferentialEquations в Julia

В 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?


person Chris    schedule 25.02.2021    source источник
comment
Поскольку у вас g(t) в p[3], не лучше ли это быть du[2] = ... + p[3]? Дает ли исправление этой ошибки знака ожидаемые результаты?   -  person Lutz Lehmann    schedule 26.02.2021
comment
Спасибо за ваше предложение. Я проверил свой пост и обнаружил, что неправильно ввел уравнение движения для конструкции SDOF, подверженной колебаниям земли. Его следует исправить как \ ddot {u} + f (u, \ dot {u}, p) = - g (t). Однако опубликованный код Julia по-прежнему правильно представляет приведенное выше уравнение движения. Полученные результаты сильно отличаются от книжных. Вероятно, это из-за самого моего кода (неправильное использование команд).   -  person Chris    schedule 27.02.2021
comment
Но вы пробовали варианты знаков? Ошибка знака может быть не на вашей стороне. Кроме того, использование случайных чисел из стандартного распределения единиц может быть не тем, что использовалось в книге. // Ваш код сам по себе выглядит прямолинейно, если у вас нет ошибок компиляции, он должен делать то, что вы намереваетесь делать. Вы можете попытаться построить искусственный пример, в котором вы знаете точное решение.   -  person Lutz Lehmann    schedule 27.02.2021
comment
Из-за ограниченного пространства, отведенного для комментария, я буду следить за беседой, отвечая на свой вопрос, как показано ниже.   -  person Chris    schedule 27.02.2021
comment
Остался ли здесь актуальный вопрос или это просто ошибка пользователя?   -  person Chris Rackauckas    schedule 28.02.2021
comment
Это просто моя ошибка. Я неправильно понял правильное использование пакета. С помощью Лутца Леманна я обнаружил, что код, который я опубликовал ранее, не отражает проблему, которую я хотел решить. Поскольку было бы лучше предполагать линейные кусочные вариации ускорений грунта, чем постоянные кусочные, я должен пересмотреть свой код, следуя stackoverflow.com/questions/49428939/. Спасибо.   -  person Chris    schedule 28.02.2021


Ответы (1)


Похоже, что эта проблема возникла только из-за ошибки пользователя, рассмотренной в комментариях.

person Chris Rackauckas    schedule 21.05.2021