米氏散射的计算非常复杂,限制了其在一般场景的应用。这里附上matlab的计算代码,欢迎大家使用。米氏散射的详情可以参考之前的一篇文章:光谱测量——比尔朗伯定律和米氏散射-CSDN博客
如下代码与参考文献中的代码相比,经过少许简化。
其中,尺寸参数,d为颗粒直径,lambda为波长。
clc
clear
alpha=5:0.1:50;
n =1.195-0.00i ;
f =0 ; %消光截面递推公式求和项
for l=1:70 %级数求和次数
syms x f1 f2
if l==1
f1 =sin(x)./x -cos(x);
f1dot =diff( f1,x ,1);
f2 =(sin(x)+i*cos(x))./x -cos(x)+i *sin(x);
f2dot =diff(f2,x,1);
else
f1 =(pi*x/2).*besselj(l+0.5,x);
f1dot =(pi*x/2).*besselj(l-0.5,x)-l*(pi*x/2).*besselj(l+0.5,x)./x;
f2 =(pi*x/2).*(besselj(l+0.5,x)-i*bessely(l +0.5,x));
f2dot =(pi*x/2).*(besselj(l-0.5,x)-i*bessely(l-0.5,x))-l*(pi*x/2).*(besselj(l+0.5,x)-i*bessely(l+0.5,x))./x;
end
g1=inline(vectorize(f1),'x'); %将符号变量转换为函数
g1dot=inline(vectorize(f1dot),'x');
g2=inline(vectorize(f2),'x');
g2dot=inline(vectorize(f2dot),'x');
al=(g1dot(n*alpha).* g1(alpha)-n*g1(n*alpha).*g1dot(alpha))./(g1dot(n*alpha).*g2(alpha)-n*g1(n*alpha).*g2dot(alpha));
bl =(n*g1dot(n*alpha).*g1(alpha)-g1(n*alpha).*g1dot(alpha))./(n*g1dot(n*alpha).*g2(alpha)-g1(n*alpha).*g2dot(alpha));
f=f+(2*l+1)*real(al+bl); %( 求消光系数)
end
kext=2./alpha.^2.*f;
plot(alpha,kext);
xlabel('Size Parameter')
ylabel('Extinction Coefficient')