前言
本文所用传感器为电涡流位移传感器,测量量为位移,输出量为电压,使用神经网络算法对系统进行非线性补偿和温度补偿。
公式拟合及其原理详见之前的文章:链接: 基于MATLAB拟合的位移传感器补偿方案.
具体涉及神经网络原理及神经网络工具中各参数的设置已经有很多人讲的很清楚了,这里不再赘述。
实验方法及数据
在不同温度下,测量不同距离的位移所产生的电压,记录数据。由于现阶段缺少实验设备进行测试,故先使用参考文章中的数据,后续再更新实测数据。文章中具体数据如下:
神经网络工具的使用
使用MATLAB2018a的Neural Net Fitting工具可以轻松处理此类问题,具体步骤如下:
1.在MATLAB命令行窗口输入U、C、X的值,分别代表电压,温度,位移,依次为下方三个矩阵。(为方便使用,这里直接附上可复制的数据)
u =
0.2880 0.5260 1.0880 1.5440 1.9130 2.4350 2.9520 3.5990 4.2830
1.8380 2.0350 2.4760 2.8550 3.1290 3.5590 3.9190 4.3800 4.9470
3.8380 4.0300 4.4350 4.7840 5.0860 5.4580 5.8170 6.2480 6.7950
5.6250 5.8170 6.2020 6.5160 6.8100 7.1500 7.5190 7.9290 8.4560
7.2450 7.4170 7.7970 8.0960 8.3740 8.6940 9.0480 9.4580 9.9540
8.6830 8.8660 9.2250 9.5040 9.7770 10.0760 10.4250 10.8300 11.3110
9.9640 10.1520 10.5210 10.7750 11.0180 11.3160 11.6660 12.0560 12.5370
11.1290 11.3160 11.6610 11.9190 12.1720 12.4400 12.7800 13.1650 13.6300
12.1720 12.3540 12.7040 12.9570 13.1900 13.4530 13.7870 14.1870 14.6230
13.1140 13.2960 13.6250 13.8780 14.4160 14.3650 14.6990 15.0890 15.5190
13.9600 14.1370 14.4860 14.7140 14.9520 15.2000 15.5140 15.9040 16.3390
14.7190 14.9010 15.2410 15.4680 15.7060 15.9240 16.2530 16.6480 17.0740
15.4030 15.5800 15.9190 16.1520 16.3850 16.5930 16.9170 17.3320 17.7320
16.0250 16.2180 16.5320 16.7700 17.0180 17.2100 17.5290 17.9390 18.3390
16.5870 16.7850 17.0990 17.3370 17.5850 17.7620 18.0810 18.5010 18.8860
17.0990 17.2960 17.6150 17.8430 18.0860 18.2690 18.5770 19.0230 19.4180
17.5700 17.7570 18.0760 18.3140 18.5420 18.7290 19.0430 19.4670 19.8530
17.9900 18.1820 18.5010 18.7390 18.9670 19.1500 19.4480 19.8440 20.2480
18.3750 18.5670 18.8860 19.1290 19.3470 19.5250 19.8130 20.2130 20.5980
18.7290 18.9170 19.2310 19.4790 19.7070 19.8530 20.1420 20.5430 20.9580
19.0530 19.2410 19.5450 19.7830 20.0150 20.1780 20.4150 20.7960 21.2560
c =
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
22.5000 25.8000 31.6000 36.6000 40.7000 45.4000 51.0000 56.6000 61.6000
x =
0 0 0 0 0 0 0 0 0
0.1000 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000 0.1000
0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000 0.2000
0.3000 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000 0.3000
0.4000 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000 0.4000
0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000 0.5000
0.6000 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000 0.6000
0.7000 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000 0.7000
0.8000 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000 0.8000
0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000 0.9000
1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000 1.0000
1.1000 1.1000 1.1000 1.1000 1.1000 1.1000 1.1000 1.1000 1.1000
1.2000 1.2000 1.2000 1.2000 1.2000 1.2000 1.2000 1.2000 1.2000
1.3000 1.3000 1.3000 1.3000 1.3000 1.3000 1.3000 1.3000 1.3000
1.4000 1.4000 1.4000 1.4000 1.4000 1.4000 1.4000 1.4000 1.4000
1.5000 1.5000 1.5000 1.5000 1.5000 1.5000 1.5000 1.5000 1.5000
1.6000 1.6000 1.6000 1.6000 1.6000 1.6000 1.6000 1.6000 1.6000
1.7000 1.7000 1.7000 1.7000 1.7000 1.7000 1.7000 1.7000 1.7000
1.8000 1.8000 1.8000 1.8000 1.8000 1.8000 1.8000 1.8000 1.8000
1.9000 1.9000 1.9000 1.9000 1.9000 1.9000 1.9000 1.9000 1.9000
2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000 2.0000
2.在APP中打开 Neural Net Fitting,如图所示。
3.点击Next,设置Inputs为变量inputs0,Targets为output0,设置Samples are为Matrix rows,如下图所示。input0和output计算过程如下代码所示(这里已将数据保存成了.mat格式,所以需要读取文件)。
load('U.mat');%读取电压
load('C.mat');%读取温度
load('X.mat');%读取位移
for i=1:1:21*9%将输入数据转换为两列N行,输出数据为一列N行
input0(i,1)=u(i);
input0(i,2)=c(i);
output0(i,1)=x(i);
end
4.继续点击Next,得到下图,可以看出输入变量为2,输出变量为1,符合输入为温度和位移,输出为电压的需求。
5.点击Next,再点击Train,即可开始训练。训练完成后如下图所示。
6.继续点击Next到最后一步,点击Save Results,即可保存训练完成的网络,也可以保存成.mat格式,下次使用就不需要再次运行神经网络工具了。
测试训练效果
将原本的U,X.C的21X9的矩阵进行调整,扩大为100X100的矩阵,但最大最小值不变,带入网络进行测试,同时对比公式拟合的效果,如下图所示,可见与原图相差无几。
所用代码如下:
%利用多种方法进行拟合
%%
%原始数据
clc;clear;
load('U.mat');%读取输入
load('C.mat');%读取输入
load('X.mat');%读取输出
load('net.mat');%读取神经网络
x=x+10;%因为神经网络中对负数处理有问题,所以将其变为正数
subplot(2,2,1);
s=surf(u,c,x-10);%输出原始三维曲面
%s.EdgeColor = 'none';%使曲面中黑线消失
title('原始三维曲面');
xlabel('电压u');
ylabel('温度c');
zlabel('位移x');
for i=1:1:21*9%将输入数据转换为两列N行,输出数据为一列N行
input0(i,1)=u(i);
input0(i,2)=c(i);
output0(i,1)=x(i);
end
x_min=0;%显示的x轴最小值
x_max=20;
y_min=0;
y_max=60;
xlsj=100;%用于向量生成中,共多少个数据
%hold on;
%运行到这里,打开APP中的Neural Net Fitting训练数据,保持网络net,再进行下面的程序
%%
%利用神经网络拟合
u1=meshgrid(linspace(x_min,x_max,xlsj))';%将输入数据转换为N列N行,以检验神经网络
c1=meshgrid(linspace(y_min,y_max,xlsj));
uc1=[u1(:),c1(:)];%将输入数据转换为两列N行
x1=sim(net,([u1(:),c1(:)])')';
x1=reshape(x1,xlsj,xlsj);
%figure;
subplot(2,2,2);
s1=surf(u1,c1,x1-10);%输出拟合三维曲面
title('神经网络拟合三维曲面');
xlabel('电压u');
ylabel('温度c');
zlabel('位移x');
%%
%计算二元回归从而得到公式进行拟合
%cftool;%将u c x的数据填入,x对应u,y对于c,z对于x,得到公式后再屏蔽
p00 = 10.17;
p10 = 0.06429;
p01 = -0.009332;
p20 = -0.005164;
p11 = 0.001208;
p30 = 0.0003959;
p21 = -7.316e-05;
u2=u1;
c2=c1;
x2=p00 + p10.*u2 + p01.*c2 + p20.*u2.^2 + p11.*u2.*c2 + p30.*u2.^3 + p21.*u2.^2.*c2;
x2=reshape(x2,xlsj,xlsj);
subplot(2,2,3);
%figure;
s2=surf(u2,c2,x2-10);%输出拟合三维曲面
title('公式拟合三维曲面');
xlabel('电压u');
ylabel('温度c');
zlabel('位移x');
数据来源文章:《基于电涡流传感器的微位移测量系统的设计_荣锋》