DFS_Shuo_Chen 4 dní pred
rodič
commit
ef9449c926

+ 3 - 0
.gitignore

@@ -4,3 +4,6 @@
 油机、传感器、远程协议/油机协议/VRC36(或ECVR-FM)串口总线通讯方式/~$C36(或ECVR-FM)与VR监控后台RS485通信协议.docx
 程序设计文档/油气回收智能诊断系统/实验进油数据/~$20251015_正常.xlsx
 程序设计文档/油气回收智能诊断系统/实验进油数据/~$20251016_120ml进油.xlsx
+程序设计文档/油气回收智能诊断系统/实验进油数据/~$20251017_90ml进油.xlsx
+程序设计文档/油气回收智能诊断系统/实验进油数据/~$20251021_30ml进油.xlsx
+程序设计文档/油气回收智能诊断系统/实验进油数据/~$20251021_60ml进油.xlsx

+ 28 - 38
油机、传感器、远程协议/油机协议/VRC36(或ECVR-FM)串口总线通讯方式/VRC36(或ECVR-FM)与VR监控后台RS485通信协议.docx

@@ -47,6 +47,10 @@ V1.0.8
 陈硕
 2026.3.26
 交易数据增加泵运行时间
+V1.0.9
+陈硕
+2026.3.26
+实时数据增加ttc、实时时间;增加实时数据的间隔说明(4.3.1)
 
 一、 后台监控数据内容:
 a)  枪号、枪状态、油品、提枪时间、挂枪时间;
@@ -88,6 +92,10 @@ BCD
 BCD
 7 Byte
 
+实时数据时间
+BCD
+7 Byte
+实时数据的实际时间
 油体积
 HEX
 3 Byte
@@ -136,6 +144,10 @@ HEX
 HEX
 2Byte
 单位:秒
+交易序列号(ttc)
+HEX
+4Byte
+实时数据、交易数据使用
 
 四、 通信协议:
 4.1 数据包格式
@@ -176,7 +188,7 @@ BCD
  CRC校验
   从目标地址到到数据域计算CRC值
 4.2 命令字
-4.2.1 长心跳命令
+4.2.1 长心跳命令(当前使用)
 命令字:0x6
 功能: 同步VRC36的系统时间与监控后台的系统时间,锁枪/解锁枪,每?分钟发送一次。
 后台发送(len: 24, 长度字段之后):
@@ -193,11 +205,11 @@ VRC应答:(len: 24, 长度字段之后)
 后台发送(len: 1, 长度字段之后):
 0x60 
 
-VRC应答:
+4.2.3 VRC应答:
  VRC处于空闲状态,返回命令字,
    0x60(len: 1, 长度字段之后)
  加油点处于非空闲状态,返回非空闲状态加油点的状态,可能一次回复多条状态消息。
-   状态消息定义:
+4.2.3状态消息定义:
 状态字
 长度
 数据内容
@@ -209,7 +221,7 @@ VRC应答:
 0x2
 23
 0x2 + 加油点(1)+ 枪(1) + 油量(3)+ 气量(3)+ 气流速(2) + 气液比(2) + 气压力(2)+气体流量计错误个数(2)+油流速(2)
-+PWM(2)+电流值(2)
++PWM(2)+电流值(2)+ttc(4)+实时数据时间(7)
 实时加油
 0x3
 10
@@ -306,21 +318,21 @@ ADC测量到的通道与预期的不同
 147
 在VCC启动时压力传感器B侧自检期间,在测量一个ADC通道的某些电流时发现问题
    
-4.2.3 确认交易命令
+4.2.4 确认交易命令
 命令字:0x7
 功能: 监控后台确认交易已收到
 后台发送(len:9, 长度字段之后):
 0x7 + 枪(1) + 交易序列号(4)+ 加油点(1byte)+ 调整值(2)
 VRC不需要应答。储存调整值到对应交易中,回叫交易里时带该字段
 
-4.2.4 读取配置数据
+4.2.5 读取配置数据
 命令字:0x21
 功能: 获取VRC的配置数据,在配置工具中实现
 后台发送(len:n, 长度字段之后):
 0x21 + 数据个数(2byte)+ data_id_1(2byte) + ... + data_id_n(2byte)
 VRC应答(len: n, 长度字段之后):
 0x21 + 数据个数(2byte)+ data_id_1(2byte)+ data_id_1_len(1byte)+ data1(data_id_1_len byte) + ... + data_id_n(2byte)+ data_id_n_len(1byte)+ datan(data_id_n_len byte)
-4.2.5 写入配置数据
+4.2.6 写入配置数据
 命令字:0x22
 功能: 更新VRC的配置数据,在配置工具中实现
 后台发送(len: n, 长度字段之后):
@@ -411,7 +423,7 @@ Bin
 1Byte
 0-不恢复出厂设置,1-恢复出厂设置
 
-4.2.6 读日志信息
+4.2.7 读日志信息
 命令字:0x31
 功能: 从VRC中读取日志信息,在配置工具中实现
 后台发送(len:3, 长度字段之后):
@@ -427,7 +439,7 @@ VRC应答(len: n, 长度字段之后):
 3:非空闲状态
 注: 每次发送1条记录,连续发送直到发送完毕。
 
-4.2.7 读交易信息
+4.2.8 读交易信息
 命令字:0x32
 功能: 从VRC中读取交易记录,在配置工具中实现
 后台发送(len:4, 长度字段之后):
@@ -444,40 +456,18 @@ VRC应答(len: n, 长度字段之后):
 4:加油点超出范围
 注:每次发送1条记录,连续发送直到发送完毕。
 
-4.3 心跳命令(获取状态命令)消息交互过程描述
+4.3 心跳命令消息交互过程描述
 4.3.1 返回枪状态
-例如: VRC有4个加油点,其中加油点1在提枪状态,加油点2正在加油,加油点3在挂枪状态,加油点4在空闲状态。VRC收到心跳命令后,检查各加油点状态,将加油点1、2、3的状态分三条消息(每条消息都包含包头与CRC校验)依次发送给后台,最后一条消息的帧号bit7为置为1,本次消息交互结束。
+例如: VRC有4个加油点,其中加油点1在提枪状态,加油点2正在加油,加油点3在挂枪状态,加油点4在空闲状态。VRC收到心跳命令后,检查各加油点状态,将加油点1、2、3的状态分三条消息(每条消息都包含包头与CRC校验)依次发送给后台,最后一条消息的帧号bit7为置为1,本次消息交互结束。
 
 4.3.2 返回枪状态与交易数据
