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 结构体 `options` 为 `AbsTol` 和 `RelTol` 指定值。可以使用 `odeset` 创建 options 结构体。`
``[y0_new,yp0_new,resnrm] = decic(___)` 返回 `odefun(t0,y0_new,yp0_new)` 的范数作为 `resnrm`。如果范数看起来异常大，则使用 `options` 减小相对误差容限 `RelTol`，其默认值为 `1e-3`。`

示例

`$\begin{array}{cc}0& =2{y}_{1}^{\prime }-{y}_{2}\\ 0& ={y}_{1}+{y}_{2}\end{array}$`

```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 ```

Weissinger 方程是

${\mathrm{ty}}^{2}{\left({\mathit{y}}^{\prime }\right)}^{3}-{\mathit{y}}^{3}{\left({\mathit{y}}^{\prime }\right)}^{2}+\mathit{t}\left({\mathit{t}}^{2}+1\right){\mathit{y}}^{\prime }-{\mathit{t}}^{2}\mathit{y}=0$.

`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` 求解器需要一致的初始条件，即提供给求解器的初始条件必须满足

$\mathit{f}\left({\mathit{t}}_{0},\mathit{y},{\mathit{y}}^{\prime }\right)=0$.

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

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

$\mathit{y}\left(\mathit{t}\right)=\sqrt{{\mathit{t}}^{2}+\frac{1}{2}}$.

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

输入参数

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

`$\begin{array}{l}y{\text{'}}_{1}-{y}_{2}=0\\ y{\text{'}}_{2}+1=0\text{\hspace{0.17em}},\end{array}$`

，请使用以下函数。

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

`y` 分量的初始估计值，指定为向量。`y0` 中的每个元素为 `odefun` 定义的方程组中的一个因变量 ${y}_{n}$ 指定一个初始条件。

• 如果 `y0(i)` 的估计值中不允许进行任何更改，则设置 `fixed_y0(i) = 1`

• 如果可以更改任何条目，则设置 `fixed_y0 = []`

`y'` 分量的初始估计值，指定为向量。`yp0` 中的每个元素为 `odefun` 定义的方程组中的一个微分因变量 $y{\text{'}}_{n}$ 指定一个初始条件。

• 如果 `yp0(i)` 的估计值中不允许进行任何更改，则设置 `fixed_yp0(i) = 1`

• 如果可以更改任何条目，则设置 `fixed_yp0 = []`

Options 结构体，指定为结构体数组。使用 `odeset` 函数创建或修改 options 结构体。可与 `decic` 函数一起使用的相关选项包括 `RelTol``AbsTol`，它们控制用于计算初始条件的误差阈值。

输出参数

`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` 的值较小，则表示 `decic` 已成功计算满足 `odefun(t0,y0_new,yp0_new) = 0` 的一致初始条件。

• 如果 `resnrm` 的值很大，请使用 `options` 输入尝试调整误差阈值 `RelTol``AbsTol`

提示

• 在使用 `ode15i` 求解之前，`ihb1dae``iburgersode` 示例文件使用 `decic` 计算一致初始条件。可以键入 `edit ihb1dae``edit iburgersode` 查看代码。

• 还可以使用 `decic` 计算通过 `ode15s``ode23t` 求解的 DAE 的一致初始条件。为此，请按以下步骤操作。

1. 采用完全隐式的形式 `f(t,y,y') = 0` 重写方程组。

2. 调用 `decic` 计算方程的一致初始条件。

3. 指定 `y0_new` 作为调用求解器的初始条件，并指定 `yp_new` 作为 `odeset``InitialSlope` 选项的值。