I have a function that reads:
f[P_?NumericQ,
Ob_?NumericQ] := -Sqrt[P/Ob^2 + Sqrt[P^2 + Ob^2 w^2]/Ob^2] Tan[
Sqrt[-(P/Ob^2) + Sqrt[P^2 + Ob^2 w^2]/Ob^2]] +
Sqrt[-(P/Ob^2) + Sqrt[P^2 + Ob^2 w^2]/Ob^2]
Tanh[Sqrt[P/Ob^2 + Sqrt[P^2 + Ob^2 w^2]/Ob^2]]
For each pair of numerical values of P and Ob, there are infinitely many solutions for w (denoted as w0, w1, w2, w3, ...).
I want to write a concise code that does the following:
- Loops over values of Ob from 0 to 1.
- For each value of Ob, finds a critical value of P (Pcr) that makes the ratio of w2/w1 approximately equal to 3 (with reasonable tolerance).
- Stores or outputs these critical values of P for each Ob. I tried but couldn't come up with a successful one. Thanks for any help in advance.
Below is one of my trials:
Remove["Global`*"];
tolerance = 0.05;
results = {};
For[ObValue = 0.01, ObValue <= 1, ObValue += 0.01,
For[P = 0.01, P <= 1, P += 0.01,(*Add a loop for P values*)
roots = NSolve[f[P, ObValue] == 0 && 0 < w < 20, w, Reals];
If[Length[roots] > 1, w1 = w /. roots[[1]];
w2 = w /. roots[[2]];
Pcr = FindRoot[Abs[w2/w1 - 3] <= tolerance, {P, .1}];
If[NumberQ[P /. Pcr], AppendTo[results, {ObValue, P /. Pcr}];
Break[];] (*Exit P loop if critical value found*)];];];
results
P
is never assigned a numerical value in your loop, soNSolve
cannot work with it. You should assign it a value just like you do withObValue
. $\endgroup$Abs[w2/w1-3]
is just a number and does not depend onP
, so you cannot "solve for P" any more. Your problem is quite complex, so you may want to break it down into smaller pieces, or try asking on the math forum for advice instead. $\endgroup$