-例如:加油点1在提枪状态,加油点3加油结束,有新交易未上传,加油点2、4在空闲态。VRC收到心跳命令后,检查各加油点状态,将加油点1、3的状态分二条消息发送给后台。监控后台接收到加油点3的交易数据后,发送交易确认命令给VRC,本次消息交互结束,加油点3转为空闲状态。在下一次接收到心跳命令后,只返回加油点1的提枪状态。
+例如:加油点1在提枪状态,加油点3加油结束,有新交易未上传,加油点2、4在空闲态。VRC收到心跳命令后,检查各加油点状态,将加油点1、3的状态分二条消息发送给后台。监控后台接收到加油点3的交易数据后,发送交易确认命令给VRC,本次消息交互结束,加油点3转为空闲状态。在下一次接收到心跳命令后,只返回加油点1的提枪状态。
 
 如果VRC没有收到来自后台的交易确认命令,在下一次的短心跳命令将再次上传交易数据。每个加油点有2个交易缓存。如果有新的交易开始,上一次的交易还没有上传成功,上次的交易还可以继续上传。若超过两条未上传的交易,最早的交易被覆盖。
-   
-   
-12 (回叫一笔交易)
-后台下发:(len: 6, 长度字段之后)
-长度(2Byte)+ 命令字 + 加油点(1byte)+交易序列号(4byte)
-010100010100060c0100000001
-油机应答: (length: 7+0/33)
-长度(2Byte)+ 命令字 + 加油点(1byte)+交易序列号(4byte)+ 结果(1byte)+回叫交易(与交易数据有区别,详见前面)
-结果:0-成功,返回交易数据;1-失败,没有交易数据
-
-13(回叫一天的交易)
-后台下发:(len: 7, 长度字段之后,请求回叫一天的交易)
-长度(2Byte)+ 命令字 +  0x1 + 加油点(1byte)+日期(4byte)
-010100010100070d010120210331
-
-油机应答: (length: 8 + n *33)
-长度(2Byte)+ 命令字 +  0x2 + 加油点(1byte)+ 日期(4byte) +传输状态(1byte)+ 传输交易序笔数(1byte)+ 回叫交易(与交易数据有区别,详见前面)
-0101000101xxxx0d020120210331010a...
-传输状态:0-失败,没有交易数据,1-首次传输,2-传输中,3-最后一次传输
-传输交易笔数:默认每次传输10笔,最后一次传输根据实际情况
-
-后台应答:(length: 8, 长度字段之后,确认接收回叫交易)
-长度(2Byte)+ 命令字 + 0x2 + 加油点(1byte)+ 日期(4byte) +结果
-010100010100070d02012021033100
-结果:0-成功,返回交易数据;1-失败,没有交易数据
 
+   
 
-                          Engineering Department, Tokheim
+4.3.1 实时数据采集要求
+在加油过程中,主板按照固定间隔(待定,如3秒)采集与缓存实时数据,然后再收到心跳命令后一次性发送给后台。
+                        Engineering Department, Tokheim
                         Engineering Department, Tokheim

BIN
油机、传感器、远程协议/远程协议/a-开发需求表/油气回收在线监控数据上传对接开发需求表 V1.9.3().xlsx


+ 7 - 43
程序设计文档/油气回收智能诊断系统/matlab模型代码分析与疑问.docx

@@ -1,46 +1,10 @@
-% V、P分别代表回气流速和回气压力前20个采样点信号数据
-问题:20个采样点是最近20笔交易每笔交易采样一个点还是最近20个加油过程数据
+问题一、历史数据使用多少笔,矩阵是固定的还是可变的
+答复:10笔,可变
+问题二、计算的结果为负数;用ai建议调整后能对应,但置信度百分之三十几
+答复:提供测试数据给桑博优化代码
+问题三、目前采样点都使用前20个,如果实际油站的采样点不同,结果是否会有影响(是否要求实时数据采样时间间隔一致)
+答复:数据采样使用同样的时间间隔
+其它:目前的数据样本是在实验室用固定油速得出的,后面需要采集实际的各种进油程度的数据来做样本(代码需要增加样本采集功能)
 
-% 4. 最大值 (Maximum)
-max_value_v = max(V (1:10));
-c = max(P (1:10));
-% 5. 最小值 (Minimum)
-min_value_v = min(V );
-min_value_p = min(P );
-问题:最大值计算这里确定使用的是前10个元素,而最小值使用所有元素
 
-Y01 = [mean_value_p, variance_value_p,std_value_p,max_value_v,min_value_v]; %压力传感
-Y02 = [mean_value_v, variance_value_v,std_value_v,max_value_v,min_value_p]; %流速传感
-问题:Y02里面用的也是max_value_v
-
-% 定义比较序列(不同故障数据,每行为一种故障)压力传感
-Y1 = [ 36.5250, 365.1199, 19.1081,1,1;    % 正常1   此处的数值就需要历史加油过程中单笔交易中回气流速和回气压力前20个采样点信号数据,也是求5个特征值
-    17.95, 248.8711,15.775,1,1;    % 轻微泄露2
-     23.3900,338.2757, 18.3923,1,1;    % 一般泄露3
-     12.5850, 130.3287, 11.4162,1,1];   % 严重泄露4
- % 定义比较序列(不同故障数据,每行为一种故障)流速传感
-Y2 = [ 36.5250, 365.1199, 19.1081,1,1;    % 正常1
-    17.95, 248.8711,15.775,1,1;    % 轻微泄露2
-     23.3900,338.2757, 18.3923,1,1;    % 一般泄露3
-     12.5850, 130.3287, 11.4162,1,1];   % 严重泄露4
-这里的数据来源是什么,根据历史数据统计的?是否要加入新的统计值?统计的是所有数据还是有问题的数据
-
-
-压力传感器 BPA:
-    0.6740
-    0.6645
-    0.6574
-    0.6934
-流速传感器 BPA:
-    0.6740
-    0.6645
-    0.6574
-    0.6934
-融合后BPA:
-    F1: -0.1027
-    F2: -0.0998
-    F3: -0.0977
-    F4: -0.1087
-最终诊断结果:F3故障(置信度-9.77%)
-上面的输出结果代表了这个模型只负责输出泄漏方面的诊断结果?
 

+ 223 - 0
程序设计文档/油气回收智能诊断系统/实验进油数据/ai_modify1.txt

