Borrar filtros
Borrar filtros

how to fix this code in calling function

2 visualizaciones (últimos 30 días)
zina shadidi
zina shadidi el 12 de Nov. de 2020
Respondida: Walter Roberson el 12 de Nov. de 2020
%% Call the transfer matrix R, T, A calculator function and build spectra
%%%may be need to % Convert angle to radians
[n1]=xlsread('SiO2_n_k.xlsx');
[n2]=xlsread('TiO2_n_k.xlsx');
L= 20;
i=1:L;
A = n1(i,2); %%%%% SiO2 refractive coefficient
B = n2(i,2); %%%%% TiO2 refractive coefficient
l=n2(i,1); %%%% wavelength
% Preallocate memory
R = zeros(1,L);
T = zeros(1,L);
A = zeros(1,L);
for m = 1:L
% Reflection and transmission coefficients, r, t, not used, so
% replace output with ~. Can add back in if needed.
% [r(m),t(m),R(m),T(m),A(m)]=jreftran_rt(wl(m),d,n(m,:),t0,polarization);
% full form of jreftran_rt
[r,t,R,T,A]=reftran_rt(l,[NaN,100,500,2000],[1,B,A,1.5],t0,polarization)
end
figure
plot(l,R);
figure
plot(l,A)
%%%%%%%%%%%%%%%% the function
function [r,t,R,T,A]=reftran_rt(l,d,n,t0,polarization)
%l = free space wavelength, nm
%d = layer thickness vector, nm
%n = layer complex refractive index vector
%t0= angle of incidence
%polarization should be 0 for TE (s-polarized), otherwise TM (p-polarized)
Z0=376.730313; %impedance of free space, Ohms
%the line below had mistakenly been a Z0/n instead of a n/Z0 in version 1!
Y=n./Z0; %admittance in terms of impedance of free space and refractive index, assuming non-magnetic media
g=1i*2*pi*n/l; %propagation constant in terms of free space wavelength and refractive index
%all of the calculations rely on cosine of the complex angle, but we can
%only find the sine of the complex angle from snells law. So we use the
%fact that cos(asin(x))=sqrt(1-x^2)
%t=asin(n(1)./n*sin(t0)), complex theta for each layer
ct=sqrt(1-(n(1)./n*sin(t0)).^2); %cosine theta
if polarization==0
eta=Y.*ct; %tilted admittance, TE case
else
eta=Y./ct; %tilted admittance, TM case
end
delta=1i*g.*d.*ct;
M=zeros(2,2,length(d));
for j=1:length(d)
M(1,1,j)=cos(delta(j));
M(1,2,j)=1i./eta(j).*sin(delta(j));
M(2,1,j)=1i*eta(j).*sin(delta(j));
M(2,2,j)=cos(delta(j));
end
M_t=[1,0;0,1]; %M total
for j=2:(length(d)-1)
M_t=M_t*M(:,:,j);
end
r=(eta(1)*(M_t(1,1)+M_t(1,2)*eta(end))-(M_t(2,1)+M_t(2,2)*eta(end)))/(eta(1)*(M_t(1,1)+M_t(1,2)*eta(end))+(M_t(2,1)+M_t(2,2)*eta(end)));
t=2*eta(1)/(eta(1)*(M_t(1,1)+M_t(1,2)*eta(end))+(M_t(2,1)+M_t(2,2)*eta(end)));
R=abs(r)^2;
T=real(eta(end)/eta(1))*abs(t)^2;
A=(4*eta(1)*real((M_t(1,1)+M_t(1,2)*eta(end))*conj(M_t(2,1)+M_t(2,2)*eta(end))-eta(end)))/abs(eta(1)*(M_t(1,1)+M_t(1,2)*eta(end))+(M_t(2,1)+M_t(2,2)*eta(end)))^2;
end
  2 comentarios
Walter Roberson
Walter Roberson el 12 de Nov. de 2020
you did not post your data and you did not indicate which line the error is on.
zina shadidi
zina shadidi el 12 de Nov. de 2020
Editada: Walter Roberson el 12 de Nov. de 2020
thank you Walter Roberson for your responce
My data was
n1= [400 3.2861 0
410 3.2248 0
420 3.1856 0
430 3.1624 0
440 3.1494 0
450 3.1405 0
460 3.1300 0
470 3.1041 0
480 3.0800 0
490 3.0538 0
500 3.0300 0
510 3.0138 0
520 3 0
530 2.9850 0
540 2.9700 0
550 2.9544 0
560 2.9400 0
570 2.9294 0
580 2.9200 0
590 2.9100 0
600 2.9000 0
610 2.8894 0
620 2.8800 0
630 2.8750 0
640 2.8700 0
650 2.8600 0
660 2.8500 0
670 2.8444 0
680 2.8400 0
690 2.8350 0
700 2.8300 0
710 2.8250 0
720 2.8200 0
730 2.8144 0
740 2.8100 0
750 2.8100 0
760 2.8100 0
770 2.8056 0];
n2 = [400 1.4701 0
410 1.4691 0
420 1.4681 0
430 1.4672 0
440 1.4663 0
450 1.4656 0
460 1.4648 0
470 1.4641 0
480 1.4635 0
490 1.4629 0
500 1.4623 0
510 1.4618 0
520 1.4613 0
530 1.4608 0
540 1.4603 0
550 1.4599 0
560 1.4595 0
570 1.4591 0
580 1.4587 0
590 1.4584 0
600 1.4580 0
610 1.4577 0
620 1.4574 0
630 1.4571 0
640 1.4568 0
650 1.4565 0
660 1.4563 0
670 1.4560 0
680 1.4558 0
690 1.4555 0
700 1.4553 0
710 1.4551 0
720 1.4549 0
730 1.4546 0
740 1.4544 0
750 1.4542 0]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
and the error was
Error using horzcat
Dimensions of arrays being concatenated are not consistent.
Error in Untitled2 (line 22)
[r,t,R,T,A]=reftran_rt(l,[NaN,100,500,2000],[1,B,A,1.5],t0,polarization)

Iniciar sesión para comentar.

Respuesta aceptada

Walter Roberson
Walter Roberson el 12 de Nov. de 2020
i=1:L;
That is a vector.
A = n1(i,2); %%%%% SiO2 refractive coefficient
B = n2(i,2); %%%%% TiO2 refractive coefficient
You are indexing a 2D array with a vector of i values. The results in A and B is going to be a column vector of length L.
A = zeros(1,L);
You throw away everything you wrote into A, and replace it with a row vector of length L. not a column vector.
[r,t,R,T,A]=reftran_rt(l,[NaN,100,500,2000],[1,B,A,1.5],t0,polarization)
In the sub-expression [1,B,A,1.5], the 1 is a scalar. In order for [] (horzcat) to work, everything after that 1 in the [] has to have one row. However, your B is a column vector of length L. Your A is a row vector of length L, so the A,1.5 part is okay, but the column B cannot go there.
If somehow B did fit, such as if you had transposed B into a row vector earlier, then the term would be a vector of length 1 + L + L + 1 = 2*L+2 . Are you sure that is appropriate?
I was going to say that you do the same calculation for every iteration of the for m loop, but then I noticed that you are updating A and it is the updated A that is going back into the next iteration, so potentially that is reasonable.
... But I can't help but think that what you really want is
[r,t,R,T,A(m)]=reftran_rt(l,[NaN,100,500,2000],[1,B(m),A(m),1.5],t0,polarization);

Más respuestas (0)

Categorías

Más información sobre Particle & Nuclear Physics en Help Center y File Exchange.

Productos


Versión

R2018b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by