LimSup LimInf
Let be a bounded sequence.
i) The limit superior of is defined by
ii) The limit inferior of is defined by
Let be a bounded sequence and let .
Then
if and only if for every the following conditions are satisfied:
i) It holds that for almost all (i.e., all except finitely many) .
ii) It holds that for infinitely many .
How to use the applet
-
Use the slider to choose the tail .
-
Use the slider to change the thickness of the -neighborhoods around (pink) and (blue).
-
The red circle marks (computed over the displayed tail).
-
The blue circle marks (computed over the displayed tail).
-
The dashed horizontal lines are the levels (pink) and (blue).
-
The dashed bands show (pink) and (blue).
-
Points with are faded (they are “discarded” when looking at the tail).
-
Orange points are exceptions:
- above , or
- below . For a correct limit statement, you should be able to choose so that there are only finitely many such exceptions.
-
Pink points are “witnesses” that the sequence comes arbitrarily close from below to :
- Blue points are “witnesses” that the sequence comes arbitrarily close from above to :
Suggested exploration
- Fix a small (e.g. ) and increase .
Observe: orange points eventually disappear. - Keep large and shrink .
Observe: you still get infinitely many pink/blue witness points near the corresponding dashed level.
Technical Description
Reference: Lecture Notes Calculus 1 ( May22,2022 ) Theorem 2.16 page 28
For this example, I have selected the alternating sequence
to provide a clear distinction between and .
To clarify the first definition, the student can adjust the value of in and using the slider.
The current values of and are highlighted by
circles with corresponding colors: red for the limsup and blue for the liminf.
In code tyheir are calculated as:
const getSupData = () => {
const k_curr = Math.floor(kSlider.Value());
let maxVal = -Infinity; let maxIndex = k_curr;
for (let n = k_curr; n <= MAX_K; n++) {
const val = values[n - 1];
if (val >= maxVal) { maxVal = val; maxIndex = n; }
}
return { index: maxIndex, val: maxVal };
};
const getInfData = () => {
const k_curr = Math.floor(kSlider.Value());
let minVal = Infinity; let minIndex = k_curr;
for (let n = k_curr; n <= MAX_K; n++) {
const val = values[n - 1];
if (val <= minVal) { minVal = val; minIndex = n; }
}
return { index: minIndex, val: minVal };
};
Both and are marked by dashed lines in their respective colors.
An illustration of the theorem is provided by allowing the student to move
the corresponding -slider for each of the limits.
For instance, in the case of the , the points below , are those finetely many to discharge and highlighted in orange, while the infinetely many points above share the same limit color.
for (let n = 1; n <= MAX_K; n++) {
board.create('point', [n, values[n - 1]], {
...DEFAULT_POINT_ATTRIBUTES,
name: '',
size: 1,
strokeColor: COLORS.black,
strokeWidth: 1,
fixed: true,
fillColor: () => {
const k = kSlider.Value();
const val = values[n - 1];
if (n < k) return COLORS.lightGray;
const epsSup = getEpsSup();
const epsInf = getEpsInf();
// "Almost all n are < Sup + eps" -> Exception if > Sup + eps
if (val > TRUE_SUP + epsSup) return COLORS.orange;
// "Almost all n are > Inf - eps" -> Exception if < Inf - eps
if (val < TRUE_INF - epsInf) return COLORS.orange;
// "Infinitely many n > Sup - eps" -> Witness if inside Sup tube
if (val > TRUE_SUP - epsSup) return COLORS.pink;
// "Infinitely many n < Inf + eps" -> Witness if inside Inf tube
if (val < TRUE_INF + epsInf) return COLORS.blue;
return COLORS.black;
},
strokeOpacity: () => n < kSlider.Value() ? 0.3 : 1
});
}