这是我在做红外物理小作业时的代码,虽然很简单但是我在写的过程中也是体会到了编程真的是不断实践才能有所成 。另外记忆力好对于编程影响也挺大的,虽然此代码很简单hh
%黑体的光谱辐射出射度的曲线绘制
%图像尽量与红外物理课本中67页的图3-5保持一致
c1 = 3.7415e8;%第一辐射常数
c2 = 1.438789e4;%第二辐射常数
for T=500:100:900 % 设置辐射温度(K)
l=0.00001:0.0001:16; % 设置波长范围及间隔步长
M=1e-4.*(c1./(l.^5)./(exp(c2./(l.*T))-1)); % 计算指定温度光谱辐出度,且此处乘以1e-4是将其中的m化为cm,以与课本中67页的图3-5一致
plot(l,M,'r') % 绘制光谱辐出度曲线
maxM = max(M); % 找出指定温度最大光谱辐出度
lnum=find(maxM==M); % 找峰值波长索引
text(l(lnum+100),M(lnum+20),[num2str(T),'K'],...
'VerticalAlignment', 'bottom','fontsize',12) % 在指定的合适位置按给定方式标记对应温度
hold on
end
一开始考虑用flot画,不过后来发现要写5个flot函数,,因为是字符串形式。另外最大值也难求,只是个图像,不过优点就是方便。
fplot 命令
在实际的应用中,用户可能并不知道某一个函数随自变量变化的趋势,此时若采用plot命令来绘图,则有可能会因为自变量的取值间隔不合理而使曲线图形不能反应出自变量在某些区域内函数值的变化情况。
用户可以将自变量间隔取得足够小以体现函数值随自变量变化的精确曲线,但是这样会使数据量变大。
fplot 命令通过函数来取得绘图的数值点矩阵。该命令通过内部的自适应算法来动态决定自变量的取值间隔,当函数值变化缓慢时,间隔取大一点;变化剧烈时(即函数的二阶导数很大),间隔取小一点。
在看text函数的参数的文档时发现要点击input arguments中x的verticalalignment然后进入textproperties页面才能看见还有verticalalignment这个参数,,不知道为什么这么设计。
%以下绘制过不同黑体辐射出射度曲线最大值的虚线
xm = zeros(1,411);ym = zeros(1,411);%预定义最大值变量及其维数
for T=500:910 % 设置辐射温度(K)
l=0.001:0.001:16; % 设置波长范围及计算步长
M=1e-4.*(c1./(l.^5)./(exp(c2./(l.*T))-1)); % 计算指定温度光谱辐出度,且此处乘以1e-4是将其中的m化为cm,以与课本中67页的图3-5一致
maxM = max(M); % 找出指定温度最大光谱辐出度
lnum=find(maxM==M); % 找峰值波长索引
ym(T-499) = maxM;xm(T-499) = l(lnum);%对最大值坐标分量依次赋值
end
plot(xm,ym,'--r') % 绘制过不同温度下黑体光谱辐出度曲线最大值的曲线,并以虚线表示
set(gca,'XTick',[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]) %设置横坐标点
xlabel('波长\lambda / \mum') % 横坐标名称及单位
ylabel('光谱辐射出射度M_{\lambda} / (W/(cm^{2}\cdot\mum)') % 纵坐标名称及单位
title('500-900k部分黑体的光谱辐射出射度曲线','fontsize',10)
grid on
由于MATLAB对矩阵的单个元素循环时速度很慢,如果把循环向量化,不仅能缩短程序的长度,而且能提高程序的执行效率。也就是程序优化方法之一。程序优化要对语言的特性熟悉。
另外向量预分配也是优化方法之一:
Matlab 采用内存中一块连续的空间来存储向量和矩阵数据,而不是用链表。这就意味着你每给向量或矩阵增加一元素,Matlab需要寻找一块足够大的内存区域来存储 这个扩大后的向量或矩阵,然后复制现有的数据到新的内存区域。在循环中增加向量或矩阵元素的元数是允许的,但并不是明智之举,而应该是一次性分配向量或矩 阵的大小,或一次性重定义尺寸。