Решение ДУ в среде R
library(deSolve)
#уравнение y'=2x+C
f <- function(x, y, params) list(2*x)
x0=0; y0=2 #начальные условия
x <- seq(x0, 5, 0.5)
#решение уравнения
df <- as.data.frame(ode(y0, x, f, parms = NULL));
#построение интегральной кривой и начальных условий
plot(NULL,xlim=c(0,5),ylim=c(0,30),ylab="Y", xlab="X")
grid(col='black')
lines(df,col="red", lwd=2)
df
# функция runge.kutta в пакете rmutil языка R.
# Она позволяет численно решить дифференциальное уравнение
# методом Рунге-Кутты четвёртого порядка.
#Использование: runge.kutta(f, initial, x).
#Аргументы:
# f — функция dy/dx = func(y,x).
# initial — начальное значение y.
# x — вектор значений x, для которых нужны значения y.
# Результат: вектор значений y как решение функции f,
# соответствующий значениям из x.
library(rmutil)
fn <- function(y,x) (2*x)
Xrk = seq(0,3, 0.05)
Yrk = runge.kutta(fn,initial = 0,x = Xrk)
plot(Xrk, Yrk)
# решить ДУ y'= 2x x=3
# зная что x0=0 y0=2
# dy/dx = 2x
# начальные условия при x0
fn <- function(y,x) (2*x)
Xrk = seq(1,4, 0.5)
Yrk = runge.kutta(fn,initial = 3,x = Xrk)
plot(Xrk, Yrk)
ans=data.frame(Xrk, Yrk)
ans
plot(Xrk, Yrk)
abline(h = 11, v=3)
# Материальная точка движется по закону s'=2t-1
# Известно, что за первые 2 секунды материальная точка
# прошла путь равный 2 метрам.
# Какой путь пройдет та же точка за 5 секунд.
# решить ДУ ys'=2t-1 t=5
# зная что x0=2 y0=2
y0=2
fn <- function(s,t) (2*t-1)
Xrk = seq(2,6, 0.5)
Yrk = runge.kutta(fn,initial = y0,x = Xrk)
plot(Xrk, Yrk)
ans=data.frame(Tсек=Xrk, Sметры=Yrk)
ans
ANS = ans[ans$Tсек==5,]
print(ANS, row.names = FALSE)
plot(ans)
library(deSolve)
library(latex2exp)
# уравнение y'=2x+C
# найти y(2)=?
f <- function(x, y, params) list(2*x)
x0=-4; y0=18 #начальные условия
x <- seq(x0, 4, 0.05)
#решение уравнения
df <- as.data.frame(ode(y0, x, f, parms = NULL));
tail(df)
#построение интегральной кривой и начальных условий
plot(NULL,xlim=c(-4,4),ylim=c(0,18),ylab="Y", xlab="X",yaxt='n',xaxt = "n",
main = TeX("Решение ДУ $y'=2x+C$"))
grid(col='black')
abline(v=0, h=0, lwd=2)
axis(1, xaxp = c(-4, 4, 32))
axis(2, yaxp = c(0, 18, 18), las = 1)
abline(h=seq(0,18,1), lty=2)
abline(v=seq(-4,4,0.25), lty=2)
abline(v=seq(-4,4,1), lty=1)
abline(h=seq(0,20,5), lty=1)
lines(df,col="red", lwd=2)
# найти y(2)=?
# df[df$time==2,]$`1`
abline(v=2, col='blue')
abline(h=df[df$time==2,]$`1`, col='blue')
# axis(side = 2, at = seq(0, 20, 1), labels = seq(0, 20, 1), las = 2)
# side — это сторона (1 - снизу, 2 — слева, 3 сверху, 4 справа )
# las = 1 отобразить числа вертикально
# at — на каких позициях ставить значения
#labels — собственно список значений
#(понятно, что их должно быть ровно столько же, сколько указано и в параметре at)
# las — стандартный граф. параметр задающий ориентацию значений на шкалах
# более точный метод Рунге-Кутты
# функция runge.kutta в пакете rmutil языка R.
# Она позволяет численно решить дифференциальное уравнение
# методом Рунге-Кутты четвёртого порядка.
# Использование: runge.kutta(f, initial, x).
# Аргументы:
# f — функция dy/dx = func(y,x).
# initial — начальное значение y.
# x — вектор значений x, для которых нужны значения y.
# Результат: вектор значений y как решение функции f,
# соответствующий значениям из x.
library(rmutil)
x0=-4; y0=18 #начальные условия
fn <- function(y,x) (2*x)
Xrk = seq(x0, 4, 0.05)
Yrk = runge.kutta(fn, initial = y0, x = Xrk)
#plot(Xrk, Yrk)
ans=data.frame(Xrk, Yrk)
head(ans)
ans[ans$Xrk==2,]
df[df$time==2,]$`1`
