0
$\begingroup$

I have the following 3x3 matrix

M = {{-I*ω + Γ/2, I*g1, 
0}, {I*g1, -I*ω + κ1/2, I*g2}, {0, 
I*g2, -I*ω + κ2/2}};

Finding the eigenvalues and eigenvectors

vals = Eigenvalues[M, Cubics -> True];
vecs = Simplify[
Eigenvectors[M /. Complex[0, -1] -> mi, Cubics -> True] /. 
mi -> -I];

All of this is to diagonalize the initial M matrix

P = Transpose[{vecs[[1]], vecs[[2]], vecs[[3]]}];
Dmat = DiagonalMatrix[{Sqrt[Γ], Sqrt[κ1], 
Sqrt[κ2]}];
Diag = DiagonalMatrix[vals];

Check if the diagonalization works. This should give the zero matrix

Inverse[P].M.P - Diag // Simplify

Define the new matrix Modemat taking certain fixed values for the parameters

Modemat = 
Inverse[Diag].Inverse[P].Dmat /. {Γ -> 
 0.01, κ1 -> 1, κ2 -> 20, g2 -> 10};

Recall that now, the matrix elements of Modemat are dependent on ω and g1. Defining the following functions from the matrix elements of Modemat

M11[ω11_, g11_] := 
Modemat[[1, 1]] /. {ω -> ω11, g1 -> g11};
M12[ω12_, g12_] := 
Modemat[[1, 2]] /. {ω -> ω12, g1 -> g12};
M13[ω13_, g13_] := 
Modemat[[1, 3]] /. {ω -> ω13, g1 -> g13};

fsbb[ω_, g1_] := 
300*Abs[M11[ω, g1]]^2 + 0.1*Abs[M12[ω, g1]]^2 + 
0.1*Abs[M13[ω, g1]]^2;

Now I'm interested in finding the area under the curve of fsbb against ω

poptab = Table[{cc1, 
1/(2 π)*
NIntegrate[
 Evaluate[(fsbb[ω, g1]) /. {g1 -> Sqrt[cc1*1*0.01]/
     2}], {ω, -40, 40}]}, {cc1, 0.001, 10^5, 10}]

Here's where the problem lies, upon computing poptab, I was returned with warnings that says Numerical Integration converging too slowly; suspect one of the following: singularity, value of the integration is 0....

And also "NIntegrate failed to converge to prescribed accuracy after 7 \ recursive bisections in ω near {ω} = {0.60181878}. \ NIntegrate obtained 8.5216538.*^-6 and 7.08893718.*^-6 for the \ integral and "

I've Googled with dealing precision issues and tried something like

poptab = Table[{cc1, 
1/(2 π)*
NIntegrate[
 Evaluate[(fsbb[ω, g1]) /. {g1 -> Sqrt[cc1*1*0.01]/
     2}], {ω, -40, 40}, MaxRecursion -> 7, 
 WorkingPrecision -> 8]}, {cc1, 0.001, 10^5, 10}]

But it didn't help and the warnings remain. I know it's just a warning and not an error but it directly affects the NIntegrate function since it spits out different integration values if I tweak around with the MaxRecursion option for the same parameters. I could really use some help troubleshooting this.

Thank you in advance.

$\endgroup$
3
  • $\begingroup$ Please reduce the post to a minimal example. The first half of it is not about NIntegrate at all. $\endgroup$ Commented Aug 4, 2018 at 22:31
  • $\begingroup$ Using working precision less than machine precision is only a good idea for educational/didactic purposes. $\endgroup$ Commented Aug 5, 2018 at 0:35
  • $\begingroup$ Might you want to integrate from -Infinity to Infinity? $\endgroup$
    – Michael E2
    Commented Aug 5, 2018 at 2:08

2 Answers 2

1
$\begingroup$

Using the even symmetry of the integrand & compiling:

cf = Compile[{ω, cc1}, Evaluate[(fsbb[ω, g1]) /. {g1 -> Sqrt[cc1*1*0.01]/2}]];
obj[ω_?NumericQ, cc1_?NumericQ] := cf[ω, cc1];
cftab = Table[{cc1, 
     2 *
      1/(2 π) * NIntegrate[obj[ω, cc1], {ω, 0, 40}, 
       Method -> {Automatic, "SymbolicProcessing" -> 0}]},
    {cc1, 0.001, 10^5, 10}]; // AbsoluteTiming
(*  {6.10675, Null}  *)

It's slightly faster if the integrals are meant to be over the whole real line and {-40, 40} was an approximation:

cf = Compile[{ω, cc1}, Evaluate[(fsbb[ω, g1]) /. {g1 -> Sqrt[cc1*1*0.01]/2}]];
obj[ω_?NumericQ, cc1_?NumericQ] := cf[ω, cc1];
cftab2 = Table[{cc1, 
     2 *
      1/(2 π) * NIntegrate[obj[ω, cc1], {ω, 0, Infinity}, 
       Method -> {Automatic, "SymbolicProcessing" -> 0}]},
    {cc1, 0.001, 10^5, 10}]; // AbsoluteTiming
(* {5.54248, Null}  *)
$\endgroup$
0
$\begingroup$

The following is computed fast enough. Only NIntegrate::slwcon messages are issued. Are the results something you expect/like?

AbsoluteTiming[
 poptab = 
   Table[{cc1, 
     1/(2 Pi)*
      NIntegrate[
       Evaluate[(fsbb[\[Omega], g1]) /. {g1 -> 
           Sqrt[cc1*1*0.01]/2}], {\[Omega], -40, 40}, 
       MaxRecursion -> 100, PrecisionGoal -> 3, AccuracyGoal -> 4, 
       Method -> {Automatic, "SymbolicProcessing" -> 0}]}, {cc1, 0.001, 10^5, 10}];
 ]

(* {61.8293, Null} *)
$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.