我是靠谱客的博主 风趣西牛,最近开发中收集的这篇文章主要介绍RBF-PID的s-function实现以及Simulink的模块封装,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

位置式PID算法
{ e r r o r ( k ) = r i n ( k ) − y o u t ( k ) x ( 1 ) = e r r o r ( k ) x ( 2 ) = x ( 2 ) + T s ∗ e r r o r ( k ) x ( 3 ) = e r r o r ( k ) − e r r o r ( k − 1 ) p i d = [ K p   K i   K d ] u ( k ) = p i d ∗ x begin{cases}error(k)=rin(k)-yout(k) \x(1)=error(k) \x(2)=x(2)+Ts*error(k)\x(3)=error(k)-error(k-1)\pid = [K_p :K_i:K_d]\u(k)=pid*xend{cases} error(k)=rin(k)yout(k)x(1)=error(k)x(2)=x(2)+Tserror(k)x(3)=error(k)error(k1)pid=[KpKiKd]u(k)=pidx
u ( k ) u(k) u(k)为控制量相当于状态量x与pid参数的线性组合,为了动态调整pid参数构建一个单神经元网络,性能指标函数取 J = ∑ ( r i n ( k ) − y o u t ( k ) ) 2 / 2 J=sum(rin(k)-yout(k))^2/2 J=(rin(k)yout(k))2/2;根据梯度下降法调整pid参数,即 Δ K p = − η ∂ J ∂ K p Delta K_p=-etafrac{partial J}{partial K_p} ΔKp=ηKpJ,这个怎么求偏导?
Δ K p = − η ∂ J ∂ K p = − η ∂ J ∂ y o u t ∂ y o u t ∂ Δ u ∂ Δ u ∂ K p = η . e o r r o r ( k ) . x ( 1 ) . ∂ y o u t ∂ Δ u Delta K_p=-etafrac{partial J}{partial K_p}=-etafrac{partial J}{partial yout}frac{partial yout}{partial Delta u}frac{partial Delta u}{partial K_p}=eta .eorror(k).x(1).frac{partial yout}{partial Delta u} ΔKp=ηKpJ=ηyoutJΔuyoutKpΔu=η.eorror(k).x(1).Δuyout,利用RBF网络的逼近能力,识别系统的Jacobian阵,即 ∂ y o u t ∂ Δ u frac{partial yout}{partial Delta u} Δuyout

function [sys,x0,str,ts,simStateCompliance] = PID_RBF_s(t,x,u,flag)
% 网络结构3-6-1

% 采样时间
Ts = 0.001;
switch flag
    case 0
        [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(Ts);
    case 2
        sys=mdlUpdate(x,u,Ts);
    case 3
        sys=mdlOutputs(t,x,u);
    case {1,4,9}
        sys=[];
    otherwise
        DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end

function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes(Ts)
sizes = simsizes;

sizes.NumContStates  = 0;
sizes.NumDiscStates  = 3;
sizes.NumOutputs     = 2;
sizes.NumInputs      = 4;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   

sys = simsizes(sizes);
x0  = [0;0;0];
str = [];
ts  = [Ts 0];
simStateCompliance = 'UnknownSimState';

function sys=mdlUpdate(x,u,Ts)

sys=[u(1);
    x(2) + u(1)*Ts;
    (u(1) - u(2))];

function sys=mdlOutputs(t,x,u)
persistent w w_1 w_2 h c PID_parm
% PID三个三个参数学习效率
xitePID = [1 1 1];
% RBF网络学习效率
xite = 0.5;
% RBF网络动量因子
alfa = 0.5;
% 高斯基函数宽度
b = 3;
if t == 0
    % PID参数初值
    PID_parm = [0.7 0 1];
    % 高斯基函数中心矩阵,取值范围在输入信号范围内
    c = [linspace(-1,1,6);linspace(0,1,6);linspace(0,1,6)];
    h = zeros(6,1);
    w = zeros(6,1);
    w_1 = w;
    w_2 = w_1;
end
uu = PID_parm*x;
RBF_input = [uu u(3) u(4)]';
for j = 1:6
    h(j) = exp(-norm(RBF_input - c(:,j))^2/(2*b^2));
end
ymout =  w'*h;
d_w = xite*(u(3) - ymout)*h;
w = w_1 + d_w + alfa*(w_1 - w_2);
yu = w.*h.*(-RBF_input(1) + c(1,:))'/b^2;
% Jacobian阵
dyout = sum(yu);
PID_parm = PID_parm + u(1)*dyout*x'.*xitePID;
w_2 = w_1;
w_1 = w;
sys = [uu;ymout];

Siumlink封装模块
在这里插入图片描述

最后

以上就是风趣西牛为你收集整理的RBF-PID的s-function实现以及Simulink的模块封装的全部内容,希望文章能够帮你解决RBF-PID的s-function实现以及Simulink的模块封装所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部