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
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]
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}
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")]}]
shows the same problem, even with proper units. But if you adjust the lowest wavelength to 100 nm, then you get this: