- Apply function to each element of array - MATLAB arrayfun (mathworks.com)
- Apply function to each cell in cell array - MATLAB cellfun (mathworks.com)
- Plot graph nodes and edges - MATLAB plot (mathworks.com)
- Anonymous Functions - MATLAB & Simulink (mathworks.com)
How do I use the matrix elements, all of which are functions of lambda, to obtain R(lambda)? I get an error when I try to use the matrix elements to get R(lambda).)
4 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
If we let M be a 2x2 matrix with matrix elements M1, M2, M3, and M4, all of which are dependent on lambda, I cannot seem to use the matrix elements to plot R(lambda) vs lambda. M1, M2, M3, and M4 do get displayed in the command window, but I get an error when I try to use them to obtain R(lambda).
Soure code:
lambda_0 = 0.980; % Cavity length of DBR mirror in micron
d_G = 0.06975562993; % Thickness of GaAs layer in micron
d_A = 0.08148984639; % Thickness of AlAs layer in micron
n_G0 = 3.512261308; % GaAs index of refraction at 980 nm
n_A0 = 3.006509533; % AlAs index of refraction at 980 nm
lambda = 0.9:0.01:1.1; % Wavelength range in micron
n_G = @(lambda) sqrt(10.906+(0.97501./(lambda.^2-(0.52886)^2))-... % Index of refraction of GaAs as a function of wavelength
0.002467.*lambda.^2);
n_A = @(lambda) sqrt(7.986+(0.97501./(lambda.^2-(0.19886)^2))-... % Index of refraction of AlAs as a function of wavelength
0.0059457.*lambda.^2);
M_G = @(lambda) [cos((2*pi*d_G.*n_G(lambda))./lambda),... % Characteristic 2x2 Matrix of GaAs
(-i./n_G(lambda)).*sin((2*pi*d_G.*n_G(lambda))./lambda);...
-(i.*n_G(lambda)).*sin((2*pi*d_G.*n_G(lambda))./lambda),...
cos((2*pi*d_G.*n_G(lambda))./lambda)];
M_A = @(lambda) [cos((2*pi*d_A.*n_A(lambda))./lambda),... % Characteristic 2x2 Matrix of AlAs
(-i./n_A(lambda)).*sin((2*pi*d_A.*n_A(lambda))./lambda);...
-(i.*n_A(lambda)).*sin((2*pi*d_A.*n_A(lambda))./lambda),...
cos((2*pi*d_A.*n_A(lambda))./lambda)];
syms lambda
M = @(lambda) (M_G(lambda)*M_A(lambda))^32; % Characteristic matrix of DBR mirror consisting of
% 32 pairs of AlAs/GaAs layers
tmp=num2cell(M(lambda));
[M1,M2,M3,M4]=deal(tmp{:})
syms lambda
M1 = @(lambda) M1;
M2 = @(lambda) M2;
M3 = @(lambda) M3;
M4 = @(lambda) M4;
R = @(lambda) (M2(lambda)./M1(lambda)).^2; % Reflection coefficient of DBR mirror as a function of
% wavelength
figure(1)
plot(lambda,R(lambda),'k'),xlabel('Wavelength (um)'),ylabel('Reflection Coefficient')
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1039075/image.png)
0 Kommentare
Antworten (1)
Karan Singh
am 3 Okt. 2023
Hi Craig,
From what I understand, the goal is plot the parameters as “M1”, “M2”, “M3”, and “M4”, as they do get displayed in the command window, but you get an error when I try to use them to obtain "R(lambda)”.
The error you're encountering occurs because the “plot” function expects numeric data for the x and y axes. In your case, “lambda” is defined as a symbolic variable, and “R(lambda)” is a symbolic expression. To resolve this issue, you need to convert the symbolic expressions to numeric values before plotting.
Here's an updated version of your code that should work correctly:
lambda_0 = 0.980;
d_G = 0.06975562993;
d_A = 0.08148984639;
n_G0 = 3.512261308;
n_A0 = 3.006509533;
lambda = 0.9:0.01:1.1;
n_G = @(lambda) sqrt(10.906+(0.97501./(lambda.^2-(0.52886)^2))-0.002467.*lambda.^2);
n_A = @(lambda) sqrt(7.986+(0.97501./(lambda.^2-(0.19886)^2))-0.0059457.*lambda.^2);
M_G = @(lambda) [cos((2*pi*d_G.*n_G(lambda))./lambda), (-1i./n_G(lambda)).*sin((2*pi*d_G.*n_G(lambda))./lambda);...
-(1i.*n_G(lambda)).*sin((2*pi*d_G.*n_G(lambda))./lambda), cos((2*pi*d_G.*n_G(lambda))./lambda)];
M_A = @(lambda) [cos((2*pi*d_A.*n_A(lambda))./lambda), (-1i./n_A(lambda)).*sin((2*pi*d_A.*n_A(lambda))./lambda);...
-(1i.*n_A(lambda)).*sin((2*pi*d_A.*n_A(lambda))./lambda), cos((2*pi*d_A.*n_A(lambda))./lambda)];
M = @(lambda) M_G(lambda)*M_A(lambda);
M_values = arrayfun(@(l) M(l), lambda, 'UniformOutput', false);
M1 = cellfun(@(m) m(1, 1), M_values);
M2 = cellfun(@(m) m(1, 2), M_values);
R = @(lambda) (M2./M1).^2;
figure(1)
plot(lambda, R(lambda), 'k')
xlabel('Wavelength (um)')
ylabel('Reflection Coefficient')
In this updated code, I've used “arrayfun” to evaluate the symbolic expressions “M(l)” for each value in the “lambda” array. Then, I used “cellfun” to extract the specific elements “M1” and “M2” from the cell array “M_values”. Finally, the “R(lambda)” calculation and plotting should work without errors.
Attached below are some documentation links that you may find helpful:
Hope this helps!
Karan Singh Khati
0 Kommentare
Siehe auch
Kategorien
Mehr zu Descriptive Statistics and Visualization finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!