0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MATLAB學(xué)習(xí)筆記之WM算法

jf_78858299 ? 來(lái)源:滑小稽筆記 ? 作者:電子技術(shù)園地 ? 2023-02-27 14:40 ? 次閱讀

在現(xiàn)代智能控制算法中,模糊控制是在實(shí)際控制系統(tǒng)設(shè)計(jì)中使用比較成熟的一種方法。模糊控制可以使用在一些無(wú)法建立系統(tǒng)模型的場(chǎng)合,根據(jù)專家經(jīng)驗(yàn)確定模糊規(guī)則,實(shí)現(xiàn)對(duì)系統(tǒng)的控制。

WM算法是一種一種基本的模糊控制算法。該算法的思想是根據(jù)采樣的數(shù)據(jù)對(duì)(一組輸入、輸出數(shù)據(jù)),確定出模糊規(guī)則,通常是一條數(shù)據(jù)對(duì)就確定一條規(guī)則。

首先我們需要確定系統(tǒng)的輸入輸出數(shù)量,假設(shè)系統(tǒng)為單輸入單輸出。對(duì)輸入變量x,輸出變量y分別劃分模糊集合,可以使用正態(tài)分布隸屬度函數(shù),或者三角隸屬度函數(shù)來(lái)劃分。這叫做變量的模糊化。如x的論域?yàn)閇0,2],劃分13個(gè)模糊集合,分別為A1~A13,如下圖所示。

對(duì)于輸出y,論域?yàn)閇-1.5,1.5],劃分13個(gè)模糊集合,為B1~B13,如下圖所示。

現(xiàn)在有0-2論域上均勻分布的樣本點(diǎn)共21個(gè),利用它們來(lái)確定模糊規(guī)則。

需要分別計(jì)算每一個(gè)數(shù)據(jù)點(diǎn)在模糊集合上的隸屬度,選取最高的隸屬度值作為確定一條模糊規(guī)則的依據(jù)。如樣本點(diǎn)(0.2,1),需要計(jì)算0.2在輸入隸屬度函數(shù)中的隸屬度值,需要計(jì)算13個(gè)值,找出其中最大的值如A5,則輸入為A5,再計(jì)算輸出1在13個(gè)模糊集合中的隸屬度函數(shù)值,找出最大的那個(gè),如B2,則輸出為B2,由此可以確定一條模糊規(guī)則:IF x=A5 THEN y=B2,由此可以確定21個(gè)規(guī)則;但是這些規(guī)則有大量的重復(fù)和沖突的規(guī)則,需要計(jì)算它們置信度

由此公式可以求出矛盾規(guī)則的置信度,把置信度低的規(guī)則去掉;按照WM算法的提出則王立新的做法,還應(yīng)該乘上一個(gè)專家經(jīng)驗(yàn)系數(shù),也就是專家認(rèn)為這條規(guī)則的可信度大不大。上面的公式改寫為:

由此建立了模糊規(guī)則庫(kù)

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的隸屬集合的下標(biāo),第二行代表輸出y的隸屬集合的下標(biāo)。利用模糊規(guī)則庫(kù),計(jì)算輸出y。根據(jù)去模糊化公式即可計(jì)算輸出值:

(1)計(jì)算輸出變量y的隸屬度函數(shù)值,創(chuàng)建u_y_B.m文件輸入以下代碼:

%y:輸出變量的值
%a:區(qū)間中點(diǎn)的值
%left:表示論域區(qū)間的左端點(diǎn)
%right:表示論域區(qū)間的右端點(diǎn)
%step:三角形底邊長(zhǎng)的一半
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)計(jì)算輸入隸屬度(輸入模糊化),創(chuàng)建u_x.m文件輸入以下代碼:

%x:輸入值
%u:輸出一個(gè)有隸屬度組成的數(shù)組
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)計(jì)算輸入變量x的隸屬度函數(shù)值,創(chuàng)建u_x_A.m文件輸入以下代碼:

