getValues函数

这段代码是一个 MATLAB 函数,名为 getValues,用于从状态空间模型(ssm)中提取特定时间 t 和状态 x 下的参数、输入、控制和辅助状态的值。以下是代码的详细解释:

函数签名

matlab
复制
function [a, u, p, d] = getValues(ssm, t, x)
  • 输入参数:

    • ssm: 状态空间模型对象,包含状态、辅助状态、控制、参数和输入的定义。

    • t: 时间点,用于提取时间相关的输入和控制值。

    • x: 当前状态值,用于计算辅助状态和控制值。

  • 输出参数:

    • a: 辅助状态的值。

    • u: 控制的值。

    • p: 参数的值。

    • d: 输入的值。

代码逻辑

  1. 获取字段名称:

    matlab
    复制
    [stateNames, auxNames, ctrlNames, paramNames, inputNames] = getFieldNames(ssm);
    • ssm 对象中获取状态、辅助状态、控制、参数和输入的名称列表。

  2. 提取参数 p:

    matlab
    复制
    for n=1:length(paramNames)
        p.(paramNames{n}) = ssm.p.(paramNames{n}).val;
    end
    • 遍历参数名称列表,提取每个参数的当前值并存储在结构体 p 中。

  3. 提取输入 d:

    matlab
    复制
    for k=1:length(inputNames)
        if t < ssm.d.(inputNames{k}).val(1,1)
            d.(inputNames{k}) = ssm.d.(inputNames{k}).val(1,2);
        elseif t > ssm.d.(inputNames{k}).val(end,1)
            d.(inputNames{k}) = ssm.d.(inputNames{k}).val(end,2);
        else
            d.(inputNames{k}) = interp1(ssm.d.(inputNames{k}).val(:,1),...
                ssm.d.(inputNames{k}).val(:,2),t); 
        end                
    end
    • 遍历输入名称列表,根据时间 t 提取输入值。如果 t 超出输入值的时间范围,则使用边界值;否则使用线性插值计算 t 时刻的输入值。

  4. 提取控制 u:

    matlab
    复制
    for k=1:length(ctrlNames)
        if isscalar(ssm.u.(ctrlNames{k}).val)
            u.(ctrlNames{k}) = ssm.u.(ctrlNames{k}).val;
        elseif strcmp(ssm.u.(ctrlNames{k}).def, ['u.' ctrlNames{k}]) 
            if t < ssm.u.(ctrlNames{k}).val(1,1)
                u.(ctrlNames{k}) = ssm.u.(ctrlNames{k}).val(1,2);
            elseif t > ssm.u.(ctrlNames{k}).val(end,1)
                u.(ctrlNames{k}) = ssm.u.(ctrlNames{k}).val(end,2);
            else
                u.(ctrlNames{k}) = interp1(ssm.u.(ctrlNames{k}).val(:,1),...
                    ssm.u.(ctrlNames{k}).val(:,2),t); 
            end
        else
            try
                u.(ctrlNames{k}) = eval(ssm.u.(ctrlNames{k}).def);
            catch err
                msg = sprintf('%s \n\nFailed to evaluate the definition of DynamicElement u.%s (k=%d): \n\t''%s''',...
                    err.message, ctrlNames{k}, k, ssm.u.(ctrlNames{k}).def);
                id = 'MATLAB:StateSpaceModel:eval';
                error(id,msg);
            end
        end
    end
    • 遍历控制名称列表,根据控制值的类型提取控制值:

      • 如果控制值是标量,则直接使用该值。

      • 如果控制值的定义是控制名称本身(即控制作为输入),则根据时间 t 提取控制值,类似于输入 d 的处理方式。

      • 如果控制值是规则定义的(即控制作为辅助状态),则通过 eval 函数计算控制值。

  5. 提取辅助状态 a:

    matlab
    复制
    for n=1:length(auxNames)
        try
            a.(auxNames{n}) = eval(ssm.a.(auxNames{n}).def);
        catch err
            msg = sprintf('%s \n\nFailed to evaluate the definition of DynamicElement a.%s (n=%d): \n\t''%s''',...
                err.message, auxNames{n}, n, ssm.a.(auxNames{n}).def);
            id = 'MATLAB:StateSpaceModel:eval';
            error(id,msg);
        end
    end
    • 遍历辅助状态名称列表,通过 eval 函数计算每个辅助状态的值。

错误处理

  • 在计算控制和辅助状态值时,如果 eval 函数执行失败,会捕获错误并抛出带有详细信息的错误消息。

总结

getValues 函数的主要作用是从状态空间模型中提取特定时间和状态下的参数、输入、控制和辅助状态的值。它通过遍历模型中的各个字段,并根据时间 t 和状态 x 来计算或提取相应的值。该函数在状态空间模型的仿真或分析中非常有用,特别是在需要动态计算控制和辅助状态值时。

暂无评论

发送评论 编辑评论


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