@@ -0,0 +1,223 @@
+clc; clear; close all;
+
+%% =========================
+% 1) 实时数据(待诊断样本)
+% ==========================
+P = [1 1 12 176 226 211 200 168 149 142 139 134 132 129 127 124 122 121 120 119]; % 压力实时
+V = [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]; % 流速实时
+
+max_window = 10;   % max特征使用前10个点
+rho = 0.5;         % 灰色关联分辨系数
+
+Y01 = calc_feature_row(P, max_window); % 实时压力特征 1x5
+Y02 = calc_feature_row(V, max_window); % 实时流速特征 1x5
+
+%% ============================================
+% 2) 模拟历史矩阵(每种故障一个矩阵,行=样本,列=20点)
+%    你后续把这些矩阵替换成真实数据即可
+% =============================================
+
+
+
+
+% ---- 压力矩阵(P_F1~P_F4)----
+P_F1 = [ ...
+    0 0 0 14 36 54 61 60 56 52 57 55 50 45 41 37 33 31 29 28;
+    0 0 2 27 68 91 99 89 75 65 56 55 61 62 59 55 51 53 59 59;
+    0 0 5 41 75 94 104 107 111 109 97 83 71 65 61 59 57 56 55 55];
+
+P_F2 = [ ...
+    0 0 0 51 86 129 114 95 73 69 66 81 99 97 75 60 53 47 44 46;
+    0 0 7 96 149 138 130 139 134 129 126 125 123 121 120 115 100 70 60 52;
+    0 0 19 115 150 141 136 140 135 128 127 126 123 121 120 119 118 118 117 117];
+
+P_F3 = [ ...
+    0 0 0 75 196 154 185 162 144 147 139 134 130 127 125 123 121 120 120 119;
+    0 0 10 152 184 187 173 163 142 140 137 131 130 126 125 123 123 121 121 120;
+    0 0 23 190 183 185 156 157 141 139 135 131 127 125 124 122 122 121 120 120];
+
+P_F4 = [ ...
+    0 0 0 101 226 226 183 170 156 143 141 141 137 135 131 129 126 124 123 122;
+    1 1 12 176 226 211 200 168 149 142 139 134 132 129 127 124 122 121 120 119;
+    0 0 21 226 226 194 164 152 148 146 139 136 131 129 126 125 123 122 120 120];
+
+% ---- 流速矩阵(V_F1~V_F4)----
+V_F1 = [ ...
+    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;
+    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;
+    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];
+
+V_F2 = [ ...
+    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;
+    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;
+    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];
+
+V_F3 = [ ...
+    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;
+    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;
+    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];
+
+V_F4 = [ ...
+    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;
+    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;
+    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];
+	
+
+%% ==================================================
+% 3) 自动由矩阵生成 F1/F2/F3/F4 的特征模板(每类1行)
+%    mode:
+%      "mean_of_rows" = 每行先提特征,再对行取均值(推荐)
+%      "first_row"    = 仅第一行
+%      "all_rows"     = 返回每行特征(可做多模板)
+% ===================================================
+mode = "mean_of_rows";
+
+Y1_F1 = calc_feature_from_matrix(P_F1, max_window, mode);
+Y1_F2 = calc_feature_from_matrix(P_F2, max_window, mode);
+Y1_F3 = calc_feature_from_matrix(P_F3, max_window, mode);
+Y1_F4 = calc_feature_from_matrix(P_F4, max_window, mode);
+
+Y2_F1 = calc_feature_from_matrix(V_F1, max_window, mode);
+Y2_F2 = calc_feature_from_matrix(V_F2, max_window, mode);
+Y2_F3 = calc_feature_from_matrix(V_F3, max_window, mode);
+Y2_F4 = calc_feature_from_matrix(V_F4, max_window, mode);
+
+% 比较序列:每行对应 F1~F4
+Y1 = [Y1_F1; Y1_F2; Y1_F3; Y1_F4];  % 压力模板
+Y2 = [Y2_F1; Y2_F2; Y2_F3; Y2_F4];  % 流速模板
+
+%% ===========================
+% 4) 灰色关联分析(各传感器)
+% ============================
+[degree_1, order1] = grey_relation_analysis1(Y01, Y1, rho); % 压力关联度 4x1
+[degree_2, order2] = grey_relation_analysis1(Y02, Y2, rho); % 流速关联度 4x1
+
+% 归一化为 BPA(和为1)
+bpa1 = degree_1 / sum(degree_1);
+bpa2 = degree_2 / sum(degree_2);
+
+disp('压力传感器 BPA:'); disp(bpa1');
+disp('流速传感器 BPA:'); disp(bpa2');
+
+%% ===========================
+% 5) DS 证据融合 + 决策
+% ============================
+combined = dempster_combine_vec(bpa1, bpa2);
+
+faults = {'F1','F2','F3','F4'};
+disp('融合后BPA:');
+for i = 1:4
+    fprintf('%s: %.6f\n', faults{i}, combined(i));
+end
+
+[conf, idx] = max(combined);
+fprintf('\n最终诊断结果:%s故障(置信度 %.2f%%)\n', faults{idx}, conf*100);
+
+%% ===========================
+% 函数区
+% ============================
+
+function feat = calc_feature_row(x, max_window)
+% 单行信号 -> 5维特征 [mean, var, std, max(first max_window), min]
+    x = x(:)'; 
+    if nargin < 2 || isempty(max_window)
+        max_window = numel(x);
+    end
+    max_window = min(max_window, numel(x));
+
+    feat_mean = mean(x);
+    feat_var  = var(x);
+    feat_std  = std(x);
+    feat_max  = max(x(1:max_window));
+    feat_min  = min(x);
+
+    feat = [feat_mean, feat_var, feat_std, feat_max, feat_min];
+end
+
+function feat_out = calc_feature_from_matrix(X, max_window, mode)
+% 矩阵(行样本) -> 特征
+% mode:
+%   "all_rows"     -> Mx5
+%   "first_row"    -> 1x5
+%   "mean_of_rows" -> 1x5
+    if nargin < 3 || isempty(mode)
+        mode = "mean_of_rows";
+    end
+
+    [m, ~] = size(X);
+    feats = zeros(m, 5);
+
+    for i = 1:m
+        feats(i, :) = calc_feature_row(X(i, :), max_window);
+    end
+
+    switch mode
+        case "all_rows"
+            feat_out = feats;
+        case "first_row"
+            feat_out = feats(1, :);
+        case "mean_of_rows"
+            feat_out = mean(feats, 1);
+        otherwise
+            error('mode 必须是 "mean_of_rows"、"first_row" 或 "all_rows"');
+    end
+end
+
+function [grey_relation_degree, order] = grey_relation_analysis1(Y0, Y, rho)
+% 灰色关联分析
+% Y0: 1xM 参考序列;Y: NxM 比较序列
+    if nargin < 3
+        rho = 0.5;
+    end
+
+    Y0 = Y0(:)';           
+    [n, m] = size(Y);
+    if length(Y0) ~= m
+        error('参考序列和比较序列长度必须一致');
+    end
+
+    % 均值化
+    Y0n = Y0 / mean(Y0);
+    Yn  = Y ./ mean(Y, 2);
+
+    diff = abs(Yn - Y0n);  
+    dmin = min(diff(:));
+    dmax = max(diff(:));
+
+    rel = (dmin + rho*dmax) ./ (diff + rho*dmax);
+    grey_relation_degree = mean(rel, 2);
+
+    [~, order] = sort(grey_relation_degree, 'descend');
+end
+
+function combined = dempster_combine_vec(m1, m2)
+% 仅单元素焦元 {F1},{F2},{F3},{F4} 的DS组合(向量版)
+% m1,m2: 4x1 且和为1
+    m1 = m1(:); m2 = m2(:);
+    if length(m1) ~= 4 || length(m2) ~= 4
+        error('m1,m2长度必须为4');
+    end
+
+    % 冲突系数 K = sum_{i!=j} m1(i)*m2(j)
+    K = 0;
+    for i = 1:4
+        for j = 1:4
+            if i ~= j
+                K = K + m1(i)*m2(j);
+            end
+        end
+    end
+
+    if abs(1-K) < 1e-12
+        error('冲突系数K过大,1-K接近0,无法组合');
+    end
+
+    % 单元素情况下:m(Fk)=m1(Fk)*m2(Fk)/(1-K)
+    combined = zeros(4,1);
+    for k = 1:4
+        combined(k) = (m1(k)*m2(k)) / (1-K);
+    end
+
+    % 数值归一化(防止浮点误差)
+    combined = combined / sum(combined);
+end

+ 191 - 0
程序设计文档/油气回收智能诊断系统/实验进油数据/ai_modify_depend_origin.txt

@@ -0,0 +1,191 @@
+clc; clear;
+
+% V、P分别代表回气流速和回气压力前20个采样点信号数据
+P = [0 0 0 14 36 54 61 60 56 52 57 55 50 45 41 37 33 31 29 28]; % 压力信号
+V = [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]; % 流速信号
+
+%% 实时工况特征
+mean_value_v = mean(V);
+mean_value_p = mean(P);
+
+variance_value_v = var(V);
+variance_value_p = var(P);
+
+std_value_v = std(V);
+std_value_p = std(P);
+
+max_value_v = max(V(1:10));
+max_value_p = max(P(1:10));
+
+min_value_v = min(V);
+min_value_p = min(P);
+
+Y01 = [mean_value_p, variance_value_p, std_value_p, max_value_p, min_value_p]; % 压力传感
+Y02 = [mean_value_v, variance_value_v, std_value_v, max_value_v, min_value_v]; % 流速传感
+
+%% ---- 压力矩阵(P_F1~P_F4)----
+P_F1 = [ ...
+    0 0 0 14 36 54 61 60 56 52 57 55 50 45 41 37 33 31 29 28;
+    0 0 2 27 68 91 99 89 75 65 56 55 61 62 59 55 51 53 59 59;
+    0 0 5 41 75 94 104 107 111 109 97 83 71 65 61 59 57 56 55 55];
+
+P_F2 = [ ...
+    0 0 0 51 86 129 114 95 73 69 66 81 99 97 75 60 53 47 44 46;
+    0 0 7 96 149 138 130 139 134 129 126 125 123 121 120 115 100 70 60 52;
+    0 0 19 115 150 141 136 140 135 128 127 126 123 121 120 119 118 118 117 117];
+
+P_F3 = [ ...
+    0 0 0 75 196 154 185 162 144 147 139 134 130 127 125 123 121 120 120 119;
+    0 0 10 152 184 187 173 163 142 140 137 131 130 126 125 123 123 121 121 120;
+    0 0 23 190 183 185 156 157 141 139 135 131 127 125 124 122 122 121 120 120];
+
+P_F4 = [ ...
+    0 0 0 101 226 226 183 170 156 143 141 141 137 135 131 129 126 124 123 122;
+    1 1 12 176 226 211 200 168 149 142 139 134 132 129 127 124 122 121 120 119;
+    0 0 21 226 226 194 164 152 148 146 139 136 131 129 126 125 123 122 120 120];
+
+%% ---- 流速矩阵(V_F1~V_F4)----
+V_F1 = [ ...
+    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;
+    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;
+    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];
+
+V_F2 = [ ...
+    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;
+    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;
+    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];
+
+V_F3 = [ ...
+    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;
+    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;
+    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];
+
+V_F4 = [ ...
+    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;
+    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;
+    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];
+
+%% 用独立函数构造Y1/Y2(每行对应F1~F4)
+Y1 = [ ...
+    calc_fault_row(P_F1);
+    calc_fault_row(P_F2);
+    calc_fault_row(P_F3);
+    calc_fault_row(P_F4)]
+
+Y2 = [ ...
+    calc_fault_row(V_F1);
+    calc_fault_row(V_F2);
+    calc_fault_row(V_F3);
+    calc_fault_row(V_F4)]
+
+% 设置分辨系数
+rho = 0.5;
+
+% 执行灰色关联分析(不改)
+[degree_1, order] = grey_relation_analysis1(Y01, Y1, rho); % 压力传感
+[degree_2, order] = grey_relation_analysis1(Y02, Y2, rho); % 流速传感
+
+%% 证据理论(Dempster-Shafer Theory)故障诊断(不改)
+bpa1 = degree_1; % 压力传感
+bpa2 = degree_2; % 流速传感
+
+disp('压力传感器 BPA:');
+disp(bpa1);
+disp('流速传感器 BPA:');
+disp(bpa2);
+
+combined = dempster_combine(bpa1, bpa2);
+
+disp('融合后BPA:');
+disp(combined);
+
+[~, idx] = max([combined.F1, combined.F2, combined.F3, combined.F4]);
+faults = {'F1', 'F2', 'F3', 'F4'};
+fprintf('\n最终诊断结果:%s故障(置信度%.2f%%)\n', faults{idx}, 100*(combined.(faults{idx})));
+
+%% ================= 新增独立函数 =================
+function row_feature = calc_fault_row(X)
+% 输入: X为某一故障的历史矩阵(多行样本)
+% 输出: 该故障的一行特征 [mean,var,std,max(前10),min]
+% 规则: 先算每一行5特征,再对各行取均值,得到1x5
+
+[n, ~] = size(X);
+feat = zeros(n, 5);
+
+for i = 1:n
+    feat(i, 1) = mean(X(i, :));
+    feat(i, 2) = var(X(i, :));
+    feat(i, 3) = std(X(i, :));
+    feat(i, 4) = max(X(i, 1:10));
+    feat(i, 5) = min(X(i, :));
+end
+
+row_feature = mean(feat, 1);
+end
+
+%% ================= 原灰色关联函数(保持不变) =================
+function [grey_relation_degree, order] = grey_relation_analysis1(Y0, Y, rho)
+if nargin < 3
+    rho = 0.5;
+end
+
+Y0 = Y0(:)';
+[n, m] = size(Y);
+m0 = length(Y0);
+
+if m ~= m0
+    error('参考序列和比较序列的长度必须一致');
+end
+
+Y0_mean = mean(Y0);
+Y0_normalized = Y0 / Y0_mean;
+
+Y_mean = mean(Y, 2);
+Y_normalized = Y ./ Y_mean;
+
+diff = abs(Y0_normalized - Y_normalized);
+
+delta_min = min(diff(:));
+delta_max = max(diff(:));
+
+relations = (delta_min + rho * delta_max) ./ (diff + rho * delta_max);
+
+grey_relation_degree = mean(relations, 2);
+
+[~, order] = sort(grey_relation_degree, 'descend');
+end
+
+%% ================= 原DS融合函数(保持不变) =================
+function combined_bpa = dempster_combine(bpa1, bpa2)
+sets = {{'F1'}, {'F2'}, {'F3'}, {'F4'}};
+
+K = 0;
+for i = 1:length(sets)
+    for j = 1:length(sets)
+        if isempty(intersect(sets{i}, sets{j}))
+            K = K + bpa1(i) * bpa2(j);
+        end
+    end
+end
+
+combined_bpa = struct();
+for k = 1:length(sets)
+    sum_val = 0;
+    for i = 1:length(sets)
+        for j = 1:length(sets)
+            if isequal(union(sets{i}, sets{j}), sets{k})
+                sum_val = sum_val + bpa1(i) * bpa2(j);
+            end
+        end
+    end
+    combined_bpa.(strjoin(sets{k}, '')) = sum_val / (1 - K);
+end
+end
+
+function val = get_value(bpa, set)
+if length(set) == 1
+    val = bpa.(set{1});
+else
+    val = bpa.Theta;
+end
+end

+ 233 - 0
程序设计文档/油气回收智能诊断系统/实验进油数据/ai_modify_new2.txt

@@ -0,0 +1,233 @@
+clc; clear;
+
+%% ---- 压力矩阵(P_F1~P_F4)----
+P_F1 = [ ...
+    0 0 0 14 36 54 61 60 56 52 57 55 50 45 41 37 33 31 29 28;
+    0 0 2 27 68 91 99 89 75 65 56 55 61 62 59 55 51 53 59 59;
+    0 0 5 41 75 94 104 107 111 109 97 83 71 65 61 59 57 56 55 55];
+
+P_F2 = [ ...
+    0 0 0 51 86 129 114 95 73 69 66 81 99 97 75 60 53 47 44 46;
+    0 0 7 96 149 138 130 139 134 129 126 125 123 121 120 115 100 70 60 52;
+    0 0 19 115 150 141 136 140 135 128 127 126 123 121 120 119 118 118 117 117];
+
+P_F3 = [ ...
+    0 0 0 75 196 154 185 162 144 147 139 134 130 127 125 123 121 120 120 119;
+    0 0 10 152 184 187 173 163 142 140 137 131 130 126 125 123 123 121 121 120;
+    0 0 23 190 183 185 156 157 141 139 135 131 127 125 124 122 122 121 120 120];
+
+P_F4 = [ ...
+    0 0 0 101 226 226 183 170 156 143 141 141 137 135 131 129 126 124 123 122;
+    1 1 12 176 226 211 200 168 149 142 139 134 132 129 127 124 122 121 120 119;
+    0 0 21 226 226 194 164 152 148 146 139 136 131 129 126 125 123 122 120 120];
+
+%% ---- 流速矩阵(V_F1~V_F4)----
+V_F1 = [ ...
+    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;
+    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;
+    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];
+
+V_F2 = [ ...
+    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;
+    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;
+    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];
+
+V_F3 = [ ...
+    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;
+    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;
+    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];
+
+V_F4 = [ ...
+    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;
+    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;
+    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];
+
+P_lib = {P_F1, P_F2, P_F3, P_F4};
+V_lib = {V_F1, V_F2, V_F3, V_F4};
+faultNames = {'F1','F2','F3','F4'};
+
+rho = 0.5;
+max_window = 10;
+
+%% =========================
+% 1) 模板区
+% =========================
+% 最初算法模板(若你有固定Y1/Y2,直接替换这两个变量)
+Y1_old = build_template_from_matrix_mean(P_lib, max_window);
+Y2_old = build_template_from_matrix_mean(V_lib, max_window);
+
+% 改进算法模板
+Y1_new = build_template_from_matrix_mean(P_lib, max_window);
+Y2_new = build_template_from_matrix_mean(V_lib, max_window);
+
+%% =========================
+% 2) 模式1:保留原来自定义 P、V
+% =========================
+% 你原来自定义的 P、V 放这里:
+P_custom = [118 118 117 118 117 99 65 51 41 35 30 28 26 26 25 24 24 23 24 24];
+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];
+
+fprintf('\n==================== 模式1:自定义 P,V ====================\n');
+res_custom = run_dual_alg(P_custom, V_custom, Y1_old, Y2_old, Y1_new, Y2_new, rho, max_window, faultNames);
+print_compare_result('自定义样本', res_custom, faultNames);
+
+%% =========================
+% 3) 模式2:批量遍历库中每一行
+% =========================
+fprintf('\n==================== 模式2:批量样本 ====================\n');
+
+allRows = {};
+idxRow = 0;
+
+for f = 1:4
+    P_mat = P_lib{f};
+    V_mat = V_lib{f};
+    nRow = size(P_mat,1);
+
+    for r = 1:nRow
+        idxRow = idxRow + 1;
+        tag = sprintf('P_%s第%d行 + V_%s第%d行', faultNames{f}, r, faultNames{f}, r);
+
+        res = run_dual_alg(P_mat(r,:), V_mat(r,:), Y1_old, Y2_old, Y1_new, Y2_new, rho, max_window, faultNames);
+        print_compare_result(tag, res, faultNames);
+
+        allRows{idxRow,1} = tag;
+        allRows{idxRow,2} = faultNames{res.old_idx};
+        allRows{idxRow,3} = res.old_conf;
+        allRows{idxRow,4} = faultNames{res.new_idx};
+        allRows{idxRow,5} = res.new_conf;
+        allRows{idxRow,6} = strcmp(faultNames{res.old_idx}, faultNames{res.new_idx});
+        allRows{idxRow,7} = abs(res.new_conf - res.old_conf);
+    end
+end
+
+%% =========================
+% 4) 汇总对比表
+% =========================
+fprintf('\n==================== 汇总对比表 ====================\n');
+fprintf('%-28s %-6s %-10s %-6s %-10s %-8s %-10s\n', ...
+    '样本', 'Old', 'OldConf', 'New', 'NewConf', '一致?', '置信度差');
+for i = 1:size(allRows,1)
+    fprintf('%-28s %-6s %-10.2f %-6s %-10.2f %-8d %-10.2f\n', ...
+        allRows{i,1}, allRows{i,2}, allRows{i,3}*100, ...
+        allRows{i,4}, allRows{i,5}*100, allRows{i,6}, allRows{i,7}*100);
+end
+
+fprintf('\n完成:已同时保留"自定义样本"与"批量样本"两种输入,并输出两种算法对比结果。\n');
+
+%% ========================= 函数区 =========================
+
+function res = run_dual_alg(P, V, Y1_old, Y2_old, Y1_new, Y2_new, rho, max_window, faultNames)
+Y01 = calc_feature_row(P, max_window);
+Y02 = calc_feature_row(V, max_window);
+
+% ------- 最初算法:不归一化BPA + 原始DS -------
+deg1_old = grey_relation_analysis1(Y01, Y1_old, rho);
+deg2_old = grey_relation_analysis1(Y02, Y2_old, rho);
+
+comb_old = dempster_combine_original(deg1_old, deg2_old);
+vec_old = [comb_old.F1, comb_old.F2, comb_old.F3, comb_old.F4];
+[old_conf, old_idx] = max(vec_old);
+
+% ------- 改进算法:归一化BPA + 修正DS(intersect) -------
+deg1_new = grey_relation_analysis1(Y01, Y1_new, rho);
+deg2_new = grey_relation_analysis1(Y02, Y2_new, rho);
+
+bpa1 = deg1_new(:) / sum(deg1_new);
+bpa2 = deg2_new(:) / sum(deg2_new);
+
+comb_new = dempster_combine_fixed(bpa1, bpa2);
+vec_new = [comb_new.F1, comb_new.F2, comb_new.F3, comb_new.F4];
+[new_conf, new_idx] = max(vec_new);
+
+res.old_vec = vec_old; res.old_conf = old_conf; res.old_idx = old_idx;
+res.new_vec = vec_new; res.new_conf = new_conf; res.new_idx = new_idx;
+res.same = strcmp(faultNames{old_idx}, faultNames{new_idx});
+res.delta_conf = abs(new_conf - old_conf);
+end
+
+function print_compare_result(tag, res, faultNames)
+fprintf('\n样本: %s\n', tag);
+fprintf('  [最初算法] BPA=[%.4f %.4f %.4f %.4f], 诊断=%s, 置信度=%.2f%%\n', ...
+    res.old_vec(1), res.old_vec(2), res.old_vec(3), res.old_vec(4), ...
+    faultNames{res.old_idx}, res.old_conf*100);
+fprintf('  [改进算法] BPA=[%.4f %.4f %.4f %.4f], 诊断=%s, 置信度=%.2f%%\n', ...
+    res.new_vec(1), res.new_vec(2), res.new_vec(3), res.new_vec(4), ...
+    faultNames{res.new_idx}, res.new_conf*100);
+fprintf('  [对比] 是否一致=%d, 置信度差=%.2f%%\n', res.same, res.delta_conf*100);
+end
+
+function feat = calc_feature_row(x, max_window)
+x = x(:)';
+max_window = min(max_window, numel(x));
+feat = [mean(x), var(x), std(x), max(x(1:max_window)), min(x)];
+end
+
+function Y = build_template_from_matrix_mean(libCell, max_window)
+Y = zeros(4,5);
+for k = 1:4
+    X = libCell{k};
+    n = size(X,1);
+    tmp = zeros(n,5);
+    for i = 1:n
+        tmp(i,:) = calc_feature_row(X(i,:), max_window);
+    end
+    Y(k,:) = mean(tmp,1);
+end
+end
+
+function [grey_relation_degree, order] = grey_relation_analysis1(Y0, Y, rho)
+if nargin < 3, rho = 0.5; end
+Y0 = Y0(:)';
+[n,m] = size(Y);
+if m ~= length(Y0), error('参考序列和比较序列长度必须一致'); end
+Y0n = Y0 / mean(Y0);
+Yn  = Y ./ mean(Y,2);
+diff = abs(Yn - Y0n);
+dmin = min(diff(:)); dmax = max(diff(:));
+rel = (dmin + rho*dmax) ./ (diff + rho*dmax);
+grey_relation_degree = mean(rel,2);
+[~, order] = sort(grey_relation_degree,'descend');
+end
+
+function combined_bpa = dempster_combine_original(m1, m2)
+K = 0;
+for i=1:4
+    for j=1:4
+        if i~=j
+            K = K + m1(i)*m2(j);
+        end
+    end
+end
+combined_bpa = struct();
+combined_bpa.F1 = (m1(1)*m2(1)) / (1-K);
+combined_bpa.F2 = (m1(2)*m2(2)) / (1-K);
+combined_bpa.F3 = (m1(3)*m2(3)) / (1-K);
+combined_bpa.F4 = (m1(4)*m2(4)) / (1-K);
+end
+
+function combined_bpa = dempster_combine_fixed(m1, m2)
+sets = {{'F1'},{'F2'},{'F3'},{'F4'}};
+K = 0;
+for i=1:4
+    for j=1:4
+        if isempty(intersect(sets{i}, sets{j}))
+            K = K + m1(i)*m2(j);
+        end
+    end
+end
+vals = zeros(1,4);
+for k=1:4
+    s = 0;
+    for i=1:4
+        for j=1:4
+            interSet = intersect(sets{i}, sets{j});
+            if isequal(interSet, sets{k})
+                s = s + m1(i)*m2(j);
+            end
+        end
+    end
+    vals(k) = s/(1-K);
+end
+combined_bpa = struct('F1',vals(1),'F2',vals(2),'F3',vals(3),'F4',vals(4));
+end

