Yet, if I evaluate the function at 1e-8 I get basically zero
SoI don't know if you are takingcan call this a bug, but it seems buggy to me. Let's take a look at the log of zero? The fact isdata that ifis actually being plotted, which you go high enough in frequencycan extract using a Reap
and Sow
combination (low enough in wavelengththanks to @user21 for showing me this trick) then
Reap[LogLogPlot[Sow[{λ, Bλ[TEarth, λ]}];
Bλ[TEarth, λ], {λ, λL, λH},
Frame -> True]][[2, 1, ;; 20]] // TableForm
That would seem to be the radiation level goesbig 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 zero regardlesshave a problem with really small numbers.
This is apparently one of those cases where you need to use Evaluate
in the units involvedargument 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.
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.
The answer is to adjust your x-axis range, no reason to go all the way down to 10 nanometers, 100 nanometers is as low as most every plot goes.
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: