📄 drydemo.html
字号:
tmp = x(:, ones(1, 3))';X = tmp(:);tmp = [zeros(anfis_n, 1) max(trn_error, chk_error) nan*ones(anfis_n, 1)]';Y = tmp(:);hold <span class="string">on</span>;plot(X, Y, <span class="string">'g'</span>);hold <span class="string">off</span>;axis([1 anfis_n -inf inf]);set(gca, <span class="string">'xticklabel'</span>, []);<span class="comment">% ====== Add text of input variables</span><span class="keyword">for</span> k = 1:anfis_n, text(x(k), 0, <span class="keyword">...</span> [input_name(index(k,1), :) <span class="string">' '</span> <span class="keyword">...</span> input_name(index(k,2), :) <span class="string">' '</span> <span class="keyword">...</span> input_name(index(k,3), :)]);<span class="keyword">end</span>h = findobj(gcf, <span class="string">'type'</span>, <span class="string">'text'</span>);set(h, <span class="string">'rot'</span>, 90, <span class="string">'fontsize'</span>, 11, <span class="string">'hori'</span>, <span class="string">'right'</span>);drawnow<span class="comment">% ====== Generate input_index for bjtrain.m</span>[a b] = min(trn_error);input_index = index(b,:);title(<span class="string">'Training (Circles) and Checking (Asterisks) Errors'</span>);ylabel(<span class="string">'RMSE'</span>);</pre><pre class="codeoutput">Train 36 ANFIS models, each with 3 inputs selected from 10 candidates...ANFIS model = 1: y(k-1) y(k-2) u(k-1) --> trn=0.0990, chk=0.0962ANFIS model = 2: y(k-1) y(k-2) u(k-2) --> trn=0.0852, chk=0.0862ANFIS model = 3: y(k-1) y(k-2) u(k-3) --> trn=0.0474, chk=0.0485ANFIS model = 4: y(k-1) y(k-2) u(k-4) --> trn=0.0808, chk=0.0822ANFIS model = 5: y(k-1) y(k-2) u(k-5) --> trn=0.1023, chk=0.0991ANFIS model = 6: y(k-1) y(k-2) u(k-6) --> trn=0.1021, chk=0.0974ANFIS model = 7: y(k-1) y(k-3) u(k-1) --> trn=0.1231, chk=0.1206ANFIS model = 8: y(k-1) y(k-3) u(k-2) --> trn=0.1047, chk=0.1085ANFIS model = 9: y(k-1) y(k-3) u(k-3) --> trn=0.0587, chk=0.0626ANFIS model = 10: y(k-1) y(k-3) u(k-4) --> trn=0.0806, chk=0.0836ANFIS model = 11: y(k-1) y(k-3) u(k-5) --> trn=0.1261, chk=0.1311ANFIS model = 12: y(k-1) y(k-3) u(k-6) --> trn=0.1210, chk=0.1151ANFIS model = 13: y(k-1) y(k-4) u(k-1) --> trn=0.1420, chk=0.1353ANFIS model = 14: y(k-1) y(k-4) u(k-2) --> trn=0.1224, chk=0.1229ANFIS model = 15: y(k-1) y(k-4) u(k-3) --> trn=0.0700, chk=0.0765ANFIS model = 16: y(k-1) y(k-4) u(k-4) --> trn=0.0817, chk=0.0855ANFIS model = 17: y(k-1) y(k-4) u(k-5) --> trn=0.1337, chk=0.1405ANFIS model = 18: y(k-1) y(k-4) u(k-6) --> trn=0.1421, chk=0.1333ANFIS model = 19: y(k-2) y(k-3) u(k-1) --> trn=0.2393, chk=0.2264ANFIS model = 20: y(k-2) y(k-3) u(k-2) --> trn=0.2104, chk=0.2077ANFIS model = 21: y(k-2) y(k-3) u(k-3) --> trn=0.1452, chk=0.1497ANFIS model = 22: y(k-2) y(k-3) u(k-4) --> trn=0.0958, chk=0.1047ANFIS model = 23: y(k-2) y(k-3) u(k-5) --> trn=0.2048, chk=0.2135ANFIS model = 24: y(k-2) y(k-3) u(k-6) --> trn=0.2388, chk=0.2326ANFIS model = 25: y(k-2) y(k-4) u(k-1) --> trn=0.2756, chk=0.2574ANFIS model = 26: y(k-2) y(k-4) u(k-2) --> trn=0.2455, chk=0.2400ANFIS model = 27: y(k-2) y(k-4) u(k-3) --> trn=0.1726, chk=0.1797ANFIS model = 28: y(k-2) y(k-4) u(k-4) --> trn=0.1074, chk=0.1157ANFIS model = 29: y(k-2) y(k-4) u(k-5) --> trn=0.2061, chk=0.2133ANFIS model = 30: y(k-2) y(k-4) u(k-6) --> trn=0.2737, chk=0.2836ANFIS model = 31: y(k-3) y(k-4) u(k-1) --> trn=0.3842, chk=0.3605ANFIS model = 32: y(k-3) y(k-4) u(k-2) --> trn=0.3561, chk=0.3358ANFIS model = 33: y(k-3) y(k-4) u(k-3) --> trn=0.2719, chk=0.2714ANFIS model = 34: y(k-3) y(k-4) u(k-4) --> trn=0.1763, chk=0.1808ANFIS model = 35: y(k-3) y(k-4) u(k-5) --> trn=0.2132, chk=0.2240ANFIS model = 36: y(k-3) y(k-4) u(k-6) --> trn=0.3460, chk=0.3601</pre><img vspace="5" hspace="5" src="drydemo_05.png"> <p>The popped window shows ANFIS predictions on both training and checking data sets. Obviously the performance is better than those of the ARX model. </p><pre class="codeinput"><span class="keyword">if</span> ishandle(winH1), delete(winH1); <span class="keyword">end</span>ss = 0.01;ss_dec_rate = 0.5;ss_inc_rate = 1.5;trn_data = data(1:trn_data_n, [input_index, size(data,2)]);chk_data = data(trn_data_n+1:600, [input_index, size(data,2)]);<span class="comment">% generate FIS matrix</span>in_fismat = genfis1(trn_data);[trn_out_fismat trn_error step_size chk_out_fismat chk_error] = <span class="keyword">...</span> anfis(trn_data, in_fismat, [1 nan ss ss_dec_rate ss_inc_rate], <span class="keyword">...</span> nan, chk_data, 1);subplot(2,1,1);index = 1:trn_data_n;plot(index, y(index), index, yp(index), <span class="string">'.'</span>);rmse = norm(y(index)-yp(index))/sqrt(length(index));title([<span class="string">'(a) Training Data (Solid Line) and ARX Prediction (Dots) with RMSE = '</span> num2str(rmse)]);disp([<span class="string">'[na nb d] = '</span> num2str(nn)]);xlabel(<span class="string">'Time Steps'</span>);subplot(2,1,2);index = (trn_data_n+1):(total_data_n);plot(index, y(index), index, yp(index), <span class="string">'.'</span>);rmse = norm(y(index)-yp(index))/sqrt(length(index));title([<span class="string">'(b) Checking Data (Solid Line) and ARX Prediction (Dots) with RMSE = '</span> num2str(rmse)]);xlabel(<span class="string">'Time Steps'</span>);</pre><pre class="codeoutput">ANFIS info: Number of nodes: 34 Number of linear parameters: 32 Number of nonlinear parameters: 18 Total number of parameters: 50 Number of training data pairs: 300 Number of checking data pairs: 300 Number of fuzzy rules: 8Start training ANFIS ... 1 0.0474113 0.0485325Designated epoch number reached --> ANFIS training completed at epoch 1.[na nb d] = 5 10 2</pre><img vspace="5" hspace="5" src="drydemo_06.png"> <pre class="codeinput">y_hat = evalfis(data(1:600,input_index), chk_out_fismat);subplot(2,1,1);index = 1:trn_data_n;plot(index, data(index, size(data,2)), <span class="string">'-'</span>, <span class="keyword">...</span> index, y_hat(index), <span class="string">'.'</span>);rmse = norm(y_hat(index)-data(index,size(data,2)))/sqrt(length(index));title([<span class="string">'Training Data (Solid Line) and ANFIS Prediction (Dots) with RMSE = '</span> num2str(rmse)]);xlabel(<span class="string">'Time Index'</span>); ylabel(<span class="string">''</span>);subplot(2,1,2);index = trn_data_n+1:600;plot(index, data(index, size(data,2)), <span class="string">'-'</span>, index, y_hat(index), <span class="string">'.'</span>);rmse = norm(y_hat(index)-data(index,size(data,2)))/sqrt(length(index));title([<span class="string">'Checking Data (Solid Line) and ANFIS Prediction (Dots) with RMSE = '</span> num2str(rmse)]);xlabel(<span class="string">'Time Index'</span>); ylabel(<span class="string">''</span>);</pre><img vspace="5" hspace="5" src="drydemo_07.png"> <p>The above table is a comparison among various modeling approaches. The ARX modeling spends the least amount of time to reach the worse precision, which the ANFIS modeling via exhaustive search takes the largest amount of time to reach the best percision. In other words, if fast modeling is the goal, then ARX is the right choice. But if precision is the utmost concern, then we can go for ANFIS that is designed for nonlinear modeling and higher precision. </p><pre class="codeinput">subplot(1,1,1)a=imread(<span class="string">'drytable.jpg'</span>, <span class="string">'jpg'</span>);image(a);axis <span class="string">image</span>;axis <span class="string">off</span>;</pre><img vspace="5" hspace="5" src="drydemo_08.png"> <p class="footer">Copyright 1994-2002 The MathWorks, Inc.<br> Published with MATLAB® 7.1<br></p> </div> <!--##### SOURCE BEGIN #####%% Nonlinear system identification% This demo addresses the use of ANFIS function in the Fuzzy Logic% Toolbox for nonlinear dynamical system identification. This demo also% requires the System Identification Toolbox, as a comparison is made% between a nonlinear ANFIS and a linear ARX model.%% Copyright 1994-2002 The MathWorks, Inc. % $Revision: 1.9 $% Exit if the IDENT toolbox is not on the pathif exist('arx.m','file') == 0 errordlg('DRYDEMO requires the System Identification Toolbox.'); return;end%%% The data set for ANFIS and ARX modeling was obtained from a laboratory% device called Feedback's Process Trainer PT 326, as described in Chapter% 17 of Prof. Lennart Ljung's book "System Identification, Theory for the% User", Prentice-Hall, 1987. The device's function is like a hair dryer:% air is fanned through a tube and heated at the inlet. The air temperature% is measure by a thermocouple at the outlet. The input u(k) is the voltage% over a mesh of resistor wires to heat incoming air; the output y(k) is% the outlet air temperature. Here is a the system modela=imread('dryblock.jpg', 'jpg');image(a); axis image;axis off;%%% Here are the results of the test.load dryer2;data_n = length(y2);output = y2;input = [[0; y2(1:data_n-1)] ... [0; 0; y2(1:data_n-2)] ... [0; 0; 0; y2(1:data_n-3)] ... [0; 0; 0; 0; y2(1:data_n-4)] ... [0; u2(1:data_n-1)] ... [0; 0; u2(1:data_n-2)] ... [0; 0; 0; u2(1:data_n-3)] ... [0; 0; 0; 0; u2(1:data_n-4)] ... [0; 0; 0; 0; 0; u2(1:data_n-5)] ... [0; 0; 0; 0; 0; 0; u2(1:data_n-6)]];data = [input output];data(1:6, :) = [];input_name = str2mat('y(k-1)','y(k-2)','y(k-3)','y(k-4)','u(k-1)','u(k-2)','u(k-3)','u(k-4)','u(k-5)','u(k-6)');trn_data_n = 300;index = 1:100;subplot(2,1,1);plot(index, y2(index), '-', index, y2(index), 'o');ylabel('y(k)');subplot(2,1,2);plot(index, u2(index), '-', index, u2(index), 'o');ylabel('u(k)');%%% The data points was collected at a sampling time of 0.08 second. One% thousand input-output data points were collected from the process as the% input u(k) was chosen to be a binary random signal shifting between 3.41% and 6.41 V. The probability of shifting the input at each sample was 0.2.% The data set is available from the System Identification Toolbox; and the% above plots show the output temperature y(k) and input voltage u(t) for% the first 100 time steps.%%% A conventional method is to remove the means from the data and assume a% linear model of the form:%% y(k)+a1*y(k-1)+...+am*y(k-m)=b1*u(k-d)+...+bn*u(k-d-n+1)%% where ai (i = 1 to m) and bj (j = 1 to n) are linear parameters to be% determined by least-squares methods. This structure is called the ARX% model and it is exactly specified by three integers [m, n, d]. To find an% ARX model for the dryer device, the data set was divided into a training% (k = 1 to 300) and a checking (k = 301 to 600) set. An exhaustive search% was performed to find the best combination of [m, n, d], where each of% the integer is allowed to changed from 1 to 10 independently. The best% ARX model thus found is specified by [m, n, d] = [5, 10, 2], with a% training RMSE of 0.1122 and a checking RMSE of 0.0749. The above figure% demonstrates the fitting results of the best ARX model.trn_data_n = 300;total_data_n = 600;z = [y2 u2];z = dtrend(z);ave = mean(y2);ze = z(1:trn_data_n, :);zv = z(trn_data_n+1:total_data_n, :);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -