ai_modify_new2.txt 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. clc; clear;
  2. %% ---- 压力矩阵(P_F1~P_F4)----
  3. P_F1 = [ ...
  4. 0 0 0 14 36 54 61 60 56 52 57 55 50 45 41 37 33 31 29 28;
  5. 0 0 2 27 68 91 99 89 75 65 56 55 61 62 59 55 51 53 59 59;
  6. 0 0 5 41 75 94 104 107 111 109 97 83 71 65 61 59 57 56 55 55];
  7. P_F2 = [ ...
  8. 0 0 0 51 86 129 114 95 73 69 66 81 99 97 75 60 53 47 44 46;
  9. 0 0 7 96 149 138 130 139 134 129 126 125 123 121 120 115 100 70 60 52;
  10. 0 0 19 115 150 141 136 140 135 128 127 126 123 121 120 119 118 118 117 117];
  11. P_F3 = [ ...
  12. 0 0 0 75 196 154 185 162 144 147 139 134 130 127 125 123 121 120 120 119;
  13. 0 0 10 152 184 187 173 163 142 140 137 131 130 126 125 123 123 121 121 120;
  14. 0 0 23 190 183 185 156 157 141 139 135 131 127 125 124 122 122 121 120 120];
  15. P_F4 = [ ...
  16. 0 0 0 101 226 226 183 170 156 143 141 141 137 135 131 129 126 124 123 122;
  17. 1 1 12 176 226 211 200 168 149 142 139 134 132 129 127 124 122 121 120 119;
  18. 0 0 21 226 226 194 164 152 148 146 139 136 131 129 126 125 123 122 120 120];
  19. %% ---- 流速矩阵(V_F1~V_F4)----
  20. V_F1 = [ ...
  21. 0.3 0 1.4 17.4 28.3 35.3 37.2 37.4 35.4 35.3 36.2 35.6 34 32.6 30.8 29 27.7 26.3 25.4 24.8;
  22. 0.3 0 4.0 24.5 39.2 45.9 47.8 46.0 41.7 39.0 36.1 36.1 37.8 37.7 37.3 35.4 34.8 35.0 37.1 37.3;
  23. 0.3 0 7.6 29.8 41.4 47.1 48.6 50.5 50.2 50.7 47.5 44.3 40.8 39.5 37.7 37.3 36.3 36.1 35.7 35.9];
  24. V_F2 = [ ...
  25. 0.3 0 0.5 3.1 21.8 31.7 37.7 37.8 28.8 2.7 7.8 25.4 35.1 40.2 37 33.9 32.6 31.4 30.7 31.2;
  26. 0.4 0 0.2 12.7 30.2 40.1 43.9 25.4 6.4 11.2 32.4 39.4 40.9 45.3 45.7 46.8 44.1 40.4 36.2 34.6;
  27. 0.3 0 0.1 19.6 32.2 40.8 44.1 19.1 5 10.6 19.2 32.8 41.3 45.9 45.7 47 47.5 47.4 48.1 48.1];
  28. V_F3 = [ ...
  29. 0.3 0 0.3 0.9 7.9 27.5 17.7 18.8 10.1 5.9 6.3 7.4 15.2 25 23.9 24.6 24.3 30.1 46.1 47.7;
  30. 0.3 0 0.2 1.7 23.1 25.3 17.7 13.8 9.3 3.2 9.1 9.1 12.7 15.5 24.3 24.6 33.8 45.3 46.5 47.4;
  31. 0.4 0 0.6 3.6 27.9 23.3 16.7 11.4 10 4.4 4.5 11.9 12.9 20 23.8 32.3 44.3 46 47.3 47.2];
  32. V_F4 = [ ...
  33. 0.3 0 0.9 1.8 6.3 19.6 17.6 19 16.6 10.3 6.6 9.9 11.3 13.4 18.1 21.9 26.9 24.5 24.7 26.4;
  34. 0.2 0 0.2 1.5 10.7 16.4 18.4 16.7 12.2 8.3 8.2 12.3 13.9 17.7 21.7 25.8 27 30.7 33.2 34.1;
  35. 0.3 0 0.4 3.3 15.8 16.1 16.6 17.4 11.7 5.6 8.4 9.9 12.3 16.3 18.7 22.9 27.7 23.1 22 23.5];
  36. P_lib = {P_F1, P_F2, P_F3, P_F4};
  37. V_lib = {V_F1, V_F2, V_F3, V_F4};
  38. faultNames = {'F1','F2','F3','F4'};
  39. rho = 0.5;
  40. max_window = 10;
  41. %% =========================
  42. % 1) 模板区
  43. % =========================
  44. % 最初算法模板(若你有固定Y1/Y2,直接替换这两个变量)
  45. Y1_old = build_template_from_matrix_mean(P_lib, max_window);
  46. Y2_old = build_template_from_matrix_mean(V_lib, max_window);
  47. % 改进算法模板
  48. Y1_new = build_template_from_matrix_mean(P_lib, max_window);
  49. Y2_new = build_template_from_matrix_mean(V_lib, max_window);
  50. %% =========================
  51. % 2) 模式1:保留原来自定义 P、V
  52. % =========================
  53. % 你原来自定义的 P、V 放这里:
  54. P_custom = [118 118 117 118 117 99 65 51 41 35 30 28 26 26 25 24 24 23 24 24];
  55. V_custom = [46.6 48.3 48.4 49.1 48.6 46.7 40.2 35.3 31.6 29.5 27.1 26.1 25.1 25.4 24.4 24.9 24.9 23.8 24.1 24.5];
  56. fprintf('\n==================== 模式1:自定义 P,V ====================\n');
  57. res_custom = run_dual_alg(P_custom, V_custom, Y1_old, Y2_old, Y1_new, Y2_new, rho, max_window, faultNames);
  58. print_compare_result('自定义样本', res_custom, faultNames);
  59. %% =========================
  60. % 3) 模式2:批量遍历库中每一行
  61. % =========================
  62. fprintf('\n==================== 模式2:批量样本 ====================\n');
  63. allRows = {};
  64. idxRow = 0;
  65. for f = 1:4
  66. P_mat = P_lib{f};
  67. V_mat = V_lib{f};
  68. nRow = size(P_mat,1);
  69. for r = 1:nRow
  70. idxRow = idxRow + 1;
  71. tag = sprintf('P_%s第%d行 + V_%s第%d行', faultNames{f}, r, faultNames{f}, r);
  72. res = run_dual_alg(P_mat(r,:), V_mat(r,:), Y1_old, Y2_old, Y1_new, Y2_new, rho, max_window, faultNames);
  73. print_compare_result(tag, res, faultNames);
  74. allRows{idxRow,1} = tag;
  75. allRows{idxRow,2} = faultNames{res.old_idx};
  76. allRows{idxRow,3} = res.old_conf;
  77. allRows{idxRow,4} = faultNames{res.new_idx};
  78. allRows{idxRow,5} = res.new_conf;
  79. allRows{idxRow,6} = strcmp(faultNames{res.old_idx}, faultNames{res.new_idx});
  80. allRows{idxRow,7} = abs(res.new_conf - res.old_conf);
  81. end
  82. end
  83. %% =========================
  84. % 4) 汇总对比表
  85. % =========================
  86. fprintf('\n==================== 汇总对比表 ====================\n');
  87. fprintf('%-28s %-6s %-10s %-6s %-10s %-8s %-10s\n', ...
  88. '样本', 'Old', 'OldConf', 'New', 'NewConf', '一致?', '置信度差');
  89. for i = 1:size(allRows,1)
  90. fprintf('%-28s %-6s %-10.2f %-6s %-10.2f %-8d %-10.2f\n', ...
  91. allRows{i,1}, allRows{i,2}, allRows{i,3}*100, ...
  92. allRows{i,4}, allRows{i,5}*100, allRows{i,6}, allRows{i,7}*100);
  93. end
  94. fprintf('\n完成:已同时保留"自定义样本"与"批量样本"两种输入,并输出两种算法对比结果。\n');
  95. %% ========================= 函数区 =========================
  96. function res = run_dual_alg(P, V, Y1_old, Y2_old, Y1_new, Y2_new, rho, max_window, faultNames)
  97. Y01 = calc_feature_row(P, max_window);
  98. Y02 = calc_feature_row(V, max_window);
  99. % ------- 最初算法:不归一化BPA + 原始DS -------
  100. deg1_old = grey_relation_analysis1(Y01, Y1_old, rho);
  101. deg2_old = grey_relation_analysis1(Y02, Y2_old, rho);
  102. comb_old = dempster_combine_original(deg1_old, deg2_old);
  103. vec_old = [comb_old.F1, comb_old.F2, comb_old.F3, comb_old.F4];
  104. [old_conf, old_idx] = max(vec_old);
  105. % ------- 改进算法:归一化BPA + 修正DS(intersect) -------
  106. deg1_new = grey_relation_analysis1(Y01, Y1_new, rho);
  107. deg2_new = grey_relation_analysis1(Y02, Y2_new, rho);
  108. bpa1 = deg1_new(:) / sum(deg1_new);
  109. bpa2 = deg2_new(:) / sum(deg2_new);
  110. comb_new = dempster_combine_fixed(bpa1, bpa2);
  111. vec_new = [comb_new.F1, comb_new.F2, comb_new.F3, comb_new.F4];
  112. [new_conf, new_idx] = max(vec_new);
  113. res.old_vec = vec_old; res.old_conf = old_conf; res.old_idx = old_idx;
  114. res.new_vec = vec_new; res.new_conf = new_conf; res.new_idx = new_idx;
  115. res.same = strcmp(faultNames{old_idx}, faultNames{new_idx});
  116. res.delta_conf = abs(new_conf - old_conf);
  117. end
  118. function print_compare_result(tag, res, faultNames)
  119. fprintf('\n样本: %s\n', tag);
  120. fprintf(' [最初算法] BPA=[%.4f %.4f %.4f %.4f], 诊断=%s, 置信度=%.2f%%\n', ...
  121. res.old_vec(1), res.old_vec(2), res.old_vec(3), res.old_vec(4), ...
  122. faultNames{res.old_idx}, res.old_conf*100);
  123. fprintf(' [改进算法] BPA=[%.4f %.4f %.4f %.4f], 诊断=%s, 置信度=%.2f%%\n', ...
  124. res.new_vec(1), res.new_vec(2), res.new_vec(3), res.new_vec(4), ...
  125. faultNames{res.new_idx}, res.new_conf*100);
  126. fprintf(' [对比] 是否一致=%d, 置信度差=%.2f%%\n', res.same, res.delta_conf*100);
  127. end
  128. function feat = calc_feature_row(x, max_window)
  129. x = x(:)';
  130. max_window = min(max_window, numel(x));
  131. feat = [mean(x), var(x), std(x), max(x(1:max_window)), min(x)];
  132. end
  133. function Y = build_template_from_matrix_mean(libCell, max_window)
  134. Y = zeros(4,5);
  135. for k = 1:4
  136. X = libCell{k};
  137. n = size(X,1);
  138. tmp = zeros(n,5);
  139. for i = 1:n
  140. tmp(i,:) = calc_feature_row(X(i,:), max_window);
  141. end
  142. Y(k,:) = mean(tmp,1);
  143. end
  144. end
  145. function [grey_relation_degree, order] = grey_relation_analysis1(Y0, Y, rho)
  146. if nargin < 3, rho = 0.5; end
  147. Y0 = Y0(:)';
  148. [n,m] = size(Y);
  149. if m ~= length(Y0), error('参考序列和比较序列长度必须一致'); end
  150. Y0n = Y0 / mean(Y0);
  151. Yn = Y ./ mean(Y,2);
  152. diff = abs(Yn - Y0n);
  153. dmin = min(diff(:)); dmax = max(diff(:));
  154. rel = (dmin + rho*dmax) ./ (diff + rho*dmax);
  155. grey_relation_degree = mean(rel,2);
  156. [~, order] = sort(grey_relation_degree,'descend');
  157. end
  158. function combined_bpa = dempster_combine_original(m1, m2)
  159. K = 0;
  160. for i=1:4
  161. for j=1:4
  162. if i~=j
  163. K = K + m1(i)*m2(j);
  164. end
  165. end
  166. end
  167. combined_bpa = struct();
  168. combined_bpa.F1 = (m1(1)*m2(1)) / (1-K);
  169. combined_bpa.F2 = (m1(2)*m2(2)) / (1-K);
  170. combined_bpa.F3 = (m1(3)*m2(3)) / (1-K);
  171. combined_bpa.F4 = (m1(4)*m2(4)) / (1-K);
  172. end
  173. function combined_bpa = dempster_combine_fixed(m1, m2)
  174. sets = {{'F1'},{'F2'},{'F3'},{'F4'}};
  175. K = 0;
  176. for i=1:4
  177. for j=1:4
  178. if isempty(intersect(sets{i}, sets{j}))
  179. K = K + m1(i)*m2(j);
  180. end
  181. end
  182. end
  183. vals = zeros(1,4);
  184. for k=1:4
  185. s = 0;
  186. for i=1:4
  187. for j=1:4
  188. interSet = intersect(sets{i}, sets{j});
  189. if isequal(interSet, sets{k})
  190. s = s + m1(i)*m2(j);
  191. end
  192. end
  193. end
  194. vals(k) = s/(1-K);
  195. end
  196. combined_bpa = struct('F1',vals(1),'F2',vals(2),'F3',vals(3),'F4',vals(4));
  197. end