【问题标题】:ODE 15s with time dependent input parameters具有时间相关输入参数的 ODE 15s
【发布时间】:2015-04-02 01:41:04
【问题描述】:

我有一个解决以下类型的大规模 ODE 系统的 MATLAB 代码

     function [F] = myfun(t,C,u)

u 这里是一个时间相关向量,用作函数 myfun 的输入。我当前的代码如下:-

 u    = zeros(4,1);
 u(1) = 0.1; 
 u(2) = 0.1;
 u(3) = 5.01/36;
 u(4) = 0.1;

C0            = zeros(15*4*20+12,1);
options = odeset('Mass',Mf,'RelTol',1e-5,'AbsTol',1e-5);
[T,C]   = ode15s(@OCFDonecolumnA, [0,5000] ,C0,options,u); 

我想将整个时域分成 5 个不同的部分,并让 u 的元素在不同的时间取不同的值(类似于多步函数)。考虑到我以后想解决一个优化问题以确定域 [0,5000] 中每个时间间隔的 u 值,最好的编码方法是什么。

谢谢

【问题讨论】:

  • 如果您正在寻找正确和准确的结果,不连续地更改 ODE 的参数通常不是一个好主意(并且违反了 ODE 的数学平滑度要求)——即使使用像 ode15s 这样的刚性求解也是如此.做到这一点的方法是及时进行单独的分段积分,停止和启动每个积分器。请参阅my answer here,如果有帮助,请告诉我。还要注意我是如何通过匿名函数传递参数的,而不是在选项输入之后添加参数的弃用方法。

标签: matlab ode


【解决方案1】:

ode15s 期望您的模型函数接受时间参数t 和差分状态变量的向量x(或您命名的C)。由于ode15s 不允许我们传入另一个向量u 的控制输入,我通常将ODE 函数ffcn 包装在model 函数中:

function [t, x] = model(x0, t_seg, u)
    idx_seg = 0;
    function y = ffcn(t, x)
      % simple example of exponential growth
      y(1) = u(idx_seg) * x(1)
    end
    ...
end

上面model的参数是初始状态值x0,切换次数向量t_seg,不同段控制输入值向量u。您可以看到idx_segffcn 内可见。这允许我们将模型集成到所有细分市场(将上面的 ... 替换为以下内容):

t_start = 0;
t = t_start;
x = x0;
while idx_seg < length(t_seg)
    idx_seg = idx_seg + 1;
    t_end = t_seg(idx_seg);
    [t_sol, x_sol] = ode15s(@ffcn, [t_start, t_end], x(end, :));
    t = [t; t_sol(2 : end)];
    x = [x; x_sol(2 : end, :)];
    t_start = t_end;
end

在循环的第一次迭代中,t_start 为 0,t_end 为第一个切换点。我们现在使用ode15s 仅在此区间内积分,而我们的ffcn 使用u(1) 评估ODE。解决方案y_sol和对应的时间点t_sol附加到我们的整体解决方案(tx)。

对于下一次迭代,我们将t_start 设置为当前段的末尾,并将新的t_end 设置为下一个切换点。还可以看到t_seg的最后一个元素一定是模拟结束的时间。重要的是,我们将模拟轨迹的当前尾部y(end, :) 作为下一段的初始状态向量传递给ode15s

综上所述,函数model将使用ode15s逐段模拟模型,并返回整体轨迹y及其时间点t。你可以用一个例子来说服自己

[t, x] = model1(1, [4, 6, 12], [0.4, -0.7, 0.3]);
plot(t, x);

对于我的指数增长示例应该产生的结果

对于您的优化运行,您需要编写一个目标函数。这个目标函数可以将u传递给model,然后通过查看x来计算与u相关的优点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    相关资源
    最近更新 更多