Решаем школьную задачу по механике с помощью R тремя способами: с интегралом, дифференциальным уравнением и графически.
Задача. Мальчик, съехав с горки на санях развил скорость в конце спуска 8 м/с и проехав по горизонтальному участку остановился через 5 секунд определить это расстояние.
Анализируем исходные данные.
Скорость в конце спуска с горки равна 8 метрам в секунду, это и есть начальная скорость (v0 = 8м/с), далее по мере движения по горизонтальной поверхности скорость будет уменьшаться, пока не достигнет через 5 секунд нулевого значения. Уравнение изменения скорости при ускоренном движении всем хорошо известно: v = v0 + at, и подставив в него известные данные мы можем вычислить чему равно ускорение. Получаем следующее выражение: 0 = 8 -a*5 откуда выразив ускарение a = 8/5 получим в итоге a = 1.6. Таким образом нам известны следующие параметры:
- начальная скорость - (v0 = 8м/с)
- ускорение – (a = -1.6 м/с^2) со знаком минус, так как в нашей задаче движение равнозамедленное
- время движения t = 5 секунд
А теперь ответим и на вопрос задачи: найдем путь, которые проехал мальчик на санях, с момента когда он съехал с горки до полной остановки.
Первый способ решения мы воспользуемся интегралом.
Здесь все очень просто: у нас есть функция изменения скорости по времени v(t) = 8 - 1.6*t. Поскольку скорость это и есть производная пути по времени, то интеграл этой функции является функцией пути по времени. Пределы интегрирования это время от 0 до 5 (по условию задачи), и наша конструкция на языке R примет вид:
# мальчик съехав с горки на санях развил скорость в конце спуска 8 м/с
# и проехав по горизонтальному участку остановился через 5 секунд
# определить это расстояние
# v = v0 + at ; 0 = 8 -a*5 ; a = 8/5 ; a = 1.6
v0 = 8
a = 1.6
# v(t) = 8 - 1.6*t
# Integrate!
st=function(t) 8 - 1.6*t
# Integrate from 0 to 5
integrate(st, 0, 5)
> v0 = 8 > a = 1.6 > # v(t) = 8 - 1.6*t > # Integrate! > st=function(t) 8 - 1.6*t > # Integrate from 0 to 5 > integrate(st, 0, 5) 20 with absolute error < 2.2e-13 |
Ответ: 20 метров.
Второй способ решение с помощью дифференциального уравнения.
По сути мы создаем снова функцию ( ds.dt = 8 - 1.6*t):
f1 = function(t, s, parms ){
ds.dt = 8 - 1.6*t
return ( list ( ds.dt ))}
И подставляя начальные условия решаем ДУ:
s0 = 0; t0 = seq(0, 5, 0.5)
sol = ode(y = s0, t = t0, func = f1, parms = NULL)
Полный скрипт (включая построения графика зависимости в данном случае пути по времени):
library(deSolve)
f1 = function(t, s, parms ){
ds.dt = 8 - 1.6*t
return ( list ( ds.dt ))}
s0 = 0; t0 = seq(0, 5, 0.5)
sol = ode(y = s0, t = t0, func = f1, parms = NULL)
sol
plot(sol[ ,1], sol[ ,2], type = "l", xlab =" t ", ylab =" y( t )",
col =" red ", lwd =4)
grid(col = 'black')
> f1 = function(t, s, parms ){
+ ds.dt = 8 - 1.6*t
+ return ( list ( ds.dt ))}
> s0 = 0; t0 = seq(0, 5, 0.5)
> sol = ode(y = s0, t = t0, func = f1, parms = NULL)
> sol
time 1
1 0.0 0.0
2 0.5 3.8
3 1.0 7.2
4 1.5 10.2
5 2.0 12.8
6 2.5 15.0
7 3.0 16.8
8 3.5 18.2
9 4.0 19.2
10 4.5 19.8
11 5.0 20.0
|
Ответ в 11 строке: 5 секунд и пройденный путь за это время 20 метров. А выполнив скрипт до конца получим и симпатичный график:
Третий способ решения графический.
Сначала мы построим одновременно два графика: зависимости скорости (первый график) и пути (второй график) от времени. Далее по графику изменения скорости найдем тот момент времени, когда скорость будет равна нулю), и лишний раз убедимся, что это будет в момент t=5 секундам. Далее опустим перпендикуляр от 5 на график зависимости пути от времени, и определим пройденное расстояние. Результат будет тот же самый: 20 метров.
# v(t) = 8 - 1.6*t
# s(t) = 8 -1.6*t^2/2
t = seq(0, 6, 0.1)
vt = 8 - 1.6*t
st = 8*t -1.6*t^2/2
plot(t, st, 'l', lwd = 2)
lines(t, vt, lwd = 2, col ='red')
abline(h = 0, lty = "dashed")
abline(h = 20, lty = "dashed")
abline(v = 5, lty = "dashed")
points(5, 20, lwd = 2, col ='red')
grid()

