0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是WM算法

汽车电子技术 来源:滑小稽笔记 作者:电子技术园地 2023-03-01 14:21 次阅读

在现代智能控制算法中,模糊控制是在实际控制系统设计中使用比较成熟的一种方法。模糊控制可以使用在一些无法建立系统模型的场合,根据专家经验确定模糊规则,实现对系统的控制。

WM算法是一种一种基本的模糊控制算法。该算法的思想是根据采样的数据对(一组输入、输出数据),确定出模糊规则,通常是一条数据对就确定一条规则。

首先我们需要确定系统的输入输出数量,假设系统为单输入单输出。对输入变量x,输出变量y分别划分模糊集合,可以使用正态分布隶属度函数,或者三角隶属度函数来划分。这叫做变量的模糊化。如x的论域为[0,2],划分13个模糊集合,分别为A1~A13,如下图所示。

图片

对于输出y,论域为[-1.5,1.5],划分13个模糊集合,为B1~B13,如下图所示。

图片

现在有0-2论域上均匀分布的样本点共21个,利用它们来确定模糊规则。

需要分别计算每一个数据点在模糊集合上的隶属度,选取最高的隶属度值作为确定一条模糊规则的依据。如样本点(0.2,1),需要计算0.2在输入隶属度函数中的隶属度值,需要计算13个值,找出其中最大的值如A5,则输入为A5,再计算输出1在13个模糊集合中的隶属度函数值,找出最大的那个,如B2,则输出为B2,由此可以确定一条模糊规则:IF x=A5 THEN y=B2,由此可以确定21个规则;但是这些规则有大量的重复和冲突的规则,需要计算它们置信度

图片

由此公式可以求出矛盾规则的置信度,把置信度低的规则去掉;按照WM算法的提出则王立新的做法,还应该乘上一个专家经验系数,也就是专家认为这条规则的可信度大不大。上面的公式改写为:

图片

由此建立了模糊规则库

X A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11
Y B5 B5 B6 B7 B6 B3 B3 B2 B1 B2 B5

上面表中的第一行代表输入x的隶属集合的下标,第二行代表输出y的隶属集合的下标。利用模糊规则库,计算输出y。根据去模糊化公式即可计算输出值:

图片

(1)计算输出变量y的隶属度函数值,创建u_y_B.m文件输入以下代码:

%y:输出变量的值
%a:区间中点的值
%left:表示论域区间的左端点
%right:表示论域区间的右端点
%step:三角形底边长的一半
function u = u_y_B( y, a, left, right, step )
b = a-step ;
c = a+step ;
len = length( y ) ;
u = zeros( 1, len ) ;
for i = 1: len
    if a==left+step
        if y(i)>=b && y(i)<=a
            u(i) = 1 ;
        end
        if y(i)>a && y(i)<=c
            u(i) = ( c-y(i) )/( c-a ) ;
        end
        if y(i)y(i)>c
            u(i) = 0 ;
        end
    elseif a==right-step
        if y(i)>=b && y(i)<=a
            u(i) = ( y(i)-b )/( a-b ) ;
        end
        if y(i)>a && y(i)<=c
            u(i) = 1 ;
        end
        if y(i)y(i)>c
            u(i) = 0 ;
        end
    else
        if y(i)>=b && y(i)<=a
            u(i) = ( y(i)-b )/( a-b ) ;
        end
        if y(i)>a && y(i)<=c
            u(i)=( c-y(i) )/( c-a ) ;
        end
        if y(i)y(i)>c
            u(i) = 0 ;
        end
    end
end
end

(2)计算输入隶属度(输入模糊化),创建u_x.m文件输入以下代码:

%x:输入值
%u:输出一个有隶属度组成的数组
function u = u_x( x )
a = 0 ;
u = zeros( 1, 10 ) ;
for i = 1: 10
    a = a + 0.2 ;
    u(i) = u_x_A( x, a ) ;
end
end

(3)计算输入变量x的隶属度函数值,创建u_x_A.m文件输入以下代码:

%x:输入变量的值
%a:区间中点的值
function u = u_x_A( x, a )
len = length( x ) ;
u = zeros( 1, len ) ;
b = a - 0.2 ;
c = a + 0.2 ;
for i=1:len
    if a==0.2
        if x(i)>=b && x(i)<=a
            u(i) = 1 ;
        end
        if x(i)>a && x(i)<=c
            u(i)=( c-x(i) )/( c-a ) ;
        end
        if x(i)i)>c
            u(i) = 0 ;
        end
    elseif a==1.8
        if x(i)>=b && x(i)<=a
            u(i) = ( x(i)-b )/( a-b ) ;
        end
        if x(i)>a && x(i)<=c
            u(i) = 1 ;
        end
        if x(i)i)>c
            u(i) = 0 ;
        end
    else
        if x(i)>=b && x(i)<=a
            u(i) = ( x(i)-b )/( a-b ) ;
        end
        if x(i)>a && x(i)<=c
            u(i) = ( c-x(i) )/( c-a ) ;
        end
        if x(i)i)>c
            u(i) = 0 ;
        end
    end
end
end

(4)WM算法实现脚本,创建test01.m文件并输入以下代码:

