Matlab打包M脚本为exe文件——多项式拟合小工具

目录

一、前言

二、实现


一、前言

上次写了一个简单的电压多项式拟合的脚本,准备把他创建为一个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有点丧)

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值