+ 228 - 0
程序设计文档/油气回收智能诊断系统/实验进油数据/tmp.txt

@@ -0,0 +1,228 @@
+clear; clc; close all;
+
+% V、P分别代表回气流速和回气压力前20个采样点信号数据
+P = [0     0     0    14    36    54    61    60    56    52    57    55    50    45    41    37    33    31    29    28]; % 压力信号
+V = [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];% 流速信号
+%% 特征值
+% 1. 平均值 (Mean)
+mean_value_v = mean(V );
+mean_value_p = mean(P);
+% 2. 方差 (Variance)
+variance_value_v = var(V );
+variance_value_p = var(P);
+% 3. 标准差 (Standard Deviation)
+std_value_v = std(V );
+std_value_p = std(P);
+% 4. 最大值 (Maximum)
+max_value_v = max(V (1:10));
+max_value_p = max(P (1:10));
+% 5. 最小值 (Minimum)
+min_value_v = min(V );
+min_value_p = min(P );
+% 定义实时工况特征数据
+% Y0 = [115.70,2832.562, 53.221, 226,126.9]; 
+Y01 = [mean_value_p, variance_value_p,std_value_p,max_value_p,min_value_p]; %压力传感
+Y02 = [mean_value_v, variance_value_v,std_value_v,max_value_v,min_value_v]; %流速传感
+
+
+%%回气压力历史数据,回气流速也一样
+P1 = [0	0 0 14 36 54 61 60 56 52 57 55 50 45 41 37 33 31 29 28;
+    0 0 2 27 68 91 99 89 75 65 56 55 61 62 59 55 51 53 59 59;
+    0 0 5 41 75 94 104 107 111 109 97 83 71 65 61 59 57 56 55 55]
+% 获取矩阵的行数和列数
+[n, m] = size(P1);
+%  计算每一行的平均值
+mean_mean_p = zeros(n, 1); 
+mean_variance_p=zeros(n, 1); 
+mean_std_p=zeros(n, 1); 
+mean_max_p=zeros(n, 1); 
+mean_min_p=zeros(n, 1); 
+
+
+V1 = [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;
+    0.3 0 4 24.5 39.2 45.9 47.8 46 41.7 39 36.1 36.1 37.8 37.7 37.3 35.4 34.8 35 37.1 37.3;
+    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]
+% 获取矩阵的行数和列数
+[s, t] = size(V1);
+%  计算每一行的平均值
+mean_mean_v = zeros(s, 1); 
+mean_variance_v=zeros(s, 1); 
+mean_std_v=zeros(s, 1); 
+mean_max_v=zeros(s, 1); 
+mean_min_v=zeros(s, 1); 
+
+
+
+for i = 1:n
+    % 对第 i 行的所有列求和,再除以元素个数
+    mean_mean_p(i) = mean(P1(i, :));
+    mean_variance_p(i) = var(P1(i, :));
+    mean_std_p(i) = std(P1(i, :));
+    mean_max_p(i) =  max(P1(i, :));
+    mean_min_p(i) = min(P1(i, :));
+end
+% 3. 计算10行的总平均值
+ total_mean_p = mean(mean_mean_p);
+    total_variance_p = mean(mean_variance_p);
+    total_std_p = mean(mean_std_p);
+    total_max_p =  mean(mean_max_p);
+    total_min_p = mean(mean_min_p);
+	
+for i = 1:n
+    % 对第 i 行的所有列求和,再除以元素个数
+    mean_mean_v(i) = mean(V1(i, :));
+    mean_variance_v(i) = var(V1(i, :));
+    mean_std_v(i) = std(V1(i, :));
+    mean_max_v(i) =  max(V1(i, :));
+    mean_min_v(i) = min(V1(i, :));
+end
+% 3. 计算10行的总平均值
+ total_mean_v = mean(mean_mean_v);
+    total_variance_v = mean(mean_variance_v);
+    total_std_v = mean(mean_std_v);
+    total_max_v =  mean(mean_max_v);
+    total_min_v = mean(mean_min_v);
+	
+	
+%%
+% 定义比较序列(不同故障数据,每行为一种故障)压力传感
+Y1 = [ total_mean_p, total_variance_p, total_std_p,total_max_p,total_min_p;    % 正常1   此处的数值就需要历史加油过程中单笔交易中回气流速和回气压力前20个采样点信号数据,也是求5个特征值
+    17.95, 248.8711,15.775,1,1;    % 轻微泄露2
+     23.3900,338.2757, 18.3923,1,1;    % 一般泄露3
+     12.5850, 130.3287, 11.4162,1,1]   % 严重泄露4
+ % 定义比较序列(不同故障数据,每行为一种故障)流速传感
+Y2 = [ total_mean_v, total_variance_v, total_std_v,total_max_v,total_min_v;    % 正常1
+    17.95, 248.8711,15.775,1,1;    % 轻微泄露2
+     23.3900,338.2757, 18.3923,1,1;    % 一般泄露3
+     12.5850, 130.3287, 11.4162,1,1]   % 严重泄露4
+
+% 设置分辨系数
+rho = 0.5;
+
+% 执行灰色关联分析
+[degree_1, order] = grey_relation_analysis1(Y01, Y1, rho);%压力传感-灰色关联度结果
+[degree_2, order] = grey_relation_analysis1(Y02, Y2, rho);%流速传感-灰色关联度结果
+
+%% 证据理论(Dempster-Shafer Theory)故障诊断
+% 辨识框架:Theta = {F1, F2, F3},分别表示三种故障类型
+% 焦元:各子集的基本概率分配(BPA)
+
+% 分别获取气路压力和流速传感器的BPA
+bpa1=degree_1;%压力传感
+bpa2=degree_2;%流速传感
+
+% 打印原始BPA
+disp('压力传感器 BPA:');
+disp(bpa1);
+disp('流速传感器 BPA:');
+disp(bpa2);
+
+% 执行证据组合
+combined = dempster_combine(bpa1, bpa2);
+
+% 显示融合结果
+disp('融合后BPA:');
+disp(combined);
+
+% 故障决策(选择最高置信度)
+[~, idx] = max([combined.F1, combined.F2, combined.F3, combined.F4]);
+faults = {'F1', 'F2', 'F3','F4'};
+fprintf('\n最终诊断结果:%s故障(置信度%.2f%%)\n', ...
+    faults{idx}, 100*(combined.(faults{idx})));
+
+%%
+
+function [grey_relation_degree, order] = grey_relation_analysis1(Y0, Y, rho)
+% 灰色关联分析用于故障诊断
+% 输入:
+%   Y0 - 参考序列(行或列向量)
+%   Y  - 比较序列矩阵,每行代表一个比较序列
+%   rho - 分辨系数(可选,默认0.5)
+% 输出:
+%   grey_relation_degree - 各比较序列的关联度
+%   order - 关联度排序(从高到低)
+
+% 参数检查与默认值设置
+if nargin < 3
+    rho = 0.5; % 默认分辨系数
+end
+
+% 确保Y0是行向量
+Y0 = Y0(:)';
+
+% 获取比较序列参数
+[n, m] = size(Y);
+m0 = length(Y0);
+
+% 检查序列长度一致性
+if m ~= m0
+    error('参考序列和比较序列的长度必须一致');
+end
+
+% 数据预处理:初值化(每元素除以序列第一个元素)
+% Y0_normalized = Y0 / Y0(1);
+% Y_normalized = Y ./ Y(:,1); % 按行归一化
+%%
+% 数据预处理:均值化(每元素除以序列平均值)
+Y0_mean = mean(Y0); % 计算参考序列均值
+Y0_normalized = Y0 / Y0_mean; % 参考序列均值化
+
+Y_mean = mean(Y, 2); % 计算各比较序列的均值(按行计算)
+Y_normalized = Y ./ Y_mean; % 比较序列均值化(自动广播)
+
+%%
+
+% 计算绝对差值矩阵
+diff = abs(Y0_normalized - Y_normalized);
+
+% 计算全局最小差和最大差
+delta_min = min(diff(:));
+delta_max = max(diff(:));
+
+% 计算关联系数矩阵
+relations = (delta_min + rho * delta_max) ./ (diff + rho * delta_max);
+
+% 计算关联度(按行求平均)
+grey_relation_degree = mean(relations, 2);
+
+% 按关联度降序排序
+[~, order] = sort(grey_relation_degree, 'descend');
+end
+%% 步骤2:Dempster组合规则实现
+function combined_bpa = dempster_combine(bpa1, bpa2)
+    % 定义所有可能的焦元组合
+    sets = {{'F1'}, {'F2'}, {'F3'},{'F4'}};
+    
+    % 计算冲突系数K
+    K = 0;
+    for i = 1:length(sets)
+        for j = 1:length(sets)
+            if isempty(intersect(sets{i}, sets{j}))%C = intersect(A,B),其中A和B是要找出交集的两个数组   isempty是MATLAB中的一个函数,用于判断一个变量是否为空。
+                K = K + bpa1(i)* bpa2(j);
+            end
+        end
+    end
+    
+    % 计算合并后的BPA
+    combined_bpa = struct();
+    for k = 1:length(sets)
+        sum_val = 0;
+        for i = 1:length(sets)
+            for j = 1:length(sets)
+                if isequal(union(sets{i}, sets{j}), sets{k})%如果你想计算两个或多个向量的并集,你可以使用union函数。这个函数会合并这些向量,并去除重复的元素
+                    sum_val = sum_val + bpa1(i) * bpa2(j);
+                end
+            end
+        end
+        combined_bpa.(strjoin(sets{k},'')) = sum_val / (1 - K);
+    end
+end
+
+% 辅助函数:获取BPA值
+function val = get_value(bpa, set)
+    if length(set) == 1
+        val = bpa.(set{1});
+    else
+        val = bpa.Theta;
+    end
+end

