У меня есть ODE 2-го порядка для решения в Matlab:
(a + f(t))·(dx/dt)·(d²x/dt²) + g(t) + ((h(t) + i(t)·(d²x/dt² > b·(c-x)))·(dx/dt) + j(t))·(dx/dt)² + k(t)·(t > d) = 0
куда
- _2 _, _ 3 _, _ 4 _, _ 5_ - известные константы
- _6 _, _ 7 _, _ 8 _, _ 9 _, _ 10 _, _ 11_ - известные функции, зависящие от
t
x
- это позицияdx/dt
- скоростьd²x/dt²
- это ускорение
и обратите внимание на два условия, которые
i(t)
вводится в уравнение, если(d²x/dt² > b·(c-x))
k(t)
вводится в уравнение, если(t > d)
Итак, проблема может быть решена с помощью аналогичной структуры в Matlab, как в этом примере:
[T,Y] = ode45(@(t,y) [y(2); 'the expression of the acceleration'], tspan, [x0 v0]);
куда
T
- временной вектор,Y
- вектор положения (столбец 1 какy(1)
) и скорости (столбец 2 какy(2)
).ode45
- решатель ODE, но можно использовать и другой.- _26 _, _ 27 _, _ 28_ известны.
the expression of the acceleration
означает выражение дляd²x/dt²
, но здесь возникает проблема, поскольку он находится внутри условия дляi(t)
и «снаружи», одновременно умножая(a + f(t))·(dx/dt)
. Итак, ускорение нельзя записать в Matlab какd²x/dt² = something
Некоторые проблемы, которые могут помочь:
как только условие
(d²x/dt² > b·(c-x))
и / или(t > d)
выполнено, соответствующий терминi(t)
и / илиk(t)
будет введен до конца определенного времени вtspan
.для условия
(d²x/dt² > b·(c-x))
членd²x/dt²
может быть записан как разность скоростей, напримерy(2) - y(2)'
, еслиy(2)'
- это скорость в предыдущий момент, деленная на время шага, определенное вtspan
. Но я не знаю как получить доступ к предыдущему значению скорости во время решения ODE
Заранее благодарю !
ode15i
- person Steve   schedule 25.09.2017x_tt := d^2x/dt^2
является эффективно неявным аргументом какH(x_tt - b(c*x))
, гдеH(t)
- это ступенчатая функция ХевисайдаH(t) = 1 if t>=0, 0 if t<0
. Существует ли решение или имеет ли он смысл - это еще один вопрос, на который стоит обратить внимание. - person Steve   schedule 25.09.2017