Filter löschen
Filter löschen

Solving non-linear equation with besselj

2 Ansichten (letzte 30 Tage)
Ozan Erturk
Ozan Erturk am 3 Jan. 2022
Bearbeitet: Walter Roberson am 5 Jan. 2022
Hello,
I am trying to solve this equation below and hope to get a closed form so I can plot it. I understand that due to the periodic nature of Bessel functions, "solve" does not work and I can actually get results using vpasolve with good guesses; or simply use a graphic method manually to make sure the solution coincides with the first root of the Bessel. However, I suspect there is a way to get symbolic solution using solve so it spits out a closed form rather than a number if I only restrict solutions to the first zero of the besselj I use. Is this possible?
Thank you for your input!
syms f
assume (f > 1e6)
r=20e-6;
n=2;
E=28e9;
rho=8095;
sigma=0.22;
w=2*pi*f;
zeta=r*sqrt(2*rho*w.^2.*(1+sigma)/E);
q=zeta.^2./(2*n^2-2);
xi=sqrt(2/(1-sigma));
eqn=(Psi_2(zeta/xi)-2-q )*(2*Psi_2(zeta)-2-q) == (n*q-n)^2 ; %Equation I want to solve with only 1st root of Bessel function
f=1e-6*solve(eqn,f);
% Definition of Psi_2 function
function f = Psi_2(theta)
f=theta.*besselj(1,theta)./besselj(2,theta);
end

Akzeptierte Antwort

Walter Roberson
Walter Roberson am 3 Jan. 2022
I would very much doubt you can find a symbolic solution. You are trying to solve
49379500000000 * besselj(2, 1/35000000000*98759^(1/2)*14^(1/2)*Z*pi) * ...
besselJ(1,1/350000000000*39^(1/2)*98759^(1/2)*14^(1/2)*Z*pi) * ...
39^(1/2)*98759^(1/2)*14^(1/2)*pi^2*Z^2 + ...
987590000000000 * besselj(1, 1/35000000000*98759^(1/2)*14^(1/2)*Z*pi) * ...
besselj(2, 1/350000000000*39^(1/2)*98759^(1/2)*14^(1/2)*Z*pi) * ...
98759^(1/2)*14^(1/2)*pi^2*Z^2 + ...
9753340081 * besselj(2, 1/35000000000*98759^(1/2)*14^(1/2)*Z*pi) * ...
besselj(2,1/350000000000*39^(1/2)*98759^(1/2)*14^(1/2)*Z*pi) * pi^3*Z^3 - ...
20739390000000000000000000 * besselj(1, 1/35000000000*98759^(1/2)*14^(1/2)*Z*pi) * ...
besselj(1, 1/350000000000*39^(1/2)*98759^(1/2)*14^(1/2)*Z*pi) * 39^(1/2)*pi*Z + ...
525000000000000000000000000000 * besselj(2, 1/35000000000*98759^(1/2)*14^(1/2)*Z*pi) * ...
besselj(1, 1/350000000000*39^(1/2)*98759^(1/2)*14^(1/2)*Z*pi) * 39^(1/2)*98759^(1/2)*14^(1/2) + ...
10500000000000000000000000000000 * besselj(1, 1/35000000000*98759^(1/2)*14^(1/2)*Z*pi) * ...
besselj(2, 1/350000000000*39^(1/2)*98759^(1/2)*14^(1/2)*Z*pi) * 98759^(1/2)*14^(1/2) - ...
207393900000000000000000000 * besselj(2, 1/35000000000*98759^(1/2)*14^(1/2)*Z*pi) * ...
besselj(2, 1/350000000000*39^(1/2)*98759^(1/2)*14^(1/2)*Z*pi)*pi*Z
for the set of values of Z such that the expression becomes 0.
That is not just a single zero of a bessel function: there are 12 BesselJ functions there. And there is no symbolic solution to zeros of even a single BesselJ .
  5 Kommentare
Walter Roberson
Walter Roberson am 4 Jan. 2022
Bearbeitet: Walter Roberson am 5 Jan. 2022
The below has to do with the solution. If you take lhs(eqn)-rhs(eqn) and solve() that for f, using a better symbolic package, then you get a RootOf() for quite similar to what I posted first -- a function of _Z such that the function must equal 0 at _Z, and _Z is then the frequency, f, at which the equation holds true.
If you remove the RootOf() level and plot just the internal part, the part that needs to become 0, then the places where it does become 0 are the solutions. 0 is the flat horizontal plane in the image, so there are solutions everwhere the curve intersects the flat plane.
So the smaller the r, the higher the lowest frequency of solution. With high enough r, the solutions start coming in pretty close (e.g., as r approaches 1, solutions down to f = 600-ish appear.)
This is to be expected: the besselJ calls end up having f*r in them, so if you were to create a new variable FR = f*r then you get to a 1D equation. If you know a solution for one f*r value then you can predict the solution for a different r by inverse proportions.
Ozan Erturk
Ozan Erturk am 5 Jan. 2022
Although I am not sure, I think I understand the problem, and your suggestion. I implemented it and called a variable "zeta" which has both f and r. This was the original function without any f and r substitutions in fact. However, I don't think solve can still handle this. Do I need to modify "solve" ? or any other symbolic solver in matlab that I don't know about maybe?
syms zeta positive
n=2;
sigma=0.22; %Poisson's ratio
q=zeta^2/(2*n^2-2);
xi=sqrt(2/(1-sigma));
eqn=(Psi_2(zeta/xi)-2-q )*(2*Psi_2(zeta)-2-q) == (n*q-n)^2 ;
zeta=solve(eqn,zeta)
Warning: Unable to find explicit solution. For options, see help.
zeta = Empty sym: 0-by-1
function f = Psi_2(theta)
f=theta.*besselj(1,theta)./besselj(2,theta);
end

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Community Treasure Hunt

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

Start Hunting!

Translated by