Error Plotting a Multi-variable Function with Respect to a Single Variable.

11 ビュー (過去 30 日間)
Jack  Gallahan
Jack Gallahan 2018 年 11 月 28 日
コメント済み: Jack Gallahan 2018 年 11 月 29 日
I have created the following five functions (the fourth contains two internal functions):
function M = actomic_form_factor(N_i, L_i, M_i, N_f, L_f, M_f, lambda, scattering_angle)
k = 2.*pi/lambda;
f = @(r, theta, phi) wave_function_product(N_i, L_i, M_i, N_f, L_f, M_f, r, theta, phi).* plane_wave_factor(k, k, theta, phi, scattering_angle, r);
M = integral3(f,0,Inf,0,pi,0,2*pi,'AbsTol',1e-5,'RelTol',1e-5);
end
function t = plane_wave_factor(k_i, k_f, theta, phi, scattering_angle, r)
t = exp(1i.*dot(k_i, k_f, theta, phi, scattering_angle, r));
end
function p = wave_function_product(n_i, l_i, m_i, n_f, l_f, m_f, r, theta, phi)
p = hydrogenic_wave_function(n_i, l_i, m_i, r, theta, phi).* ...
conj(hydrogenic_wave_function(n_f, l_f, m_f, r, theta, phi));
end
function psi = hydrogenic_wave_function(n, l, m, r, theta, phi)
a = 1; % Bohr radius in m
% angular part (Condon-Shortley)
SphericalYlm = @(l, m, theta, phi) (-1)^m * sqrt((2 * l + 1) / (4 * pi) * ...
factorial(l - abs(m)) / factorial(l + abs(m))) * ...
AssociatedLegendre(l, m, cos(theta)) .* exp(1i * m * phi);
% radial part
R = @(n, l, r) sqrt((2 / (a * n))^3 * factorial(n - l - 1) / (2 * n * factorial(n + l))) .* ...
exp(-r / (a * n)) .* (2 * r / (a * n)).^l * 1 / factorial(n - l - 1 + 2 * l + 1) .* ...
AssociatedLaguerre(n - l - 1, 2 * l + 1, 2 * r / (a * n));
% wave function
psi = R(n, l, r) .* SphericalYlm(l, m, theta, phi);
% functions
function Anm = AssociatedLaguerre(n,m,x)
Anm = 0;
for i = 0 : n
Anm = Anm + factorial(m + n) * nchoosek(m + n, n - i) / factorial(i) * (-x).^i;
end
end
function Alm = AssociatedLegendre(l,m,x)
Alm = 0;
for h = 0 : floor(1/2 * l - 1/2 * abs(m))
Alm = Alm + (-1)^h * nchoosek(l - 2 * h, abs(m)) * nchoosek(l, h) * ...
nchoosek(2 * l - 2 * h, l) * x.^(l - 2 * h - abs(m));
end
Alm = (1 - x.^2).^(abs(m) / 2) .* (factorial(abs(m)) / 2^l * Alm);
end
end
function dot = dot(k_i, k_f, theta, phi, scattering_angle, r)
a = k_f.*r.*sin(scattering_angle).*sin(theta).*sin(phi);
b = (k_i - k_f.*cos(scattering_angle)).*r.*cos(theta);
dot = -(a + b);
end
I need to plot atomic_form_factor(N_i, L_i, M_i, N_f, L_f, M_f, lambda, scattering_angle) with respect to scattering angle (y axis = atomic_form_factor, x axis = scattering_angle) while holding the other inputs at specific constant values. I have tried inputing the follwing code into the command line:
x = 0:2*pi/100:2*pi;
y = atomic_form_factor(1, 0, 0, 1, 0, 0, 10000, x);
plot(x,y)
I recieve the error:
Error using .*
Matrix dimensions must agree.
Error in dot (line 7)
a = k_f.*r.*sin(scattering_angle).*sin(theta).*sin(phi);
Could someone tell me how I can fix this problem? Thank you in advance.

採用された回答

Torsten
Torsten 2018 年 11 月 29 日
x = 0:2*pi/100:2*pi;
for i=1:numel(x)
y(i) = actomic_form_factor(1, 0, 0, 1, 0, 0, 10000, x(i));
end
plot(x,y)

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeCreating and Concatenating Matrices についてさらに検索

Community Treasure Hunt

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

Start Hunting!

Translated by