setInitialValues函数

这段代码定义了两个函数:setInitialValuesgetOde,分别用于设置状态空间模型的初始值和获取模型的微分方程(ODEs)。以下是代码的详细解释:


1. setInitialValues 函数

matlab
复制
function setInitialValues(obj)
  • 功能:

    • 设置状态空间模型的初始值,包括状态、辅助状态、控制和输入。

    • 如果某些动态元素(如控制或辅助状态)未提供初始值,则通过其定义(def)计算初始值。

代码逻辑

  1. 获取字段名称:

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

  2. 提取参数值:

    matlab
    复制
    for n=1:length(paramNames)
        p.(paramNames{n}) = obj.p.(paramNames{n}).val;
    end
    • 将参数值从 obj 中提取并存储在结构体 p 中。

  3. 提取状态初始值:

    matlab
    复制
    for n=1:length(stateNames)
        if isscalar(obj.x.(stateNames{n}).val) 
            x.(stateNames{n}) = obj.x.(stateNames{n}).val;
        else
            x.(stateNames{n}) = obj.x.(stateNames{n}).val(1,2); 
        end
    end
    • 如果状态的初始值是标量,则直接使用该值;否则,使用轨迹的第一个值。

  4. 提取输入初始值:

    matlab
    复制
    for n=1:length(inputNames)
        d.(inputNames{n}) = obj.d.(inputNames{n}).val(1,2); 
    end
    • 使用输入轨迹的第一个值作为初始值。

  5. 提取控制初始值:

    matlab
    复制
    for n=1:length(ctrlNames)
        if isempty(obj.u.(ctrlNames{n}).val) % no value given, need to calculate
            try
                u.(ctrlNames{n}) = eval(obj.u.(ctrlNames{n}).def);
            catch err
                msg = sprintf('%s \n\nFailed to evaluate the definition of DynamicElement u.%s (n=%d): \n\t''%s''',...
                    err.message, ctrlNames{n}, n, obj.u.(ctrlNames{n}).def);
                id = 'MATLAB:StateSpaceModel:eval';
                error(id,msg);
            end
        elseif ~isscalar(obj.u.(ctrlNames{n}).val) 
            u.(ctrlNames{n}) = obj.u.(ctrlNames{n}).val(1,2); 
        end
    end
    • 如果控制未提供初始值,则通过其定义(def)计算初始值。

    • 如果控制是轨迹形式,则使用轨迹的第一个值。

  6. 提取辅助状态初始值:

    matlab
    复制
    for n=1:length(auxNames)
        try
            obj.a.(auxNames{n}).val = eval(obj.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, obj.a.(auxNames{n}).def);
            id = 'MATLAB:StateSpaceModel:eval';
            error(id,msg);
        end
        a.(auxNames{n}) = obj.a.(auxNames{n}).val;
    end
    • 通过辅助状态的定义(def)计算初始值,并将其保存到 obj 中。


2. getOde 函数

matlab
复制
function dxdt = getOde(t, x, ssm)
  • 功能:

    • 获取状态空间模型的微分方程(ODEs),用于 MATLAB 的 ODE 求解器(如 ode45ode15s)。

    • 根据当前时间 t 和状态 x,计算状态变量的导数。

代码逻辑

  1. 获取字段名称:

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

  2. 提取输入值:

    matlab
    复制
    for k=1:length(inputNames)
        if t < obj.d.(inputNames{k}).val(1,1)
            d.(inputNames{k}) = obj.d.(inputNames{k}).val(1,2);
        elseif t > obj.d.(inputNames{k}).val(end,1)
            d.(inputNames{k}) = obj.d.(inputNames{k}).val(end,2);
        else
            d.(inputNames{k}) = interp1(obj.d.(inputNames{k}).val(:,1),...
                obj.d.(inputNames{k}).val(:,2),t); 
        end                
    end
    • 根据当前时间 t 对输入数据进行插值,得到输入值。

  3. 提取控制值:

    matlab
    复制
    for k=1:length(ctrlNames)
        if strcmp(obj.u.(ctrlNames{k}).def, ['u.' ctrlNames{k}]) 
            % the def for the control is the control name, control acts as input
             if t < obj.u.(ctrlNames{k}).val(1,1)
                u.(ctrlNames{k}) = obj.u.(ctrlNames{k}).val(1,2);
            elseif t > obj.u.(ctrlNames{k}).val(end,1)
                u.(ctrlNames{k}) = obj.u.(ctrlNames{k}).val(end,2);
            else
                u.(ctrlNames{k}) = interp1(obj.u.(ctrlNames{k}).val(:,1),...
                    obj.u.(ctrlNames{k}).val(:,2),tHalf); 
             end
        else % control is rule based, acts as an auxiliary state
            % need to calculate
            try
                u.(ctrlNames{k}) = eval(obj.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, obj.u.(ctrlNames{k}).def);
                id = 'MATLAB:StateSpaceModel:eval';
                error(id,msg);
            end
        end
    end
    • 根据当前时间 t 对控制数据进行插值或通过规则计算控制值。

  4. 计算状态变量的导数:

    matlab
    复制
    dxdt = zeros(length(stateNames), 1);
    for n=1:length(stateNames)
        try
            dxdt(n) = eval(obj.x.(stateNames{n}).def);
        catch err
            msg = sprintf('%s \n\nFailed to evaluate the definition of DynamicElement x.%s (n=%d): \n\t''%s''',...
                err.message, stateNames{n}, n, obj.x.(stateNames{n}).def);
            id = 'MATLAB:StateSpaceModel:eval';
            error(id,msg);
        end
    end
    • 根据状态的定义(def)计算状态变量的导数。


总结

  • setInitialValues:

    • 用于设置状态空间模型的初始值,包括状态、辅助状态、控制和输入。

    • 如果某些动态元素未提供初始值,则通过其定义计算初始值。

  • getOde:

    • 用于获取状态空间模型的微分方程(ODEs),适用于 MATLAB 的 ODE 求解器。

    • 根据当前时间 t 和状态 x,计算状态变量的导数。

这两个函数在状态空间模型的仿真和分析中非常有用,特别是在需要设置初始值或使用 MATLAB 的 ODE 求解器进行数值求解时。

暂无评论

发送评论 编辑评论


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