%x:輸入變量的值
%a:區(qū)間中點(diǎn)的值
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算法實(shí)現(xiàn)腳本,創(chuàng)建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( 'ê?3??μx' ) ;
ylabel( 'ê?è??μy' ) ;
title( 'y=0.9*sin(pi*t)+0.3*cos(3*pi*t)' ) ;
%獲取采樣點(diǎn)
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 ) ;                                 %計(jì)算采樣個(gè)數(shù)
% %論域x劃分set_X個(gè)模糊區(qū)間,使用高斯隸屬函數(shù),論域[0,2]
set_X = 13 ;
xmin = 0 ;
xmax = 2 ;
x_step = ( xmax-xmin )/( set_X-1 ) ;                              %x模糊集合的步長(zhǎng)
av_x = xmin: x_step: xmax;                                          %計(jì)算高斯分布均值
sigma_x = sqrt( -x_step^2/( 8*log( 0.5 ) ) ) ;                  %計(jì)算高斯分布方差
%繪制x的模糊函數(shù)曲線
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的模糊區(qū)間劃分以及隸屬度' ) ;
%論域y劃分set_Y模糊區(qū)間,使用三角隸屬函數(shù),論域[-1.5,1.5]
set_Y = 13 ;
ymin = -1.5 ;
ymax = 1.5 ;
y_step = ( ymax-ymin )/( set_Y+1 ) ;                            %y模糊集合的步長(zhǎng)
a = ymin ;                                                           %保存論域下限
%繪制y的模糊函數(shù)曲線
y = ymin: 0.01: ymax ;                                             %獲取一組y的數(shù)值
figure( 3 )
for i=1:set_Y
    a = a+y_step ;
    plot( u_y_B( y, a, ymin, ymax, y_step ) ) ;                %繪制y的模糊函數(shù)曲線
    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的模糊區(qū)間劃分以及隸屬度' ) ;
% WM算法
uxA = zeros( sample_num, set_X ) ;                               %存儲(chǔ)每條樣本數(shù)據(jù)x的隸屬度函數(shù)值
uyB = zeros( sample_num, set_Y ) ;                               %存儲(chǔ)每條樣本數(shù)據(jù)y的隸屬度函數(shù)值
for i=1:set_X
    uxA( :, i ) = gaussmf( sample_x, [ sigma_x, av_x(i) ] ) ;%樣本x在第i個(gè)模糊區(qū)間的隸屬度值
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個(gè)模糊區(qū)間的隸屬度值
end
WM_rule = zeros( 3, sample_num ) ;                                %保存樣本數(shù)據(jù)所在模糊集合下標(biāo)
[ ~, WM_rule(1,:) ] = max( uxA, [], 2 ) ;                       %計(jì)算每個(gè)樣本x所在的模糊集合下標(biāo)
[ ~, WM_rule(2,:) ] = max( uyB, [], 2 ) ;                       %計(jì)算每個(gè)樣本y所在的模糊集合下標(biāo)
 for i=1:sample_num
    WM_rule(3,i) = uxA( i,WM_rule(1,i) )*uyB( i,WM_rule(2,i) ) ;%計(jì)算每條規(guī)則的有效性
 end
 %去除信任度低的規(guī)則
 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 ) ) = [] ;                            %去除多于的規(guī)則

(5)WM算法測(cè)試腳本,創(chuàng)建test02.m文件并輸入以下代碼:

p_value = zeros( 1, set_Y ) ;                        %用于保存y模糊函數(shù)尖點(diǎn)所對(duì)應(yīng)的橫坐標(biāo)的值
a = ymin ;
for i = 1: set_Y
    a = a + y_step ;
    p_value( i ) = a ;                                 %保存y模糊函數(shù)尖點(diǎn)所對(duì)應(yīng)的橫坐標(biāo)的值
end
%測(cè)試規(guī)則
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 ) ;
%畫出原始函數(shù)的曲線
plot( x, y, '-g' ) ;
xlabel( '輸入值x ' ) ;
ylabel( '輸出值y' ) ;
title( '使用WM模糊控制算法的結(jié)果' ) ;
legend( ' WM算法輸出曲線','原始輸出曲線' ) ;
grid on ;

運(yùn)行結(jié)果如下圖所示。


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • matlab
    +關(guān)注

    關(guān)注

    180

    文章

    2957

    瀏覽量

    229908
  • 智能控制
    +關(guān)注

    關(guān)注

    4

    文章

    584

    瀏覽量

    42195
  • 模糊控制
    +關(guān)注

    關(guān)注

    2

    文章

    260

    瀏覽量

    25476
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    【DOC】MATLAB程序?qū)嵗?b class='flag-5'>之遺傳算法

    【DOC】MATLAB程序?qū)嵗?b class='flag-5'>之遺傳算法附件:
    發(fā)表于 02-28 11:11

    matlabdsp學(xué)習(xí)

    matlabdsp學(xué)習(xí)
    發(fā)表于 07-05 17:20

    算法圖解學(xué)習(xí)筆記分享

    算法圖解學(xué)習(xí)筆記03:分而治之
    發(fā)表于 06-05 17:42

    求大佬分享MatLab學(xué)習(xí)筆記

    求大佬分享MatLab學(xué)習(xí)筆記
    發(fā)表于 11-19 07:00

    Matlab/Simulink電路建模學(xué)習(xí)筆記

    本文為作者Matlab/Simulink電路建模學(xué)習(xí)筆記歡迎交流討論,喜歡的話點(diǎn)個(gè)贊吧1、打開Simulink并創(chuàng)建文件如圖點(diǎn)擊即可:2、選擇電路所需元件,連接電路選擇元器件主要有兩種方法:在庫(kù)
    發(fā)表于 12-31 07:32

    PID算法學(xué)習(xí)筆記分享

    最近在學(xué)習(xí)與無(wú)人機(jī)有關(guān)的一些控制算法,在這里做一些筆記,今天學(xué)的是有關(guān)于PID的算法。什么是PID首先關(guān)于PID的定義,因?yàn)槲冶旧聿皇亲詣?dòng)控制專業(yè)出身所以對(duì)于概念這個(gè)東西比較模糊,可以
    發(fā)表于 01-14 06:50

    學(xué)習(xí)筆記12864串行顯示

    學(xué)習(xí)筆記12864串行顯示講解,很好的資料下載吧。
    發(fā)表于 01-13 16:09 ?0次下載

    STM32各模塊學(xué)習(xí)筆記

    STM32個(gè)模塊學(xué)習(xí)筆記 目錄 STM32筆記之一 中斷優(yōu)先級(jí).....................................................1 STM32筆記
    發(fā)表于 11-30 03:32 ?3120次閱讀

    流形學(xué)習(xí)LLE算法的配套Matlab源碼匯總

    流形學(xué)習(xí)LLE算法的配套Matlab源碼匯總
    發(fā)表于 08-25 09:30 ?1次下載

    OpenStackCinder學(xué)習(xí)筆記

    OpenStackCinder學(xué)習(xí)筆記(開關(guān)電源技術(shù)教程ppt)-該文檔為OpenStackCinder學(xué)習(xí)
    發(fā)表于 09-23 12:40 ?5次下載
    OpenStack<b class='flag-5'>之</b>Cinder<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>

    51單片機(jī)學(xué)習(xí)筆記數(shù)碼管1顯示數(shù)字0以及使用蜂鳴器

    51單片機(jī)學(xué)習(xí)筆記數(shù)碼管1顯示數(shù)字0以及使用蜂鳴器
    發(fā)表于 11-14 14:36 ?8次下載
    51單片機(jī)<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b>數(shù)碼管1顯示數(shù)字0以及使用蜂鳴器

    ROS 學(xué)習(xí)筆記五:對(duì)Arduino環(huán)境刮目相看

    ROS 學(xué)習(xí)筆記五:對(duì)Arduino環(huán)境刮目相看
    發(fā)表于 11-29 09:51 ?2次下載
    ROS <b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b>五:對(duì)Arduino環(huán)境刮目相看

    STM32學(xué)習(xí)筆記1——軟硬件基礎(chǔ)keil5編程與GPIO開發(fā)

    STM32學(xué)習(xí)筆記1——軟硬件基礎(chǔ)keil5編程與GPIO開發(fā)
    發(fā)表于 11-30 12:36 ?4次下載
    STM32<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b>1——軟硬件基礎(chǔ)<b class='flag-5'>之</b>keil5編程與GPIO開發(fā)

    HT32F52352學(xué)習(xí)筆記

    HT32F52352學(xué)習(xí)筆記
    發(fā)表于 12-02 20:36 ?6次下載
    HT32F52352<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>筆記</b><b class='flag-5'>之</b>六

    利用Matlab函數(shù)實(shí)現(xiàn)深度學(xué)習(xí)算法

    Matlab中實(shí)現(xiàn)深度學(xué)習(xí)算法是一個(gè)復(fù)雜但強(qiáng)大的過(guò)程,可以應(yīng)用于各種領(lǐng)域,如圖像識(shí)別、自然語(yǔ)言處理、時(shí)間序列預(yù)測(cè)等。這里,我將概述一個(gè)基本的流程,包括環(huán)境設(shè)置、數(shù)據(jù)準(zhǔn)備、模型設(shè)計(jì)、訓(xùn)練過(guò)程、以及測(cè)試和評(píng)估,并提供一個(gè)基于
    的頭像 發(fā)表于 07-14 14:21 ?1636次閱讀