代码不会在MATLAB中产生定积分的值

时间:2016-11-11 05:14:17

标签: matlab math integration

我的代码存在问题,因为我试图进行积分计算,但它不会用于功能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

1 个答案:

答案 0 :(得分:2)

我重构了你的代码

  1. 使其更易于阅读
  2. 改进代码重用
  3. 提高绩效
  4. 使其更容易理解
  5. 为什么要使用这么多不必要的括号?!

    无论如何,我在你的代码中看到了一些问题。

    1. 您使用i作为循环变量,j作为虚数单位。对于这个例子来说没关系,但几乎没有。将来最好使用1i1j作为虚构单位,和/或mii或其他其他而不是{{ 1}}或i作为循环索引变量。你在帮助自己和同事;这样就不那么容易混淆了。

    2. 接下来,您连续两次使用变量名j,并采用两种不同的方式。虽然它在这里工作,但它令人困惑!我花了一些时间来解释为什么一个矩阵生成函数正在生成标量......

    3. 但到目前为止,您的代码中最大的问题是黑体辐照度计算的数值问题。

      一词
      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常数(涉及普朗克常数,光速和玻尔兹曼常数),你可能已预先计算好了(我没有检查数值。我 知道单位的选择会弄乱这些,所以更好的检查)。

    4. 所以,除了愚蠢的括号错误外,我怀疑主要问题是你只是忘了将λ重新缩放到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()