clc
clear
%绘制原始图像
t = 0: 0.01: 2;
y = 0.9*sin( pi*t )+0.3*cos( 3*pi*t );
plot( t, y );
grid on;
xlabel( 'Êä³öÖµx' ) ;
ylabel( 'ÊäÈëÖµy' ) ;
title( 'y=0.9*sin(pi*t)+0.3*cos(3*pi*t)' ) ;
%获取采样点
sample_x = 0: 0.1: 2;
sample_y = 0.9*sin( pi*sample_x )+0.3*cos( 3*pi*sample_x  );
sample_num = length( sample_x ) ;                                 %计算采样个数
% %论域x划分set_X个模糊区间,使用高斯隶属函数,论域[0,2]
set_X = 13 ;
xmin = 0 ;
xmax = 2 ;
x_step = ( xmax-xmin )/( set_X-1 ) ;                              %x模糊集合的步长
av_x = xmin: x_step: xmax;                                          %计算高斯分布均值
sigma_x = sqrt( -x_step^2/( 8*log( 0.5 ) ) ) ;                  %计算高斯分布方差
%绘制x的模糊函数曲线
x = xmin: 0.01: xmax ;
figure( 2 )
for i=1:set_X
    plot( gaussmf( x, [ sigma_x, av_x(i) ] ) ) ;
    hold on;
end
grid on;
legend( 'A1','A2','A3','A4','A5','A6','A7','A8','A9','A10','A11','A12','A13' ) ;
xlabel( '输入值x ' );
ylabel( '隶属度值u (x)' );
set( gca,'XTick', 0:50:250 ) ;
set( gca,'XTickLabel', {'0','0.5','1.0','1.5','2','2.5'} ) ;
title( '输入变量x的模糊区间划分以及隶属度' ) ;
%论域y划分set_Y模糊区间,使用三角隶属函数,论域[-1.5,1.5]
set_Y = 13 ;
ymin = -1.5 ;
ymax = 1.5 ;
y_step = ( ymax-ymin )/( set_Y+1 ) ;                            %y模糊集合的步长
a = ymin ;                                                           %保存论域下限
%绘制y的模糊函数曲线
y = ymin: 0.01: ymax ;                                             %获取一组y的数值
figure( 3 )
for i=1:set_Y
    a = a+y_step ;
    plot( u_y_B( y, a, ymin, ymax, y_step ) ) ;                %绘制y的模糊函数曲线
    hold on ;
end
grid on;
legend( 'B1','B2','B3','B4','B5','B6','B7','B8','B9','B10','B11','B12','B13' ) ;
xlabel( '输出值y' );
ylabel( '隶属度值u(y)' );
set( gca, 'XTick', 0:50:350 ) ;
set( gca, 'XTickLabel', {'-1.5','-1.0','-0.5','0','0.5','1.0','1.5','2.0'} ) ;
title( '输出变量y的模糊区间划分以及隶属度' ) ;
% WM算法
uxA = zeros( sample_num, set_X ) ;                               %存储每条样本数据x的隶属度函数值
uyB = zeros( sample_num, set_Y ) ;                               %存储每条样本数据y的隶属度函数值
for i=1:set_X
    uxA( :, i ) = gaussmf( sample_x, [ sigma_x, av_x(i) ] ) ;%样本x在第i个模糊区间的隶属度值
end
a = ymin ;
for i=1:set_Y
    a = a+y_step ;
uyB( :, i ) = u_y_B( sample_y, a, ymin, ymax, y_step ) ; %样本y在第i个模糊区间的隶属度值
end
WM_rule = zeros( 3, sample_num ) ;                                %保存样本数据所在模糊集合下标
[ ~, WM_rule(1,:) ] = max( uxA, [], 2 ) ;                       %计算每个样本x所在的模糊集合下标
[ ~, WM_rule(2,:) ] = max( uyB, [], 2 ) ;                       %计算每个样本y所在的模糊集合下标
 for i=1:sample_num
    WM_rule(3,i) = uxA( i,WM_rule(1,i) )*uyB( i,WM_rule(2,i) ) ;%计算每条规则的有效性
 end
 %去除信任度低的规则
 for i = 2:sample_num
    if WM_rule( 1, i-1 )==WM_rule( 1, i )
        if WM_rule( 3, i-1 )<=WM_rule( 3, i )
            WM_rule( :, i-1 ) = 0 ;
        else
            WM_rule( :, i ) = 0 ;
        end
    end
 end
WM_rule( :, all( WM_rule==0,1 ) ) = [] ;                            %去除多于的规则

(5)WM算法测试脚本,创建test02.m文件并输入以下代码:

p_value = zeros( 1, set_Y ) ;                        %用于保存y模糊函数尖点所对应的横坐标的值
a = ymin ;
for i = 1: set_Y
    a = a + y_step ;
    p_value( i ) = a ;                                 %保存y模糊函数尖点所对应的横坐标的值
