Skip to main content
3 of 3
added 442 characters in body
Jason B.
  • 70.2k
  • 3
  • 144
  • 298

I don't know if you can call this a bug, but it seems buggy to me. Let's take a look at the data that is actually being plotted, which you can extract using a Reap and Sow combination (thanks to @user21 for showing me this trick)

Reap[LogLogPlot[Sow[{λ, Bλ[TEarth, λ]}]; 
     Bλ[TEarth, λ], {λ, λL, λH}, 
     Frame -> True]][[2, 1, ;; 20]] // TableForm

enter image description here

That would seem to be the big glaring problem, right there, that point of {x,f[x]} = {-18.4207, 1.83338*10^-17}. But I'm not actually convinced, I think that is a red herring, because you get the same x value if you replace Bλ[TEarth, λ] with λ^2.

About the only thing we do learn from that table is that Mathematica doesn't seem to have a problem with really small numbers.

This is apparently one of those cases where you need to use Evaluate in the argument to Plot,

GraphicsRow[{
  LogLogPlot[
   Bλ[TEarth, λ], {λ, λL, λH},
    Frame -> True],
  LogLogPlot[
   Evaluate@
    Bλ[
     TEarth, λ], {λ, λL, λH}, 
   Frame -> True]
  }, ImageSize -> 700]

enter image description here

This is a simple workaround that you can use all the time without drawback.

Working Precision giving crazy results

It was suggested to check out the results of using WorkingPrecision on the plot, so look at this mess:

LogLogPlot[
   Bλ[TEarth, λ], {λ, λL, λH},
    Frame -> True, PlotRange -> All, WorkingPrecision -> #, 
   ImageSize -> 300] & /@ {MachinePrecision/2, MachinePrecision, 
  2 MachinePrecision, $MachinePrecision}

enter image description here

The only setting that was even close to correct was the default setting. It seems the only real answer here is to wrap the function with Evaluate before plotting.

Edit Here is my original answer below, which I'm leaving in only because it shows off the version 10 function PlanckRadiationLaw, which is a little slow for sure.

@J.M. made the point of using nanometers instead of meters, and my first thought was to use atomic units instead of SI units, but you still run into the same problem when taking a LogLog plot.

Your code is just fine, but I thought I'd show off a version 10 function here,

LogLogPlot[{
  QuantityMagnitude[
   PlanckRadiationLaw[Quantity[5778, "Kelvins"], 
    Quantity[x, "Nanometers"]]],
  QuantityMagnitude[
   PlanckRadiationLaw[Quantity[255, "Kelvins"], 
    Quantity[x, "Nanometers"]]]}
 , {x, 10, 10^6}, 
 AxesLabel -> {Quantity[None, "Nanometers"], 
   Quantity[None, "Watts"/("Hertz"*"Meters"^2*"Steradians")]}]

enter image description here

shows the same problem, even with proper units. But if you adjust the lowest wavelength to 100 nm, then you get this:

enter image description here

Jason B.
  • 70.2k
  • 3
  • 144
  • 298