最近作业需要用到Matlab制图,到敲代码的环节磕磕绊绊,已经忘却这门语言的很多细节,于是借此机会复现了一些物理学中常见的曲线图像,比如不同温度条件下的黑体辐射出射度随波长的变化图。
图片来源:网络
黑体辐射出射度的计算公式如下:
---------------------------------------------------------------------------------------------------------------------------------根据公式可以按步骤写出下面的代码:
1. 声明各个变量的数值,注意单位。
wavelength = (0:1e-15:3e-12)'; % 波长,单位微米,为3000*1的数组
wavelength_std = wavelength/1e-6; % 标准单位化为米,为3000*1的数组
wavelength_temprature = wavelength_std.*(5000:1000:10000); % 波长数组和温度数组相乘,生成3000*6的数组
h = 6.626e-34; % 普朗克常数,单位Js
k = 1.38e-23; % 波尔希曼常数,单位J/K
c = 3e8; % 光速,单位m/s
2. 分步骤输入计算公式,注意数组计算代码书写过程中需要用“.*”、“./”、”.\“的地方。
M1 = (2*pi*h*c^2)./(wavelength.^5);
M2 = h*c./(k.*wavelength_temprature);
M3 = exp(h*c./(k*wavelength_temprature))-1;
M4 = (2*pi*h*c^2)./(wavelength_std.^5).*((exp(h*c./(k*wavelength_temprature))-1).^(-1));
M = M4./1e14;
请注意:上方M4即为最后的公式,单位是瓦/立方米,但是最后将函数M4除以10的14次方,是因为代入温度后的结果数据庞大,为了便于画图,将数据缩减倍数,得到的最后函数M的值在20以内。
3. 写绘制折线图的代码。
figure
plot(wavelength,M,'LineWidth',3);
axis([0,3e-12,0,14]);
set(gca,'xticklabel',{(0:0.5:3)});
set(gca,'FontName','Times New Roman','FontSize',16);
xlabel('\bf\it{\lambda (10^{-12}\mum)}','FontSize',20);
ylabel('\bf\it{M_{\lambda,T} (10^{14}W/m^3)}','FontSize',20);
title('\bf{黑体辐射出射度随波长变化曲线图}','FontName','STFangSong','FontSize',30);
text(0.4e-12,12,'\bfT=10000K','FontSize',14); %1
text(0.4e-12,7.5,'\bfT=9000K','FontSize',14); %2
text(0.45e-12,4,'\bfT=8000K','FontSize',14); %3
text(0.35e-12,2.5,'\bfT=7000K','FontSize',14); %4
text(0.4e-12,1.3,'\bfT=6000K','FontSize',14); %5
text(0.43e-12,0.2,'\bfT=5000K','FontSize',14); %6
hold on
从上到下的函数依次表示:调出图形窗口,plot函数绘制两个数组的图像,设置图像的坐标x和纵坐标y范围,重写横坐标的刻度标注,设置横纵坐标刻度标注的字体和字体大小,设置横纵坐标标注,设置标题,在图中相应位置添加温度的标注,hold on表示接下来将继续在图片上添加曲线。
4. 寻找wavelength_temprature数组中每一列(每一列表示不同温度)下的数组的最大值和最大值对应的行索引。
%% 寻找最大值
[matrix_m,index] = max(M,[],1);
5. 根据每一列最大值和对应的行数计算对应的波长,最大值为y_max数组,对应的波长记为x_max数组,两者通过plot函数绘制变化图线。
%% 绘制变化曲线图
y_max = matrix_m;
x_max = 1e-15*index;
% x_smooth = spcrv([[x_max(1) x_max x_max(end),])
plot(x_max,y_max,'k--','LineWidth',1);
图中注释是因为本想将折线平滑,但没看懂讲解,所以没有添加正确代码。
网络搜索Matlab折线图平滑即可查询函数。
---------------------------------------------------------------------------------------------------------------------------------最后将代码汇总运行,即可绘制出正确图像,效果图如下:
#########
%% 寻找最大值
[matrix_m,index] = max(M,[],1);
%% 绘制变化曲线图
y_max = matrix_m;
x_max = 1e-15*index;
%插值函数,平滑曲线
x_max2 = linspace(min(x_max), max(x_max));
y_max2 = interp1(x_max, y_max, x_max2, 'cubic')
plot(x_max2, y_max2, 'k--', 'LineWidth', 1);
% ,'k--','LineWidth',1