decic

Вычисление допустимых начальных условий для ode15i

Синтаксис

[y0_new,yp0_new] = decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0)
[y0_new,yp0_new] = decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0,options)
[y0_new,yp0_new,resnrm] = decic(___)

Описание

пример

[y0_new,yp0_new] = decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0) использование y0 и yp0 как предположения для начальных условий полностью неявной функции odefun, содержит компоненты, заданные fixed_y0 и fixed_yp0, как зафиксировано, затем вычисляет значения для нефиксированных компонентов. Результатом является полный набор сопоставимых начальных условий. Новые значения yo_new и yp0_new удовлетворяют odefun(t0,y0_new,yp0_new) = 0 и подходят, чтобы использоваться в качестве начальных условий с ode15i.

[y0_new,yp0_new] = decic(odefun,t0,y0,fixed_y0,yp0,fixed_yp0,options) также использует структуру опций options, чтобы задать значения для AbsTol и RelTol. Создайте структуру опций с помощью odeset.

[y0_new,yp0_new,resnrm] = decic(___) возвращает норму odefun(t0,y0_new,yp0_new) как resnrm. Если норма кажется незаконно большой, то используйте options, чтобы уменьшить допуск относительной погрешности RelTol, который имеет значение по умолчанию 1e-3.

Примеры

свернуть все

Рассмотрите неявную систему уравнений

0=2y1-y20=y1+y2

Эти уравнения являются достаточно прямыми, что просто прочитать сопоставимые начальные условия для переменных. Например, если вы фиксируете y1=1затем y2=-1 согласно второму уравнению и y1=-1/2 согласно первому уравнению. Начиная с этих значений y1, y1, и y2 удовлетворите уравнения, они сопоставимы.

Подтвердите эти значения при помощи decic, чтобы вычислить сопоставимые начальные условия для уравнений, фиксируя значение y1=1. Используйте предположения y0 = [1 0] и yp0 = [0 0], которые не удовлетворяют уравнения и таким образом противоречивы.

odefun = @(t,y,yp) [2*yp(1)-y(2); y(1)+y(2)];
t0 = 0;
y0 = [1 0];
yp0 = [0 0];
[y0,yp0] = decic(odefun,t0,y0,[1 0],yp0,[])
y0 = 2×1

     1
    -1

yp0 = 2×1

   -0.5000
         0

Вычислите сопоставимые начальные условия и решите неявный ОДУ с ode15i.

Уравнение Вайссингера

ty2(y)3-y3(y)2+t(t2+1)y-t2y=0.

Поскольку уравнение находится в типичной форме f(t,y,y)=0, можно использовать функцию ode15i, чтобы решить неявное дифференциальное уравнение.

Уравнение кода

Чтобы закодировать уравнение в форме, подходящей для ode15i, необходимо записать функцию с входными параметрами для t, y, и y это возвращает остаточное значение уравнения. Функциональный @weissinger кодирует это уравнение. Просмотрите файл функции.

type weissinger
function res = weissinger(t,y,yp)
%WEISSINGER  Evaluate the residual of the Weissinger implicit ODE
%
%   See also ODE15I.

%   Jacek Kierzenka and Lawrence F. Shampine
%   Copyright 1984-2014 The MathWorks, Inc.

res = t*y^2 * yp^3 - y^3 * yp^2 + t*(t^2 + 1)*yp - t^2 * y;

Вычислите сопоставимые начальные условия

Решатель ode15i требует сопоставимых начальных условий, то есть, начальные условия, предоставленные решателю, должны удовлетворить

f(t0,y,y)=0.

Поскольку возможно предоставить противоречивые начальные условия, и ode15i не проверяет на непротиворечивость, рекомендуется, чтобы вы использовали функцию помощника decic, чтобы вычислить такие условия. decic содержит некоторые заданные зафиксированные переменные и вычисляет сопоставимые начальные значения для незакрепленных переменных.

В этом случае зафиксируйте начальное значение y(t0)=32 и позвольте decic вычислить сопоставимое начальное значение для производной y(t0), запуск с исходного предположения y(t0)=0.

t0 = 1;
y0 = sqrt(3/2);
yp0 = 0;
[y0,yp0] = decic(@weissinger,t0,y0,1,yp0,0)
y0 = 1.2247
yp0 = 0.8165

Решите уравнение

Используйте сопоставимые начальные условия, возвращенные decic с ode15i, чтобы решить ОДУ по временному интервалу [1 10].

[t,y] = ode15i(@weissinger,[1 10],y0,yp0);

Постройте результаты

Точное решение этого ОДУ

y(t)=t2+12.

Постройте числовое решение y, вычисленный ode15i против аналитического решения ytrue.

ytrue = sqrt(t.^2 + 0.5);
plot(t,y,'*',t,ytrue,'-o')
legend('ode15i', 'exact')

Входные параметры

свернуть все

