我的代码存在问题,因为我试图进行积分计算,但它不会用于功能P2
。
我尝试使用匿名函数句柄在MATLAB上使用integral()
函数以及仅使用int()
,但它仍然无法计算。对于MATLAB来说,这些值是否太小而无法集成,或者我只是缺少一些小的东西?
任何帮助或建议都会让我感到满意。谢谢!
代码中的问题位于标有" Power Calculations"的部分的底部。如果有所作为,我的积分也会变得非常混乱。
%%%%%%%%%%% Parameters %%%%%%%%%%%%
n0 = 1; %air
n1 = 1.4; %layer 1
n2 = 2.62; %layer 2
n3 = 3.5; %silicon
L0 = 650*10^(-9); %centre wavelength
L1 = 200*10^(-9): 10*10^(-9): 2200*10^(-9); %lambda from 200nm to 2200nm
x = ((pi./2).*(L0./L1)); %layer phase thickness
r01 = ((n0 - n1)./(n0 + n1)); %reflection coefficient 01
r12 = ((n1 - n2)./(n1 + n2)); %reflection coefficient 12
r23 = ((n2 - n3)./(n2 + n3)); %reflection coefficient 23
t01 = ((2.*n0)./(n0 + n1)); %transmission coefficient 01
t12 = ((2.*n1)./(n1 + n2)); %transmission coefficient 12
t23 = ((2.*n2)./(n2 + n3)); %transmission coefficient 23
Q1 = [1 r01; r01 1]; %Matrix Q1
Q2 = [1 r12; r12 1]; %Matrix Q2
Q3 = [1 r23; r23 1]; %Matrix Q3
%%%%%%%%%%%% Graph of L vs R %%%%%%%%%%%
R = zeros(size(x));
for i = 1:length(x)
P = [exp(j.*x(i)) 0; 0 exp(-j.*x(i))]; %General Matrix P
T = ((1./(t01.*t12.*t23)).*(Q1*P*Q2*P*Q3)); %Transmission
T11 = T(1,1); %T11 value
T21 = T(2,1); %T21 value
R(i) = ((abs(T21./T11))^2).*100; %Percent reflectivity
end
plot(L1,R)
title('Percent Reflectance vs. wavelength for 2 Layers')
xlabel('Wavelength (m)')
ylabel('Reflectance (%)')
%%%%%%%%%%% Power Calculation %%%%%%%%%%
syms L; %General lamda
y = ((pi./2).*(L0./L)); %Layer phase thickness with variable Lamda
P1 = [exp(j.*y) 0; 0 exp(-j.*y)]; %Matrix P with variable Lambda
T1 = ((1./(t01.*t12.*t23)).*(Q1*P1*Q2*P1*Q3)); %Transmittivity matrix T1
I = ((6.16^(15))./((L.^(5)).*exp(2484./L) - 1)); %Blackbody Irradiance
Tf11 = T1(1,1); %New T11 section of matrix with variable Lambda
Tf2 = (((abs(1./Tf11))^2).*(n3./n0)); %final transmittivity
P1 = Tf2.*I; %Power before integration
L_initial = 200*10^(-9); %Initial wavelength
L_final = 2200*10^(-9); %Final wavelength
P2 = int(P1, L, L_initial, L_final) %Power production
答案 0 :(得分:2)
我重构了你的代码
为什么要使用这么多不必要的括号?!
无论如何,我在你的代码中看到了一些问题。
您使用i
作为循环变量,j
作为虚数单位。对于这个例子来说没关系,但几乎没有。将来最好使用1i
或1j
作为虚构单位,和/或m
或ii
或其他其他而不是{{ 1}}或i
作为循环索引变量。你在帮助自己和同事;这样就不那么容易混淆了。
接下来,您连续两次使用变量名j
,并采用两种不同的方式。虽然它在这里工作,但它令人困惑!我花了一些时间来解释为什么一个矩阵生成函数正在生成标量......
但到目前为止,您的代码中最大的问题是黑体辐照度计算的数值问题。
一词P1
对于λ0= 200·10 -7 m,需要计算数量
L⁵ · exp(2484/L) - 1
不用说,对于计算机来说相当困难:)实际上,计算的问题是双重的。首先,取幂绝对超出64位IEEE-754双精度范围,因此将导致∞。第二,括号错了;普朗克定律应该读
exp(1.242 · 10¹⁰)
C/L⁵ · 1/(exp(D) - 1)
和C
常数(涉及普朗克常数,光速和玻尔兹曼常数),你可能已预先计算好了(我没有检查数值。我 知道单位的选择会弄乱这些,所以更好的检查)。
所以,除了愚蠢的括号错误外,我怀疑主要问题是你只是忘了将λ重新缩放到nm。将黑体方程式中的所有内容更改为nm并更正这些括号,即可得到代码
D
有了这个,我得到了
积分的有限值I = 6.16^(15) / ( (L*1e+9)^5 * (exp(2484/(L*1e+9)) - 1) );
但是,再次,你最好仔细检查一切。
请注意,我使用的是P2 = 1.052916498836486e-010
,因为它是R2010a上可用的最好的之一(我坚持使用),但您可以轻松地将其替换为任何更新的quadgk()
比R2012a。
这是我最终得到的代码:
integral()