+ 45 - 0
程序设计文档/油气回收智能诊断系统/实验进油数据/新文件14.txt

@@ -0,0 +1,45 @@
+
+
+
+% ---- 压力矩阵(P_F1~P_F4)----
+P_F1 = [ ...
+    0 0 0 14 36 54 61 60 56 52 57 55 50 45 41 37 33 31 29 28;
+    0 0 2 27 68 91 99 89 75 65 56 55 61 62 59 55 51 53 59 59;
+    0 0 5 41 75 94 104 107 111 109 97 83 71 65 61 59 57 56 55 55];
+
+P_F2 = [ ...
+    0 0 0 51 86 129 114 95 73 69 66 81 99 97 75 60 53 47 44 46;
+    0 0 7 96 149 138 130 139 134 129 126 125 123 121 120 115 100 70 60 52;
+    0 0 19 115 150 141 136 140 135 128 127 126 123 121 120 119 118 118 117 117];
+
+P_F3 = [ ...
+    0 0 0 75 196 154 185 162 144 147 139 134 130 127 125 123 121 120 120 119;
+    0 0 10 152 184 187 173 163 142 140 137 131 130 126 125 123 123 121 121 120;
+    0 0 23 190 183 185 156 157 141 139 135 131 127 125 124 122 122 121 120 120];
+
+P_F4 = [ ...
+    0 0 0 101 226 226 183 170 156 143 141 141 137 135 131 129 126 124 123 122;
+    1 1 12 176 226 211 200 168 149 142 139 134 132 129 127 124 122 121 120 119;
+    0 0 21 226 226 194 164 152 148 146 139 136 131 129 126 125 123 122 120 120];
+
+% ---- 流速矩阵(V_F1~V_F4)----
+V_F1 = [ ...
+    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;
+    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;
+    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];
+
+V_F2 = [ ...
+    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;
+    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;
+    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];
+
+V_F3 = [ ...
+    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;
+    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;
+    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];
+
+V_F4 = [ ...
+    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;
+    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;
+    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];
+	

BIN
程序设计文档/油气回收智能诊断系统/智能诊断实时数据页面ai生成原型.png