matlab很有用的总结,MATLAB仿真总结

MATLAB仿真过程中,编写MATLAB代码的时候犯了很多错误,做了很多蠢事。记录下自己犯错的点点滴滴,并引以为戒。使用MATLAB版本为2014a,以下内容如有不当还请指正。

1. 仿真开始前清理工作区

工作区存在的变量可能会对脚本运行产生影响,故代码(脚本)开头需要添加如下命令

clc;clear all;close all;

2. 养成良好的变量、函数命名习惯

MATLAB中有很多内置的常量、函数等。写代码的时候不能够随意命名,以防造成不必要的麻烦。譬如在循环时不应该使用i,j变量,在MATLAB中这多用于表示虚数符号。更多的内容可以参考《MATLAB 编程风格指南》。

3. 测试完成的代码再写出函数形式

有时候会把相对独立、固定的内容写成一个函数。但往往直接写成函数后是不利于测试的,即使添加断点后进入函数内部查看各变量取值,此时不能够观测到函数之外的变量。因此测试好代码无误再封装成函数是必要的。

4. 浮点数的精度

举个例子,下面代码运行结果是什么呢?

a=10^-17;b=1;if(a+b==1)

fprintf('a+b=1');elsefprintf('a+b!=1');

end

答案应该是输出 a+b=1,虽然很明显这是不成立的,但我们要知道MATLAB不是万能的,其表示的数的精度是有限的。对于精度问题不做具体的讨论,意识到这个问题后,我们必须将理论和时间区分开。

譬如在做除法的时候,有些变量依理论而言是不为0的,但实际上可能因为运算过程中的精度损失而使得计算结果产生Inf或是NaN,进而导致程序出现偏差。就拿上述例子来说,运行结果表明a+b-b=0。为避免这些情况的发生,必须对程序做相应的处理。在MATLAB中键入

help eps

This MATLAB function returns the distance from 1.0 to the next largest double-precision number, that is eps = 2^(-52).

可以在帮助文档内阅读详细描述,在实际代码中运用eps防止出现异常。(由其是在具有循环迭代的代码中更要注意这一点)

5. 写好注释,用好发布功能

我有个脚本试着发布了一下,如这里所示,实际上要好看些。这部分内容可以在帮助-MATLAB-Programming Scripts and Functions-Scripts中找到相关的介绍。个人觉得还是不错的,注释是肯定要写的,既然要写,为何不好好按照格式写呢?

当然,MATLAB提供的功能还是比较简单的,具体的功能大概也就这些。使用发布功能后代码会运行一遍,之后将结果也添加到发布的文档中去。

%%文档标题%具体描述%

%有格式文本% 最后修改日期:2015-03-07

%软件版本:MATLAB(R) 2014a%

% *加粗*

%

%# 编号列表%# 编号列表%%有标题节%

%%

%

6. 用好帮助,更要看清帮助

为什么很多仿真都用MATLAB?因为MATLAB很强大,很全面,可以做好很多事情。了解其强大功能的一个很好的途径是看其自身的帮助。当然,我想强调的是看清帮助。

前几天就犯了个错误,sgn是取符号的函数,MATLAB里面有个函数叫做sign实现了这个功能。然后我就用了,没有看清sign(0)=0……然而我希望的结果是sign(0)=1。所以在实际使用过程中还是要看清楚才行。

7. 适时保存运行结果

有的仿真要跑1天、两天、很多天,而且往往是可以中断的。为了防止电脑死机、断点,适时保存运行结果是必要的。我们可以让程序在命令行窗口实时输出信息以查看代码运行状态,并利用diary将这些信息保存起来。譬如

diary;

fprintf('\n-------------------------------\n');

fprintf('Eb/No = %e \n',Var1);

fprintf('总帧数 = %d,',Var2);

fprintf('误帧数 = %d,',Var3);

但我还是觉得新建文件自由一些,命令行窗口实时输出信息的格式还是不太好看。譬如我们可以将运行结果采用表格的形式存储起来,之后用readtable读取。

fid = fopen(FILE_NAME,'at+');

fprintf(fid,'日期 %s\n',datestr(now,'yyyymmdd'));

fprintf(fid,'EbN0\t T_Frame\t E_Frames\t E_Bits\t A_IterNums\t BER\t FER\n');

fprintf(fid,'%3.2g\t %5d\t %4d\t',EbN0_dB(nEbN0),nF,frameError(nEbN0));

fprintf(fid,'%8d\t %8.6g\t',bitError(nEbN0),iterNumTotal(nEbN0)/nF);

fprintf(fid,'%e\t %e\n',BER(nEbN0),frameError(nEbN0)/nF);

readtable(FILE_NAME,'HeaderLines',1,'Delimiter','\t')

读取的结果大概是这个样子,还是很好看的(虽然歪了……),而且可以轻松获取每列数据。

EbN0 T_Frame E_Frames E_Bits A_IterNums BER FER

____ _______ ________ ______ __________ ___ ___1 1 0 0 27 0 0

8.待续

……

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
仿真软件与应用实践1 MATLAB基础实验报告(代码总结心得)一、实验目的和要求: 1、掌握数组与矩阵的创建、矩阵运算与数组运算、基本元素群运算和向量与矩阵的特殊处理; 2、掌握二维图形、三维曲线和曲面图形的绘制以及标注; 二、实验内容: 1、利用“:”操作符和 linspace 函数生成数组 a=[0,6,12,18,24,30,36,42],并将数组 a 分别转化为 4*2 和 2*4 的矩阵。 2、在MATLAB中输入矩阵A=[■(3&6&8&1@-5&7&22&17@6&9&16&-12@15&13&-21&0)],并使用MATLAB回答以下问题: (1)创建一个有A中第2列到第4列所有元素组成的4*3数组B; (2)创建一个有A中第3行到第4行所有元素组成的2*4数组C; (3)创建一个有A中前两行和后三列所有元素组成的2*3数组D; (4)根据A利用单下标方法和双下标方法分别创建向量a=[-5 6 15],b=[6 8 1],并利用向量a和b生成矩阵E=[■(-5&6@6&8@15&1)];并利用“[]”删除矩阵A的第二行和第三列。 3、已知a=[■(1&3&4@5&12&44@7&8&27)],b=[■(-7&8&4@12&24&38@68&-5&3)],c=[1,0,8,3,6,2, 4,23,46,6]; (1)求a+b,a*b,a.*b,a/b,a./b,a^2,a.^2的结果,并观察分析运算结果; (2)求c中所有元素的平均值、最大值、中值,并将c中元素按从小到大顺序排列; (3)解释b(2:3,[1,3])的含义,并将生成的数组赋值给d。 4、已知A=[■(7&2&1&-2@9&15&3&-2@-2&-2&11&5@1&3&2&13)],用MATLAB求矩阵A的秩(rank)、行列式(determinant)、逆(inverse)、特征值及特征向量(eigenvalue and eigenvector)。 5、用MATLAB求方程组[■(7&2&1&-2@9&15&3&-2@-2&-2&11&3@1&3&2&13)]*[■(x_1@x_2@x_3@x_4 )]=[■(4@7@-1@0)]的解。 6、用不同线型和颜色在同一坐标内绘制曲线y=2e-0.5xsin(2πx)及其包络线,并为图形添加必要的图形标注。 7、在一个图形窗口中以子图形式同时绘制正弦、余弦、正切、余切曲线,并为图形添加必要的图形标注。 8、在xy平面内选择区域[-8,8]*[-8,8],绘制函数z=(sin√(x^2+y^2 ))/√(x^2+y^2 )的三种三维曲面图。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值