How to use spherical Hankel fumction to obtain sphere scatter
4 views (last 30 days)
Show older comments
c=3e8;
f=6e9;
n=10;
i=1:n;
Wl=c/f;
k=(2*pi)/Wl;
radius=1e-2:1e-4:6e-2;
r=length(radius);
kr=k*radius;
X=radius/Wl;
Ae=zeros(1,r);
syms nu x
J=sqrt(pi/(2*x)).*besselj(nu+0.5,x);
Y=sqrt(pi./(2*x)).*bessely(nu+0.5,x);
H=J-1j*Y;
dH=diff(H);
ht=H.*dH;
nu=i;x=kr;
B=eval(ht);
A(i,:)=(abs(((-1^i)*(2*i+1))./(B)).^2)./(4*pi);
Ae(1,:)=A(i,:)+Ae(1,:);
figure(1);
plot(X,Ae);
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/1419128/image.png)
0 Comments
Answers (1)
Aakash
on 26 Jun 2023
The error in your code arises from the fact that the variable nu is a symbolic variable defined using syms, while x is a numeric array (kr). The besselj function requires both inputs to have the same size or one to be a scalar.
To fix this, you can use a for loop to evaluate the expression for each value of i and radius like this:
c = 3e8;
f = 6e9;
n = 10;
i = 1:n;
Wl = c / f;
k = (2 * pi) / Wl;
radius = 1e-2:1e-4:6e-2;
r = length(radius);
kr = k * radius;
X = radius / Wl;
Ae = zeros(1, r);
for i = 1:n
B = zeros(1, r);
for j = 1:r
x = kr(j);
H = besselj(i, x) - 1j * bessely(i, x);
dH = (1/2) * (besselj(i-1, x) - besselj(i+1, x) - 1j * (bessely(i-1, x) - bessely(i+1, x)));
ht = H * dH
B(j) = subs(ht, x, kr(j))
end
A = (abs(((-1)^i) * (2 * i + 1) ./ B).^2) / (4 * pi);
Ae = A + Ae;
end
figure(1);
plot(X, Ae);
1 Comment
Dyuman Joshi
on 26 Jun 2023
There's no point of using subs(), as there is no symbolic expression or function in the code.
Also, you can define H and dH as function handles, and calling them for each iteration and directly substituting input values.
Another good practice is to not use i and j as loop indices, especially when you will be using any or both of them as the imaginary constant.
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!