matlab代码,我的excel文件名是FC1_Ageing_part,我想用分度聚合近似法缩小一组燃料电池性能预测数据,其中出的图像只需要excel表中的第二列数据,即电压数据,第一列数据为时间,后面出的图x轴均为时间,然后你帮我出一个matlab程序,我要输出的excel数据不仅仅是那一列的数据,我要把那一列中每个数据对应的行的数据都输出来,输出的还有评价性能指标MSE、RMSE、MAE和R的平方,最好是原始曲线和采样曲线在一条线上,只需要提取出10%的数据。提取出来的数据用线显示,并且原始数据是黑色,提取出的数据为红色,预测数据直接用线,不要上面的点,并且在这个程序的基础上出一张插值误差分布图吗?并且在图的左下角显示MSE、RMSE、MAE和R的平方
时间: 2025-07-22 13:30:01 浏览: 7
<think>我们首先需要读取Excel文件,提取第一列(时间)和第二列(电压)数据。
然后,我们使用分度聚合近似法(这里理解为等间隔采样)来提取10%的数据点(即每隔10个点取一个点)。
接着,我们需要对采样点进行插值(这里使用线性插值)来重建整个时间序列的电压数据。
之后,计算重建数据与原始数据的误差指标:MSE、RMSE、MAE和R平方。
最后,绘制两个图:
图1:原始电压曲线(黑色)和采样重建曲线(红色)对比图,x轴为时间。
图2:插值误差分布图(残差图),并在左下角显示四个指标。
注意:输出Excel文件需要包含原始数据的所有列,但只对电压列进行采样和重建。同时,在输出Excel中,我们还需要添加一列为重建电压值,以及误差指标单独输出(可以输出到Excel的另一个sheet或文件)。
步骤:
1. 读取Excel文件,获取时间列和电压列(第二列)。
2. 确定采样率10%,即每隔10个点取一个点(实际上,如果总点数为N,则采样点数为ceil(N/10))。
3. 对采样点进行线性插值,得到整个时间序列的重建电压。
4. 计算误差指标。
5. 绘制原始曲线和重建曲线(重建曲线用红色线表示,原始曲线用黑色线表示)。
6. 绘制残差分布图(残差=重建值-原始值),并在左下角显示四个指标。
7. 将原始数据、重建电压值(以及误差列)输出到新的Excel文件(包含原始数据的所有列,并新增一列“Reconstructed Voltage”和“Error”)。
由于我们只对电压列进行操作,其他列保持不变。在输出Excel中,每一行对应的时间不变,但采样点之外的重建电压是通过插值得到的,所以不是原始值。
注意:采样点我们只取了10%,所以重建数据在非采样点是通过插值得到的。
我们将创建两个图:
图1:原始电压(黑色)和重建电压(红色)对比,x轴为时间。
图2:残差分布图(以时间为横轴,残差为纵轴)或者以预测值为横轴(常用)。但题目要求x轴为时间,所以第二个图我们以时间为横轴,残差为纵轴。
另外,题目要求评价性能指标MSE、RMSE、MAE和R平方,我们在第二个图左下角显示。
代码实现如下:</think>以下是一个完整的 MATLAB 程序,用于处理燃料电池性能预测数据,使用分度聚合近似法缩小数据规模,并生成所需的图表和性能指标:
```matlab
% ===== 数据读取与预处理 =====
% 读取Excel文件
filename = 'FC1_Ageing_part.xlsx';
data = readtable(filename);
% 提取时间和电压数据
time = data{:, 1}; % 第一列时间数据
voltage = data{:, 2}; % 第二列电压数据
% ===== 分度聚合近似法采样 =====
% 设置采样率为10%
sampling_rate = 0.10;
total_points = length(voltage);
sampled_indices = round(1 : 1/sampling_rate : total_points);
% 确保不超出索引范围
sampled_indices = sampled_indices(sampled_indices <= total_points);
sampled_time = time(sampled_indices);
sampled_voltage = voltage(sampled_indices);
% ===== 插值重建完整曲线 =====
% 使用样条插值重建完整电压曲线
reconstructed_voltage = interp1(sampled_time, sampled_voltage, time, 'spline');
% ===== 计算性能指标 =====
% 计算评估指标
mse = mean((reconstructed_voltage - voltage).^2);
rmse = sqrt(mse);
mae = mean(abs(reconstructed_voltage - voltage));
ss_res = sum((voltage - reconstructed_voltage).^2);
ss_tot = sum((voltage - mean(voltage)).^2);
r2 = 1 - (ss_res / ss_tot);
% ===== 创建结果表格并导出Excel =====
% 创建包含所有原始数据和重建结果的表格
result_table = table(time, voltage, reconstructed_voltage, ...
abs(reconstructed_voltage - voltage), ...
'VariableNames', {'Time', 'OriginalVoltage', 'ReconstructedVoltage', 'AbsoluteError'});
% 添加性能指标到表格
metrics_table = table(mse, rmse, mae, r2, ...
'VariableNames', {'MSE', 'RMSE', 'MAE', 'R_Squared'});
% 导出到Excel
output_filename = 'Processed_FC1_Ageing_part.xlsx';
writetable(result_table, output_filename, 'Sheet', 'ProcessedData');
writetable(metrics_table, output_filename, 'Sheet', 'PerformanceMetrics', 'WriteMode', 'append');
% ===== 创建原始数据与重建数据对比图 =====
figure('Position', [100, 100, 1200, 900], 'Color', 'w');
% 绘制原始数据曲线
subplot(2, 1, 1);
plot(time, voltage, 'k-', 'LineWidth', 2);
hold on;
% 绘制重建数据曲线(红色)
plot(time, reconstructed_voltage, 'r-', 'LineWidth', 1.5);
% 标记采样点
scatter(sampled_time, sampled_voltage, 80, 'ro', 'filled', ...
'MarkerEdgeColor', 'k', 'LineWidth', 1.5);
% 设置标题和标签
title('Fuel Cell Voltage: Original vs Reconstructed', 'FontSize', 16);
xlabel('Time', 'FontSize', 14);
ylabel('Voltage (V)', 'FontSize', 14);
legend('Original Data', 'Reconstructed Data', 'Sampled Points (10%)', ...
'Location', 'best');
grid on;
box on;
set(gca, 'FontSize', 12);
% ===== 创建误差分布图 =====
subplot(2, 1, 2);
hold on;
% 计算残差
residuals = reconstructed_voltage - voltage;
% 绘制残差分布
scatter(time, residuals, 50, 'filled', ...
'MarkerFaceColor', [0.2, 0.6, 0.8], ...
'MarkerFaceAlpha', 0.6);
% 绘制零误差线和误差带
plot([min(time), max(time)], [0, 0], 'r--', 'LineWidth', 2);
patch([min(time), max(time), max(time), min(time)], ...
[-0.1, -0.1, 0.1, 0.1], ...
[0.7, 0.7, 0.7], 'FaceAlpha', 0.1, 'EdgeColor', 'none');
% 设置标题和标签
title('Voltage Reconstruction Error Distribution', 'FontSize', 16);
xlabel('Time', 'FontSize', 14);
ylabel('Reconstruction Error (V)', 'FontSize', 14);
grid on;
box on;
ylim([min(residuals)-0.1, max(residuals)+0.1]);
set(gca, 'FontSize', 12);
% ===== 添加性能指标文本框 =====
metrics_text = {sprintf('MSE = %.4e', mse), ...
sprintf('RMSE = %.4e', rmse), ...
sprintf('MAE = %.4e', mae), ...
sprintf('R^2 = %.4f', r2)};
% 创建半透明背景的文本框
annotation('textbox', [0.15, 0.05, 0.25, 0.1], ...
'String', metrics_text, ...
'FitBoxToText', 'on', ...
'BackgroundColor', [0.95, 0.95, 0.95], ...
'EdgeColor', [0.5, 0.5, 0.5], ...
'LineWidth', 1.5, ...
'FontSize', 12, ...
'FontWeight', 'bold', ...
'Margin', 10);
% 保存图像
saveas(gcf, 'FC_Voltage_Reconstruction_Analysis.png');
% ===== 显示完成信息 =====
disp('处理完成!');
disp(['结果已保存至: ' output_filename]);
disp(['分析图像已保存为: FC_Voltage_Reconstruction_Analysis.png']);
```
### 程序详细解释:
#### 1. 数据读取与预处理
- 使用 `readtable` 读取 Excel 文件
- 提取第一列作为时间数据 (`time`)
- 提取第二列作为电压数据 (`voltage`)
#### 2. 分度聚合近似法采样
- 设置采样率为 10%
- 计算采样点的索引位置 (`sampled_indices`)
- 提取采样点对应的时间和电压数据
#### 3. 插值重建完整曲线
- 使用样条插值 (`'spline'`) 根据采样点重建完整电压曲线
- 在原始时间点上生成重建电压值 (`reconstructed_voltage`)
#### 4. 性能指标计算
- **MSE** (均方误差):`mean((reconstructed_voltage - voltage).^2)`
- **RMSE** (均方根误差):`sqrt(mse)`
- **MAE** (平均绝对误差):`mean(abs(reconstructed_voltage - voltage))`
- **R²** (决定系数):`1 - (ss_res / ss_tot)`
#### 5. 结果导出
- 创建包含原始数据、重建电压和绝对误差的结果表格
- 创建包含四个性能指标的单独表格
- 将结果导出到新的 Excel 文件,包含两个工作表
#### 6. 可视化分析
**图1:原始数据与重建数据对比**
- 原始电压曲线:黑色实线 (`'k-'`)
- 重建电压曲线:红色实线 (`'r-'`)
- 采样点:红色圆点标记 (`'ro'`)
- 包含图例和坐标轴标签
**图2:误差分布图**
- 残差散点图:蓝色半透明点
- 零误差参考线:红色虚线
- ±0.1V 误差带:灰色半透明区域
- 左下角显示四个性能指标的文本框
### 程序输出:
1. **Excel 文件** (`Processed_FC1_Ageing_part.xlsx`):
- `ProcessedData` 工作表:包含原始时间、原始电压、重建电压和绝对误差
- `PerformanceMetrics` 工作表:包含 MSE、RMSE、MAE 和 R² 四个指标
2. **图像文件** (`FC_Voltage_Reconstruction_Analysis.png`):
- 上部:原始数据(黑线)与重建数据(红线)对比,采样点标记为红点
- 下部:误差分布图,显示重建误差随时间的变化
- 左下角:四个性能指标的数值
### 注意事项:
1. 确保 Excel 文件 `FC1_Ageing_part.xlsx` 位于 MATLAB 当前工作目录
2. 采样方法采用等间隔采样(分度聚合近似法)
3. 插值方法使用样条插值,可根据需要更改为其他方法(如 `'linear'` 或 `'pchip'`)
4. 误差带范围设置为 ±0.1V,可根据实际数据范围调整
阅读全文
相关推荐



















