числовой::Числовое решение обыкновенного дифференциального уравнения
Блокноты MuPAD® будут демонтированы в будущем релизе. Используйте live скрипты MATLAB® вместо этого.
Live скрипты MATLAB поддерживают большую часть функциональности MuPAD, хотя существуют некоторые различия. Для получения дополнительной информации смотрите, Преобразовывают Notebook MuPAD в Live скрипты MATLAB.
numeric::odesolve2(f, t0, Y0, <method>, <RememberLast>, <RelativeError = rtol>, <AbsoluteError = atol>, <Stepsize = h>, <MaxStepsize = hmax>)
numeric::odesolve2( f, t0, Y0, … ) возвращает функцию, представляющую числовое решение Y (t) дифференциального уравнения первого порядка (динамическая система)
, Y (t 0) = Y 0 с
и
.
Служебная функция numeric::ode2vectorfield может использоваться, чтобы произвести входные параметры f, t0, Y0 из набора дифференциальных выражений, представляющих ОДУ. Cf. Пример 1.
Функция, сгенерированная Y := numeric::odesolve2(f, t0, Y0), по существу
Y := t -> numeric::odesolve(t_0..t, f, Y_0).
Численное интегрирование запускается, когда Y вызван действительным числовым аргументом. Y(t) вызова возвращает вектор решения в формате, соответствующем типу начального условия Y 0, с которым был задан Y: Y(t) или приводит к списку или 1-мерному массиву.
Если t не является действительным численным значением, то Y(t) возвращает символьный вызов функции.
Смотрите страницу справки numeric::odesolve для получения дополнительной информации о параметрах и опциях.
Опции Alldata = n и Symbolic, принятый numeric::odesolve, не имеют никакого эффекта: numeric::odesolve2 игнорирует эти опции.
Без RememberLast функциональный Y помнит все значения, которые это вычислило. При вызове Y (T) это ищет помнить таблицу в течение времени t0 < T < t, самый близкий к t, и объединяется от T до t с помощью ранее вычисленного Y (T) в качестве начального значения. Здесь, t0 является временем, в течение которого дано начальное значение ОДУ. Это уменьшает затраты на вызов значительно, если Y должен много раз оцениваться, например, при графическом выводе решения для ОДУ. Лучший подход должен вызвать Y только с монотонно увеличением (или уменьшение) последовательность значений t, начинающий с t0. Далее, функция должна быть повторно инициализирована каждый раз, когда DIGITS увеличен. Смотрите Пример 3.
Функция, возвращенная numeric::odesolve2, чувствительна к переменной окружения DIGITS, который определяет числовую рабочую точность.
Без RememberLast функция, возвращенная numeric::odesolve2, использует option remember.
Числовое решение задачи с начальными значениями
, y (0) = 2 представлен следующим функциональным Y = [y]:
f := (t, Y) -> [t*sin(Y[1])]:
Также служебная функция numeric::ode2vectorfield может использоваться, чтобы сгенерировать входные параметры более интуитивным способом:
[f, t0, Y0] :=
[numeric::ode2vectorfield({y'(t) = t*sin(y(t)), y(0) = 2}, [y(t)])]![]()
Y := numeric::odesolve2(f, t0, Y0)
![]()
Процедура Y запускает численное интегрирование, когда названо числовым аргументом:
Y(-2), Y(0), Y(0.1), Y(PI + sqrt(2))
![]()
Вызов Y с символьным аргументом приводит к символьному вызову:
Y(t), Y(t + 5), Y(t^2 - 4)
![]()
eval(subs(%, t = PI))
![]()
Числовое решение может быть построено. Обратите внимание на то, что Y(t) возвращает список, таким образом, мы строим элемент списка Y(t)[1]:
plotfunc2d(Y(t)[1], t = -5..5):

delete f, t0, Y0, Y:
Мы считаем дифференциальное уравнение
с начальными условиями y (0) = 0
. Уравнение второго порядка преобразовано в систему первого порядка для
:
.
f := (t, Y) -> [Y[2], Y[1]^2]: t0 := 0: Y0 := [0, 1]: Y := numeric::odesolve2(f, t0, Y0): Y(1), Y(PI)
![]()
delete f, t0, Y0, Y:
Мы рассматриваем систему
:
f := (t, Y) -> [Y[1] + Y[2], Y[1] - Y[2]]: Y := numeric::odesolve2(f, 0, [1, I]): DIGITS := 5: Y(1)
![]()
Увеличение DIGITS не приводит к более точному результату из-за помнить механизма:
DIGITS := 15: Y(1)
![]()
Это - предыдущее значение, вычисленное с 5 цифрами, распечатанными с 15 цифрами. Действительно, только 5 цифр правильны. Для получения результата, который является с точностью до полной точности, нужно стереть помнить таблицу через Y:=subsop(Y,5=NIL). Также можно создать новое числовое решение с (пустым) новым, помнят таблицу:
Y := numeric::odesolve2(f, 0, [1, I]): Y(1)
![]()
delete f, Y, DIGITS:
Мы демонстрируем эффект опции RememberLast. Мы рассматриваем ОДУ
:
f := (t, Y) -> [-Y[1] + sin(t)]: Y := numeric::odesolve2(f, 0, [1]): Z := numeric::odesolve2(f, 0, [1], RememberLast):
После многих вызовов Y, помнить таблицу стал большим. В каждом вызове, ища помнить таблицу входные параметры близко к значению настоящего времени становится дорогим. Созданный с RememberLast, процедура Z не помнит всех своих ранее вычисленных значений кроме последнего. Следовательно, это становится быстрее, чем Y:
time(for i from 1 to 1000 do Y(i/100) end)*msec, time(for i from 1 to 1000 do Z(i/100) end)*msec
![]()
Кроме эффективности, совпадают значения, возвращенные Y и Z:
Y(10.5), Z(10.5)
![]()
delete f, Y, Z, i:
|
Процедура, представляющая векторное поле динамической системы |
|
Числовое действительное значение в течение начального времени |
|
Список или 1-мерный массив численных значений, представляющих начальное значение |
|
Одна из схем Runge-Kutta описана ниже. |
|
Опция, заданная как Имя схемы Runge-Kutta. Для получения дополнительной информации см. документацию |
|
Изменяет внутреннее, помнят механизм: процедура, возвращенная Без этой опции процедура, возвращенная Эта опция настоятельно рекомендована, когда числовая процедура, возвращенная |
|
Опция, заданная как Обеспечивает внутренние числовые шаги Рунге-Кутта, чтобы использовать размеры шага с относительными локальными ошибками дискретизации ниже |
|
Опция, заданная как Обеспечивает внутренние числовые шаги Рунге-Кутта, чтобы использовать размеры шага с абсолютными локальными ошибками дискретизации ниже |
|
Опция, заданная как Выключает внутренний контроль ошибок и использует итерацию Рунге-Кутта с постоянным размером шага |
|
Опция, заданная как Ограничивает адаптивные размеры шага значениями, не больше, чем |
Процедура.