Функции, чтобы решить, заданный как указатель на функцию, который задает функции, которые будут интегрированы. odefun представляет систему неявных дифференциальных уравнений, что вы хотите решить использование ode15i.

Функциональный f = odefun(t,y,yp), для скалярного t и вектор-столбцов y и yp, должен возвратить вектор-столбец f типа данных single или double, который соответствует f(t,y,y'). odefun должен принять все три входных параметра, t, y и yp, даже если один из аргументов не используется в функции.

Например, чтобы решить y'y=0, используйте эту функцию.

function f = odefun(t,y,yp)
f = yp - y;

Для системы уравнений вывод odefun является вектором. Каждое уравнение становится элементом в векторе решения. Например, чтобы решить

y'1y2=0y'2+1=0 ,

используйте эту функцию.

function dy = odefun(t,y,yp)
dy = zeros(2,1);
dy(1) = yp(1)-y(2);
dy(2) = yp(2)+1;

Для получения информации о том, как предоставить дополнительные параметры функциональному odefun, смотрите Функции Параметризации.

Пример: @myFcn

Типы данных: function_handle

Начальное время, заданное как скаляр. decic использует начальное время, чтобы вычислить сопоставимые начальные условия, которые удовлетворяют odefun(t0,y0_new,yp0_new) = 0.

Типы данных: single | double

Исходные предположения для y - компоненты, заданные как вектор. Каждый элемент в y0 задает начальное условие для одной зависимой переменной yn в системе уравнений, заданной odefun.

Типы данных: single | double

y-, чтобы содержать зафиксированный, заданный как вектор 1 с и 0s, или как [].

  • Установите fixed_y0(i) = 1, если никакое изменение не разрешено в предположении для y0(i).

  • Установите fixed_y0 = [], если какая-либо запись может быть изменена.

Вы не можете зафиксировать больше, чем компоненты length(yp0). В зависимости от определенной проблемы не всегда возможно зафиксировать определенные компоненты y0 или yp0. Это - лучшая практика не зафиксировать больше компонентов, чем необходимо.

Исходные предположения для y' - компоненты, заданные как вектор. Каждый элемент в yp0 задает начальное условие для одной дифференцируемой зависимой переменной y'n в системе уравнений, заданной odefun.

Типы данных: single | double

y-, чтобы содержать зафиксированный, заданный как вектор 1 с и 0s, или как [].

  • Установите fixed_yp0(i) = 1, если никакое изменение не разрешено в предположении для yp0(i).

  • Установите fixed_yp0 = [], если какая-либо запись может быть изменена.

Вы не можете зафиксировать больше, чем компоненты length(yp0). В зависимости от определенной проблемы не всегда возможно зафиксировать определенные компоненты y0 или yp0. Это - лучшая практика не зафиксировать больше компонентов, чем необходимо.

Структура опций, заданная как массив структур. Используйте функцию odeset, чтобы создать или изменить структуру опций. Соответствующими опциями для использования с функцией decic является RelTol и AbsTol, которые управляют порогами ошибок, используемыми, чтобы вычислить начальные условия.

Пример: options = odeset('RelTol',1e-5)

Типы данных: struct

Выходные аргументы

свернуть все

Сопоставимые начальные условия для y0, возвращенного как вектор. Если значение resnrm является маленьким, то yo_new и yp0_new удовлетворяют odefun(t0,y0_new,yp0_new) = 0 и подходят, чтобы использоваться в качестве начальных условий с ode15i.

Сопоставимые начальные условия для yp0, возвращенного как вектор. Если значение resnrm является маленьким, то yo_new и yp0_new удовлетворяют odefun(t0,y0_new,yp0_new) = 0 и подходят, чтобы использоваться в качестве начальных условий с ode15i.

Норма невязки, возвращенной как вектор. resnrm является нормой odefun(t0,y0_new,yp0_new).

  • Маленькое значение resnrm указывает, что decic успешно вычислил сопоставимые начальные условия, которые удовлетворяют odefun(t0,y0_new,yp0_new) = 0.

  • Если значение resnrm является большим, попытайтесь настроить пороги ошибок RelTol и AbsTol с помощью входа options.

Советы

  • ihb1dae и файлы iburgersode в качестве примера используют decic, чтобы вычислить сопоставимые начальные условия прежде, чем решить с ode15i. Введите edit ihb1dae или edit iburgersode, чтобы просмотреть код.

  • Можно дополнительно использовать decic, чтобы вычислить сопоставимые начальные условия для ДАУ, решенных ode15s или ode23t. Для этого выполните эти шаги.

    1. Перепишите систему уравнений в полностью неявной форме f(t,y,y') = 0.

    2. Вызовите decic, чтобы вычислить сопоставимые начальные условия для уравнений.

    3. Задайте y0_new как начальное условие в вызове решателя и задайте yp_new как значение опции InitialSlope odeset.

Смотрите также

| |

Представлено до R2006a