end
%测试规则
x = 0 ;
WM_y_x = zeros( 1, 201 ) ;
for i = 1: 201
    x = x + 0.01 ;
    ux = zeros ( 1, set_X ) ;
    for j = 1: set_X
        ux(j) = gaussmf( x, [ sigma_x, av_x(j) ] ) ;
    end
    num = 0 ;
    den = 0 ;
    for j = 1: set_X
        num = num + p_value( WM_rule( 2, j ) )*ux(j);
        den = den + ux(j) ;
    end
    WM_y_x(i) = num/den ;
end
figure(4);
%绘制WM算法的输出曲线
x = 0: 0.01: 2 ;
plot( x, WM_y_x, '-.b' ) ;
hold on ;
y = 0.9*sin( pi*x )+0.3*cos( 3*pi*x ) ;
%画出原始函数的曲线
plot( x, y, '-g' ) ;
xlabel( '输入值x ' ) ;
ylabel( '输出值y' ) ;
title( '使用WM模糊控制算法的结果' ) ;
legend( ' WM算法输出曲线','原始输出曲线' ) ;
grid on ;

运行结果如下图所示。

图片


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据
    +关注

    关注

    8

    文章

    6512

    浏览量

    87601
  • 采样
    +关注

    关注

    1

    文章

    109

    浏览量

    25371
  • 模糊控制算法

    关注

    0

    文章

    6

    浏览量

    3886
收藏 人收藏

    评论

    相关推荐

    编程wm的值会被修改

    有如下一段代码,只要把第3行和第四行注释掉,运行到第五行时,wm的值就会被修改。之前已经调用过一次wm=MUI_GetWm(data->parent_id);wm是一个指针,指向一个结构体
    发表于 11-12 09:02

    为什么我用WM_CreateTimer(WM_HBKWIN,0,1000,0)隐藏窗口后在WM_TIMER上无法显示?

    WM_CreateTimer(WM_HBKWIN,0,1000,0)隐藏窗口后在WM_TIMER上无法显示,我想是消息传递出现了问题,但是找不到问题出在哪里?case
    发表于 09-04 04:35

    WM回调函数的区别

    [C] 纯文本查看 复制代码static void cbForegroundWin1(WM_MESSAGE* pMsg){ switch (pMsg->MsgId) {case
    发表于 03-16 04:36

    关于WM_TOUCH消息怎么产生

    请教一下大家,我使用的是EMWIN+UCOSIII,现在建立了一个窗口,为什么只有点击左上一下块区域才会发出WM_TOUCH消息,其他位置没该消息发出?本来打算做一个触摸校准界面,现在卡在这个地方了
    发表于 05-04 04:36

    请教使用WM_SetCreateFlags的问题怎么解决

    芯片是stm32f103vct6驱动SSD1963裸机STEMWIN,屏是AT070TN92使用WM_SetCreateFlags(WM_CF_MEMDEV),界面切换就变得缓慢并且按钮控件都不
    发表于 05-21 04:35

    基于多模式匹配算法的供应商搜索系统

    为满足外贸企业在互联网上搜索供应商的现实需求,在WM 算法的基础上,引入压缩编码的思想,提出一种多模式中文信息匹配算法,实现相应的搜索系统。在测试与实际使用中,
    发表于 03-30 10:10 10次下载

    多模式匹配算法的性能分析

    多模式匹配算法效率直接影响入侵检测系统的性能和效率。在分析研究经典的AC算法WM算法和ExB算法的基础上,通过上机实验测试这些
    发表于 12-31 17:20 0次下载

    WM8310/WM8311/WM8312 欧胜微电子推出的电

    WM8310/WM8311/WM8312 欧胜微电子推出的电源管理集成电路(PMICs)产品系列 欧胜微电子(Wolfson)日前宣布在其现有的、成功的
    发表于 08-04 08:18 1002次阅读

    欧胜推出新型高性价比音频放大器WM9090和WM9010

    欧胜推出新型高性价比音频放大器WM9090和WM9010 WM9090 和 WM9010是欧胜世界领先的音频放大器系列产品的两个最新成员,将被应用于一系列全球最高集成度手机之中。
    发表于 02-23 09:49 1183次阅读

    wm是什么意思

    搞IT的居然没想起wm是什么意思,于是我查了一下和大家分享。windows mobile是微软的移动操作系统,简称WM
    发表于 02-04 13:22 4.8w次阅读

    WM8978数据手册

    WM8978数据手册好资料有需要的下来看看
    发表于 12-16 22:45 108次下载

    关于WM8731/WM8731L音频编解码芯片的简单介绍 pdf

    WM8731技术手册
    发表于 02-06 14:51 113次下载

    MATLAB学习笔记之WM算法

    在现代智能控制算法中,模糊控制是在实际控制系统设计中使用比较成熟的一种方法。模糊控制可以使用在一些无法建立系统模型的场合,根据专家经验确定模糊规则,实现对系统的控制。
    的头像 发表于 02-27 14:40 766次阅读
    MATLAB学习笔记之<b class='flag-5'>WM</b><b class='flag-5'>算法</b>

    索尼wm-d6c维修手册

    索尼wm-d6c维修手册 电路图 pcb原理图
    发表于 03-31 14:52 0次下载

    wm8978模块原理图

    wm8978模块原理图免费下载。
    发表于 05-15 09:19 22次下载