defExpand函数

这段代码定义了一个函数 defExpand,用于扩展 DynamicModel 对象中某个 DynamicElementdef 字段,使其不再包含辅助状态(auxiliary states)。以下是代码的详细解释:


1. 函数功能

defExpand 函数的主要功能是:

  • 递归地查找 DynamicElementdef 字段中的辅助状态(以 a. 开头的变量)。

  • 将辅助状态的名称替换为其定义(def 字段的内容)。

  • 重复此过程,直到 def 字段中不再包含辅助状态。


2. 输入参数

  • dmDynamicModel 对象,表示动态模型。

  • deDynamicElement 对象,表示需要扩展定义的动态元素。


3. 函数逻辑

3.1 将 def 字段转换为字符串

matlab
复制
de.def = func2str(de.def);
  • de.def(函数句柄)转换为字符串,以便进行字符串操作。

3.2 查找辅助状态

matlab
复制
ind = strfind(de.def, 'a.'); 
  • 使用 strfind 查找 de.def 中所有以 a. 开头的辅助状态的位置。

3.3 循环替换辅助状态

matlab
复制
while ~isempty(ind)
    % 收集所有辅助状态的名称
    for k=1:length(ind)
        kEnd = ind(k)+find(~isstrprop(de.def(ind(k)+2:end),'alphanum'),1);
        if isempty(kEnd) % 辅助状态名称在定义末尾
            kEnd = length(de.def);
        end
        auxNames{k} = de.def(ind(k):kEnd);
    end
    auxNames = unique(auxNames); % 去重

    % 收集辅助状态名称的长度
    nameLengths = zeros(size(auxNames));
    for k=1:length(auxNames)
        nameLengths(k) = length(auxNames{k});
    end

    % 从最长的辅助状态名称开始替换
    while sum(nameLengths) > 0
        biggestNameInd = find(nameLengths==max(nameLengths),1);

        aux = auxNames{biggestNameInd}; % 辅助状态名称
        auxNoA = aux(3:end); % 去掉 'a.' 前缀

        de.def = strrep(de.def, aux, getDefStr(dm.a.(auxNoA)));

        nameLengths(biggestNameInd) = 0;
    end

    auxNames = [];
    ind = strfind(de.def, 'a.'); 
end
  • 收集辅助状态名称

    • 遍历所有以 a. 开头的辅助状态,提取其完整名称。

    • 使用 unique 去重。

  • 替换辅助状态

    • 从最长的辅助状态名称开始替换,避免短名称被错误替换(例如 a.fooa.foobar)。

    • 使用 strrep 将辅助状态名称替换为其定义(通过 getDefStr 获取)。

  • 更新辅助状态列表

    • 清空 auxNamesind,重新查找 de.def 中的辅助状态。

3.4 将 def 字段转换回函数句柄

matlab
复制
de.def = str2func(de.def);
  • 将扩展后的 def 字符串转换回函数句柄。


4. 示例

假设 dm 是一个 DynamicModel 对象,其中包含以下辅助状态:

  • a.aux1:定义 a.aux1 = x.state1 + 1

  • a.aux2:定义 a.aux2 = a.aux1 * 2

de 是一个 DynamicElement,其定义为:

matlab
复制
de.def = @(x,a,u,d,p) a.aux2 + u.ctrl1;

调用 defExpand 函数后:

  1. 首先替换 a.aux2

    matlab
    复制
    de.def = @(x,a,u,d,p) (a.aux1 * 2) + u.ctrl1;
  2. 然后替换 a.aux1

    matlab
    复制
    de.def = @(x,a,u,d,p) ((x.state1 + 1) * 2) + u.ctrl1;
  3. 最终 de.def 中不再包含辅助状态。


5. 总结

defExpand 函数的作用是递归地扩展 DynamicElementdef 字段,将其中的辅助状态替换为它们的定义。该函数适用于需要将动态模型中的辅助状态展开为基本状态的场景,例如简化模型定义或进行符号计算。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