目录
一、前言
上次写了一个简单的电压多项式拟合的脚本,准备把他创建为一个exe给其他人用。功能
1、在DOS命令行输入exe + 文件名可以直接运行
2、不安装matlab也可以运行
3、每次输出结果记录到txt文本中
4、记录每次运行的时间和文件名
5、运行结束可以绘图
Let's do it!
二、实现
2.1 编码VoltageFit.m脚本,带参数
%date:2022/3/21
%author:Joab
%email:
%func:
function VoltageFit(filename)
n = 4; %拟合次数
x = 'radar';%radar , scope
vol_data = xlsread(filename);
vol_scope = vol_data(:,1);
%vol_radar = vol_data(:,end-1);
vol_radar = vol_data(:,2);
volFit_err = [];
%write to txt
fid = fopen('volRet.txt','a');
fprintf(fid,'=============================================================\r\n');
fprintf(fid,'当前系统时间: %s\r\n',datestr(now,'mmmm dd,yyyy HH:MM:SS.FFF AM'));
fprintf(fid,'文件名: %s\r\n',filename);
fprintf('=============================================================\r\n');
fprintf('当前系统时间: %s\r\n',datestr(now,'mmmm dd,yyyy HH:MM:SS.FFF AM'));
fprintf('文件名: %s\r\n',filename);
for i = 2:n
if strcmp(x ,'radar')
p=polyfit(vol_radar,vol_scope,i);
fit_adc = polyval(p,vol_radar);
max_error = max(abs(fit_adc - vol_scope));
min_error = min(abs(fit_adc - vol_scope));
rmse=sqrt(sum((fit_adc-vol_scope).^2)/length(fit_adc));
else
p=polyfit(vol_scope,vol_radar,i);
fit_adc = polyval(p,vol_scope);
max_error = max(abs(fit_adc - vol_radar));
min_error = min(abs(fit_adc - vol_radar));
rmse=sqrt(sum((fit_adc-vol_radar).^2)/length(fit_adc));
end
volFit_err = [ volFit_err;max_error];
if i ==2
fprintf(fid,'***********二次拟合***********\r\n');
fprintf(fid,'拟合系数:p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3));
fprintf(fid,'表达式:voltage = %f *a^2 +%f *b +%f\n',p(1),p(2),p(3));
fprintf('***********二次拟合***********\n');
fprintf('拟合系数:p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3));
fprintf('表达式:voltage = %f *a^2 +%f *b +%f\r\n',p(1),p(2),p(3));
elseif i ==3
fprintf(fid,'***********三次拟合***********\r\n');
fprintf(fid,'拟合系数:p3 = %f, p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3),p(4));
fprintf(fid,'表达式:voltage = %f *a^3 +%f *b^2 +%f *c + %f\n',p(1),p(2),p(3),p(4));
fprintf('***********三次拟合***********\n');
fprintf('拟合系数:p3 = %f, p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3),p(4));
fprintf('表达式:voltage = %f *a^3 +%f *b^2 +%f *c + %f\r\n',p(1),p(2),p(3),p(4));
elseif i ==4
fprintf(fid,'***********四次拟合***********\r\n');
fprintf(fid,'拟合系数:p4 = %f,p3 = %f, p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3),p(4),p(5));
fprintf(fid,'表达式:voltage = %f *a^4 +%f *b^3 +%f *c^2 + %f *d + %f\n',p(1),p(2),p(3),p(4),p(5));
fprintf('***********四次拟合***********\n');
fprintf('拟合系数:p4 = %f,p3 = %f, p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3),p(4),p(5));
fprintf('表达式:voltage = %f *a^4 +%f *b^3 +%f *c^2 + %f *d + %f\r\n',p(1),p(2),p(3),p(4),p(5));
else
fprintf('Error!\n');
end
fprintf(fid,'最大误差:%f.\n',max_error);
fprintf(fid,'最小误差:%f.\n',min_error);
fprintf(fid,'均方根误差:%f.\r\n',rmse);
fprintf('最大误差:%f.\n',max_error);
fprintf('最小误差:%f.\n',min_error);
fprintf('均方根误差:%f.\r\n',rmse);
%plot
if strcmp(x ,'radar')
figure
plot(vol_radar,vol_scope,'.')
hold on
plot(vol_radar,fit_adc,'--o')
xlabel('radar')
ylabel('scope')
legend('Real','Fit')
else
plot(vol_scope,vol_radar,'.')
hold on
plot(vol_scope,fit_adc,'--o')
end
title([num2str(i),' 次方电压采集多项式拟合曲线 '])
hold off
end
for i=1:length(volFit_err)
if volFit_err(i)<0.1
fprintf(fid,'推荐 %d 次多项式函数!\n',i+1);
fprintf('推荐 %d 次多项式函数!\r\n',i+1);
break
end
end
fclose(fid);
fclose all;
end
2.2 打开Application Compiler
2.3 按照下面四步填写即可
(没有app designer有点丧)