Pairing of solar and lunar factors

A number of the Earth’s geophysical behaviors characterized by cycles have both a solar and lunar basis. For the ubiquitous ocean tides, the magnitude of each factor are roughly the same — rationalized by the fact that even though the sun is much more massive than the moon, it’s much further away.

However, there are several behaviors that even though they have a clear solar forcing, lack a lunar counterpart. These include the Earth’s fast wobble, the equatorial SAO/QBO, ENSO, and others. The following table summarizes how these gaps in causation are closed, with the missing lunar explanation bolded. Unless otherwise noted by a link, the detailed analysis is found in the text Mathematical Geoenergy.

Geophysical BehaviorSolar ForcingLunar Forcing
Conventional Ocean TidesSolar diurnal tide (S1), solar semidiurnal (S2)Lunar diurnal tide (O1), lunar semidiurnal (M2),
Length of Day (LOD) VariationsAnnual, semi-annualMonthly, fortnightly, 9-day, weekly
Long-Period TidesSolar annual variations (Sa), solar semi-annual (Ssa)Fortnightly (Mf), monthly (Mm, Msm), mixed harmonics
Chandler WobbleAnnual wobble 433 day cycle caused by draconic stroboscopic effect
Quasi-Biennial Oscillation (QBO)Semi-Annual Oscillation (SAO) above QBO in altitude28-month caused by draconic stroboscopic effect
El Niño–Southern Oscillation (ENSO)Seasonal impulse acts as carrier and spring unpredictability barrierErratic cycling caused by draconic + other tidal factors per stroboscopic effect
Eclipse eventsSun-Moon alignment (draconic cycle critical)Sun-Moon alignment (draconic cycle critical)
Other Climate Indices and MSLStrong annual modulation and triggerSimilar to ENSO, see https://github.com/pukpr/GEM-LTE
Milankovitch CyclesEccentricity, obliquity, and precessionAxial drift in precessional cycle
Regression of nodes (nutation)Controlled +/- about the Earth-Sun ecliptic planeDraconic & tropical define an 18.6 year beat in nodal crossings
Atmospheric ringingDaily atmospheric tidesFortnightly modulation
https://geoenergymath.com/the-just-so-story-narrative/
Seasonal ClimateAnnual tilted orbit around the sun
Daily ClimateEarth’s rotation rate
Anthropogenic Global Warming
Seismic Activity(sporadic stochastic trigger)(sporadic stochastic trigger)
Geomagnetic, Geothermal, etc??

The most familiar periodic factors – the daily and seasonal cycles – being primarily radiative processes obviously have no lunar counterpart.

And climate science itself is currently preoccupied with the prospect of anthropogenic global warming/climate change, which has little connection to the sun or moon, so the significance of the connections shown is largely muted by louder voices.


References:

  • Mathematical Geoenergy, 2019 (in BOLD)
  • Cartwright & Edden, Tidal Generation studies
  • Various oceanography & geodesy literature

The perplexing Chandler wobble

I had heard that Perplexity was an LLM geared to scientific research, so I gave it this prompt:

Explain the Chandler wobble as due to a stroboscopic driving force emerging from the nonlinear modulation of an impulsed annual signal with the periodic declination torque of the lunar draconic cycle operating as a wavenumber=0 group symmetry.

The Chandler wobble can be viewed as a stroboscopically forced precession mode of Earth’s rotation, driven by a nonlinear interaction between an annually pulsed excitation and the lunar draconic (nodal) tide, with the effective forcing emerging in the band of the 433‑day free wobble. [1,2,3]

The behavioral characteristics include a cycle and damping:

  • The Chandler wobble is a free nutation of Earth’s rotation axis with a period of about 433 days and amplitude of order 0.05–0.2 arcsec, slightly different from the 305‑day Euler period because Earth is elastic and has oceans and a fluid core. [3,6,7]
  • In the absence of forcing, this mode would decay on a timescale of decades, so it must be continuously re‑excited by some geophysical process (mass redistribution in oceans/atmosphere, etc.). [3,4,5]

An annual impulsive forcing also generates an annual wobble. Think of the annual cycle as supplying near‑impulsive changes in the effective torque that can couple into polar motion, because seasonal mass shifts and circulation changes are strongest at certain times of year (e.g., around solstices). [1,3,5]

In a simplified model, this is approximated as an annual train of impulses in the excitation function of the polar motion equation rather than a smooth sinusoid. [1,2]

An impulse train has a flat, comb‑like spectrum: it projects power into many sidebands around any underlying carrier frequency it modulates. When that carrier is the lunar draconic tide, the sidebands can “step” into the Chandler band by aliasing and nonlinear mixing. [1,2]

The draconic (nodal) tide acts as a modulator to force sub-band cycles on the annual carrier. The lunar draconic cycle (node–to–node motion of the Moon’s orbit relative to the equatorial plane) produces a strong, periodic variation in declination and thus in the latitude pattern of tidal torque on Earth.  The relevant subharmonic here is the draconic fortnight (≈13.606 days), which governs how the lunar tidal bulge migrates north–south. [1]

If you take that relatively high frequency draconic signal and modulate it with a biannual or annual envelope tied to the solar geometry (solstice alignment of Sun–Moon–Earth), you get an amplitude‑modulated carrier. In Fourier terms, that modulation splits the draconic line into a comb of spectral lines spaced by ± n × (1 yr) around the original frequency. [1,2]

Because Earth’s free Chandler frequency sits far below the raw draconic frequency, you don’t resonate with the carrier itself; instead you hit the Chandler band through an aliasing condition: one of those sidebands (carrier ± k×annual) falls extremely close to the Chandler frequency (≈0.843 cycles/yr), so energy is pumped efficiently into the wobble. [1,2]

There’s a stroboscopic viewpoint to aid in understanding. From a stroboscope’s perspective, the annual (or twice‑annual) sampling by the Sun–Earth geometry “views” the draconic torque at almost, but not exactly, the same phase each year.  This is analogous to watching a fast‑spinning wheel under a flashing light: if the flash frequency is close but not equal to the spin frequency, you see a slow apparent beat motion. The slow beat corresponds here to the Chandler period, and the flashing is the annually pulsed excitation. [1,2]

Mathematically, the product of a fast oscillation (draconic tide) and an impulsive annual envelope produces cross‑terms whose effective frequency is the difference between the draconic and integer multiples of the annual frequency. One of these difference frequencies lands in the Chandler band, so in the rotating‑frame equations for polar motion it appears as a nearly resonant, narrowband forcing. [1,2,3]

Concerning the Wavenumber = 0 group symmetry: Polar motion is effectively a global (degree‑1, order‑1 in spherical harmonics) displacement of Earth’s rotation axis with respect to its figure; the Chandler mode is a normal mode of the whole body. [5,6,7]

The particular draconic–annual interaction you describe can be interpreted as exciting the azimuthally symmetric part of the torque pattern—no preferred longitude, just a latitude‑dependent load—which in spectral language is a wavenumber‑0 (axisymmetric) component in Earth’s rotating frame. [1,6]

Calling it a “wavenumber=0 group symmetry” is a way of saying: after averaging over the fast draconic and diurnal phases, what survives is the group‑velocity‑scale envelope of the forcing, which is spatially uniform in longitude and thus couples efficiently to the global Chandler eigenmode while filtering out higher‑wavenumber patterns that would average to zero. [1,6,7]

So in compact form: the Chandler wobble emerges as a resonant response of Earth’s free polar mode to a stroboscopically generated, axisymmetric forcing produced by nonlinear mixing of an annually impulsed excitation with the lunar draconic tide, whose aliased sideband falls at the Chandler frequency. [1,2,3]

(continuation prompt)

What mathematical formula derives the 433-day period from draconic aliasing?

You can get the 433‑day Chandler period as a beat (alias) period between the draconic fortnightly tide and the annual cycle by using the standard aliasing / beat‑frequency relation in frequency space. [1,2,3]

1. Set up the frequencies.  Let

Draconic fortnight period (half draconic month)
T_{d} = 27.2122/2 \approx 13.6061 days. [1,2]

Annual period
T_{y} = 365.242] days. [1,4]

Convert to frequencies (in cycles per day):

f_d = \frac{1}{T_d},   f_y = \frac{1}{T_y}

Numerically, [1,2]

f_d  = \frac{1}{13.60611} =  0.0735 c/d,   f_y = \frac{1}{365.2421} = 0.0027379 c/d.

2. Alias (beat) with annual sampling is when you modulate or impulsively sample the draconic signal annually, sidebands appear at

f = |f_d - n f_y|,  n = 1, 2, 3,  . . .

The effective long period seen in the slowly varying envelope (the alias period) is

T_\text{alias} = \frac{1}{|f_d - n f_y|}

Choose integer [n] such that T_{\text{alias}} lands near 433 days. In the GeoEnergy Math formulation this corresponds to the harmonic that comes out closest to the Chandler band, giving

T_\text{alias} = 432.77 \text{days} = 1.185 \text{years},

which matches the observed Chandler wobble period. [1,2,3]

So, in words: the mathematical formula is the beat‑period relation

T_{\text{alias}} = 1 / |f_{d} - n f_{y}|,

with f_{d} from the 13.606‑day draconic fortnight and f_{y} from the annual cycle, and for the appropriate harmonic (n) this evaluates to ≈ 433 days. [1,2,3]

Refs

  1. https://geoenergymath.com/2017/03/04/the-chandler-wobble-challenge/
  2. https://geoenergymath.com/2017/05/21/the-lunar-geophysical-connection/
  3. https://esd.copernicus.org/preprints/esd-2020-74/esd-2020-74-AC5.pdf
  4. https://en.wikipedia.org/wiki/Chandler_wobble
  5. http://landmarks.allenbrowne.info/LatitudeObservatory/ChandlerWobble.htm
  6. https://legacy.iho.int/iho_pubs/CB/C-33/C-33_maree_simon_en.pdf
  7. https://www.technologyreview.com/2009/08/31/265599/earths-chandler-wobble-changed-dramatically-in-2005/


So, it basically summarized easily available sources from the internet, mainly from what I had written before.

Minnesota ICE-OUT update

This is an update to analyzing the dates of Minnesota lakes ice-out events, as described on this blog years ago: Ice Out

The trend has been that dates have been creeping earlier, corresponding to warmer winters.

Scatter plot showing the relationship between the year and the number of ice-out days in Minnesota at latitude 43 N, with a fitted trend line indicating a slight decreasing slope.
Scatter plot showing ice-out days in Minnesota at latitude 44 N over the years from 1840 to 2040, with a trend line indicating a slight decline.
Scatter plot showing the trend of ice out days per year in Minnesota (Latitude: 45 N) from 1860 to 2020. The fitted line indicates a slight downward trend, with the y-axis representing ice out days and the x-axis representing years.
Scatter plot showing ice out days per year from 1880 to 2023 in Minnesota, with a fitted regression line indicating a slight downward trend.
Scatter plot showing the trend of ice out day data over the years in Minnesota at latitude 47 N, with a fitted slope indicating a decrease in days per year, represented by red circles and a blue trend line.
Scatter plot showing the relationship between year and ice-out day for Minnesota at latitude 48 N, with fitted regression line indicating a negative slope.

This is all automated, pulled from JSON data residing on a Minnesota DNR server. I hadn’t looked at it for a while, as the original client query assumed that the JSON was in strict order, but the response changed to random and only recently have I updated. The same approach used is to access lake data from common latitudes and do a least-squares regression on each set. The software is described here and available here, based on a larger AI project described here.

User interface displaying a form for plotting data from 1843 to 2025 with a specified latitude of 44.0, accompanied by options to clear data and submit the request.

There are seven anomalous data points1 that point to ice-out dates prior to January, which may in fact be faulty data, but are kept in place because they won’t change the slopes too much

Summary

2013 slopes2026 slopes
43 N-0.066-0.1042
44 N-0.047-0.08595
45 N-0.068-0.10873
46 N-0.0377-0.0416
47 N-0.0943-0.04138
48 N-0.1995-0.0835

The overall average is around -0.08 days earlier per year which amounts to 8 days earlier ice-out over 100 years.

The last “year without a winter” in Minnesota was 1877-1878 which corresponded to a huge global El Nino. One can perhaps see this in the 44 N and 45 N plots showing early outliers but the data was sparse back then. More obvious is the short winter of 2023-2024, where many lakes never froze or one close to my place was really only solid for a time in December. Can look up news stories on this such as the following

2024: The Brainerd Jaycees Ice Fishing Extravaganza on Gull Lake—one of the world's largest—was canceled for the first time in its 34-year history because the ice was too thin to support the event.

Footnotes

  1. The following lakes showed anomalous ice-out dates, assumed to be late in the previous year or late in the current year, the latter which would be physically impossible
    Lake Cotton @ 46.88259 N (11/23/2010 [day -39.0]))
    Lake Leek (Trowbridge) @ 46.68309 N (12/07/2021 [day -25.0]))
    Lake Little Wabana @ 47.40002 N (12/08/2021 [day -24.0]))
    Lake Star @ 45.06337 N (11/20/2022 [day -42.0]))
    Lake Lewis @ 45.7479 N (11/28/2022 [day -34.0]))
    Lake Unnamed @ 44.81299 N (11/25/2023 [day -37.0]))
    Lake Unnamed @ 44.81299 N (11/26/2024 [day -36.0])) ↩︎

Hidden latent manifolds in fluid dynamics

The behavior of complex systems, particularly in fluid dynamics, is traditionally described by high-dimensional systems of equations like the Navier-Stokes equations. While providing practical applications as is, these models can obscure the underlying, simplified mechanisms at play. It is notable that ocean modeling already incorporates dimensionality reduction built in, such as through Laplace’s Tidal Equations (LTE), which is a reduced-order formulation of the Navier-Stokes equations. Furthermore, the topological containment of phenomena like ENSO and QBO within the equatorial toroid , and the ability to further reduce LTE in this confined topology as described in the context of our text Mathematical Geoenergy underscore the inherent low-dimensional nature of dominant geophysical processes. The concept of hidden latent manifolds posits that the true, observed dynamics of a system do not occupy the entire high-dimensional phase space, but rather evolve on a much lower-dimensional geometric structure—a manifold layer—where the system’s effective degrees of freedom reside. This may also help explain the seeming paradox of the inverse energy cascade, whereby order in fluid structures seems to maintain as the waves become progressively larger, as nonlinear interactions accumulate energy transferring from smaller scales.

Discovering these latent structures from noisy, observational data is the central challenge in state-of-the-art fluid dynamics. Enter the Sparse Identification of Nonlinear Dynamics (SINDy) algorithm, pioneered by Brunton et al. . SINDy is an equation-discovery framework designed to identify a sparse set of nonlinear terms that describe the evolution of the system on this low-dimensional manifold. Instead of testing all possible combinations of basis functions, SINDy uses a penalized regression technique (like LASSO) to enforce sparsity, effectively winnowing down the possibilities to find the most parsimonious, yet physically meaningful, governing differential equations. The result is a simple, interpretable model that captures the essential physics—the fingerprint of the latent manifold. The SINDy concept is not that difficult an algorithm to apply as a decent Python library is available for use, and I have evaluated it as described here.

Applying this methodology to Earth system dynamics, particularly the seemingly noisy, erratic, and perhaps chaotic time series of sea-level variation and climate index variability, reveals profound simplicity beneath the complexity. The high-dimensional output of climate models or raw observations can be projected onto a model framework driven by remarkably few physical processes. Specifically, as shown in analysis targeting the structure of these time series, the dynamics can be cross-validated by the interaction of two fundamental drivers: a forced gravitational tide and an annual impulse.

The presence of the forced gravitational tide accounts for the regular, high-frequency, and predictable components of the dynamics. The annual impulse, meanwhile, serves as the seasonal forcing function, representing the integrated effect of large-scale thermal and atmospheric cycles that reset annually. The success of this sparse, two-component model—where the interaction of these two elements is sufficient to capture the observed dynamics—serves as the ultimate validation of the latent manifold concept. The gravitational tides with the integrated annual impulse are the discovered, low-dimensional degrees of freedom, and the ability of their coupled solution to successfully cross-validate to the observed, high-fidelity dynamics confirms that the complex, high-dimensional reality of sea-level and climate variability emerges from this simple, sparse, and interpretable set of latent governing principles. This provides a powerful, physics-constrained approach to prediction and understanding, moving beyond descriptive models toward true dynamical discovery.

An entire set of cross-validated models is available for evluation here: https://pukpr.github.io/examples/mlr/.

This is a mix of climate indices (the 1st 20) and numbered coastal sea-level stations obtained from https://psmsl.org/

https://pukpr.github.io/examples/map_index.html

  • nino34 — NINO34 (PACIFIC)
  • nino4 — NINO4 (PACIFIC)
  • amo — AMO (ATLANTIC)
  • ao — AO (ARCTIC)
  • denison — Ft Denison (PACIFIC)
  • iod — IOD (INDIAN)
  • iodw — IOD West (INDIAN)
  • iode — IOD East (INDIAN)
  • nao — NAO (ATLANTIC)
  • tna — TNA Tropical N. Atlantic (ATLANTIC)
  • tsa — TSA Tropical S. Atlantic (ATLANTIC)
  • qbo30 — QBO 30 Equatorial (WORLD)
  • darwin — Darwin SOI (PACIFIC)
  • emi — EMI ENSO Modoki Index (PACIFIC)
  • ic3tsfc — ic3tsfc (Reconstruction) (PACIFIC)
  • m6 — M6, Atlantic Nino (ATLANTIC)
  • m4 — M4, N. Pacific Gyre Oscillation (PACIFIC)
  • pdo — PDO (PACIFIC)
  • nino3 — NINO3 (PACIFIC)
  • nino12 — NINO12 (PACIFIC)
  • 1 — BREST (FRANCE)
  • 10 — SAN FRANCISCO (UNITED STATES)
  • 11 — WARNEMUNDE 2 (GERMANY)
  • 14 — HELSINKI (FINLAND)
  • 41 — POTI (GEORGIA)
  • 65 — SYDNEY, FORT DENISON (AUSTRALIA)
  • 76 — AARHUS (DENMARK)
  • 78 — STOCKHOLM (SWEDEN)
  • 111 — FREMANTLE (AUSTRALIA)
  • 127 — SEATTLE (UNITED STATES)
  • 155 — HONOLULU (UNITED STATES)
  • 161 — GALVESTON II, PIER 21, TX (UNITED STATES)
  • 163 — BALBOA (PANAMA)
  • 183 — PORTLAND (MAINE) (UNITED STATES)
  • 196 — SYDNEY, FORT DENISON 2 (AUSTRALIA)
  • 202 — NEWLYN (UNITED KINGDOM)
  • 225 — KETCHIKAN (UNITED STATES)
  • 229 — KEMI (FINLAND)
  • 234 — CHARLESTON I (UNITED STATES)
  • 245 — LOS ANGELES (UNITED STATES)
  • 246 — PENSACOLA (UNITED STATES)

Crucially, this analysis does not use the SINDy algorithm, but a much more basic multiple linear regression (MLR) algorithm predecessor, which I anticipate being adapted to SINDy as the model is further refined. Part of the rationale for doing this is to maintain a deep understanding of the mathematics, as well as providing cross-checking and thus avoiding the perils of over-fitting, which is the bane of neural network models.

Also read this intro level on tidal modeling, which may form the fundamental foundation for the latent manifold: https://pukpr.github.io/examples/warne_intro.html. The coastal station at Wardemunde in Germany along the Baltic sea provided a long unbroken interval of sea-level readings which was used to calibrate the hidden latent manifold that in turn served as a starting point for all the other models. Not every model works as well as the majority — see Pensacola for a sea-level site and and IOD or TNA for climate indices, but these are equally valuable for understanding limitations (and providing a sanity check against an accidental degeneracy in the model fitting process) . The use of SINDy in the future will provide additional functionality such as regularization that will find an optimal common-mode latent layer,.

amo.dat.p

AMO trained on region outside of dashed line, so that’s the cross-validated region, using Descent optimized LTE annual time-series, Python

python3 ts_lte.py amo.dat –cc –plot –low 1930 –high 1960

using the following JSON parameters file

amo.dat.p

{
  "Aliased": [
    0.422362756,
    0.38861749700000003,
    0.23562139699999995,
    0.259019747,
    0.33201584700000003,
    0.165274488,
    0.262765007,
    0.385761106,
    0.07374525999999999,
    0.215992198,
    0.192246939,
    0.528757205,
    0.112996099,
    0.03714361,
    0.10034691,
    0.07660165,
    0.501613596,
    2.0,
    1.0
  ],
  "AliasedAmp": [
    0.03557922624939592,
    0.09988731513671248,
    0.07106292426402241,
    0.1202147059011645,
    -0.16310647366824904,
    -0.21099766009700224,
    0.3178250739779875,
    -0.034763054040409205,
    -0.26973831298426476,
    -0.13417117453373803,
    0.33741450649520405,
    0.14844747522132112,
    0.38176481941684715,
    -0.24512757533159843,
    0.17007002069621968,
    -0.3175673142831867,
    -0.0801663078936891,
    0.0410641305028224,
    0.15648561320675802
  ],
  "AliasedPhase": [
    12.907437383830702,
    9.791011963532627,
    20.894959747239227,
    11.230932614457465,
    24.106215317177334,
    14.921596063027563,
    11.928445369162157,
    14.76066439534825,
    9.307516552468496,
    6.238399781667854,
    4.78878496205605,
    19.328424226102666,
    4.1510957254818255,
    24.986414787848002,
    3.764292351659264,
    7.899565162852414,
    10.701455186458222,
    6.575719630634085,
    4.603123916071089
  ],
  "DeltaTime": 7.217156366226141e-06,
  "Hold": 0.001560890374528988,
  "Imp_Amp": 36.03147961053978,
  "Imp_Stride": 1,
  "Initial": 0.023119471463386495,
  "LTE_Amp": 1.2149052076222568,
  "LTE_Freq": 232.0780473685175,
  "LTE_Phase": -1.98155204056087,
  "Periods": [
    27.2122,
    27.3216,
    27.564500000000002,
    13.63339513,
    13.69114014,
    13.5961,
    13.6708,
    13.72877789,
    6795.015773000002,
    1616.2951719999999,
    2120.013852999989,
    13.78725,
    3232.690344000001,
    9.142931547,
    9.108450374,
    9.120674533,
    27.0926041
  ],
  "PeriodsAmp": [
    0.22791356815287772,
    0.03599719419115529,
    0.18676833431961723,
    0.03956128728097599,
    -0.2649706920257545,
    0.10022074474351093,
    0.10436992221139457,
    0.14430534046016136,
    0.07102249228279979,
    0.11758452315976271,
    0.04510213195702457,
    0.06361160068822835,
    0.05674788795284906,
    -0.043657524764462274,
    0.07791151774412787,
    0.019631216465477552,
    -0.14009026634971397
  ],
  "PeriodsPhase": [
    13.451016651034463,
    7.371101643819357,
    18.44011357432109,
    6.802030606034782,
    21.120997888353294,
    9.616514380782336,
    5.715489866748063,
    10.809731364754402,
    9.031554832315345,
    7.401459819968337,
    5.9383444499771105,
    14.60402121854254,
    5.541215399062276,
    8.44043335583645,
    1.6019323722385819,
    7.500513005887212,
    7.860442540394975
  ],
  "Year": 365.2520198,
  "final_state": {
    "D_prev": 0.04294
  }
}

Primary 27.2122 > 27.5545 > 27.3216 > others

{
  "Aliased": [
    "0.0537449",
    "0.1074898",
    "0.220485143",
    "0.5",
    "1",
    "2"
  ],
  "AliasedAmp": [
    -0.27685696043001307,
    0.16964990314670372,
    0.11895402824503996,
    -0.22535505798739713,
    -0.14980527635880514,
    0.039162442368949016
  ],
  "AliasedPhase": [
    8.086868082389797,
    6.5259913891848225,
    6.976139887075208,
    0.73810967841759,
    -0.7194832011130626,
    8.565521480562625
  ],
  "DC": -0.2680318100166013,
  "DeltaTime": 3.339861667887925,
  "Hold": 0.0014930905734095634,
  "Imp_Amp": 199.01398139940682,
  "Imp_Amp2": -0.5731191105049073,
  "Imp_Stride": 8,
  "Initial": 0.06704092573627028,
  "LTE_Amp": 1.3767200538799589,
  "LTE_Freq": 125.32556941298645,
  "LTE_Phase": 0.7307737940808291,
  "LTE_Zero": 1.4258992716041372,
  "Periods": [
    "27.2122",
    "27.3216",
    "27.5545",
    "13.63339513",
    "13.69114014",
    "13.6061",
    "13.6608",
    "13.71877789",
    "6795.985773",
    "1616.215172",
    "2120.513853",
    "13.77725",
    "3232.430344",
    "9.132931547",
    "9.108450374",
    "9.120674533",
    "27.0926041",
    "3397.992886",
    "9.095011909",
    "9.082856397",
    "6.809866946",
    "2190.530426",
    "6.816697567",
    "6.823541904",
    "1656.572278"
  ],
  "PeriodsAmp": [
    0.30508787370803825,
    0.13110586375848174,
    0.20288728084656027,
    -0.04672659187556317,
    -0.004826158765318568,
    -0.035033863263707915,
    -0.0368824777486948,
    0.03511304770515584,
    0.011720764708907096,
    -0.004694584574980881,
    0.029609791456868918,
    0.039125743540538716,
    -0.007414683923403197,
    0.00010802542017018773,
    -0.018330796222247217,
    -0.006001961724770963,
    -0.03735314717727939,
    -0.004108234580768664,
    0.011857949379825367,
    0.01479879984548296,
    0.02390111774094945,
    -0.039440470787466424,
    -0.032966674657844246,
    -0.030591610040324502,
    0.013039117473425073
  ],
  "PeriodsPhase": [
    14.569679572272141,
    8.743347618608817,
    6.063986820806294,
    4.382376561017971,
    9.81395082674981,
    5.545094399669723,
    7.378109970639206,
    3.912962970116576,
    7.840782183776614,
    4.988264989477043,
    5.697804841039319,
    7.455439074616485,
    2.972944156135133,
    4.7630843491223365,
    6.317733397950582,
    7.279885606476663,
    3.8917494187283728,
    5.801812295837,
    6.975196465036293,
    6.128620153406749,
    4.95108326060857,
    4.307377590535454,
    5.8886081102774535,
    4.9456215506967265,
    4.232011434810574
  ],
  "Year": "365.2495755"
}

Alternate Julia fitting routine

Warnemunde, DE tidal station

https://docs.google.com/spreadsheets/d/1HysiqoPN-j1M2lTLUpQaGZPAxvJIesFrJMBoYJyWA5I/edit?usp=sharing


started from Warnemunde SLH model fit

Name Value
—- —–
ALIGN 0
EXTRA 0
FORCING 0
MAX_ITERS 50
RELATIVE 1
STEP 0.05

PS C:\Users\paul\github\pukpr\python\simple\run0> cat .\amo.dat.p
{
“Aliased”: [
“0.0537449”,
“0.1074898”,
“0.220485143”,
“0.5”,
“1”,
“2”
],
“AliasedAmp”: [
-0.12182091549739567,
0.25801568818215476,
0.09920867308439774,
-0.1737322618819654,
-0.07529335982382553,
0.052057481476465634
],
“AliasedPhase”: [
4.921761286209268,
5.7618887121423965,
7.487588835004665,
0.8600259809362271,
0.01213560781160881,
7.655542996972892
],
“DC”: -0.008758390763317466,
“Damp”: -0.022154904178658865,
“DeltaTime”: “3.416666667”,
“Hold”: 0.0014873352555352655,
“Imp_Amp”: 190.5449378494113,
“Imp_Amp2”: 1.466945315006192,
“Imp_Stride”: 7,
“Initial”: 0.060016503798714434,
“LTE_Amp”: 1.587179814234174,
“LTE_Freq”: 125.53536829233441,
“LTE_Phase”: 1.2439579952989555,
“LTE_Zero”: 0.896474895660982,
“Periods”: [
“27.2122”,
“27.3216”,
“27.5545”,
“13.63339513”,
“13.69114014”,
“13.6061”,
“13.6608”,
“13.71877789”,
“6795.985773”,
“1616.215172”,
“2120.513853”,
“13.77725”,
“3232.430344”,
“9.132931547”,
“9.108450374”,
“9.120674533”,
“27.0926041”,
“3397.992886”,
“9.095011909”,
“9.082856397”,
“6.809866946”,
“2190.530426”,
“6.816697567”,
“6.823541904”,
“1656.572278”
],
“PeriodsAmp”: [
0.27470885437689657,
0.12275502752316671,
0.08957207441483245,
-0.016351843276285773,
-0.0023253487734064167,
-0.027825652713169724,
-0.03622467995377892,
0.03745364586195977,
0.016931934821747943,
-0.007763938392135198,
0.001227009837326124,
-0.025790386622741152,
-0.008565987883641879,
0.00014664749664687222,
-0.01704107349960909,
-0.00797921907994325,
-0.03177647026752983,
-0.004956872049734769,
0.007932726074580026,
0.014516028377323971,
-0.021088964802417443,
-0.020789594142410307,
-0.0394312191315924,
-0.04134814573194381,
0.016270585503279013
],
“PeriodsPhase”: [
14.531794321199,
9.047644816654925,
6.2513288041048165,
4.835012524578427,
8.2937810112731,
5.467748908147056,
8.57387165414261,
4.054729761879573,
7.943122954685947,
8.951903685571338,
2.710382136770864,
8.02559427189266,
3.2041095507982096,
5.942537145429701,
5.976976092641082,
7.506337445154253,
5.347578022677064,
8.017917628086881,
5.8570430281895804,
6.547489676521564,
4.764028618408168,
4.06142922152038,
6.49245321390355,
4.201452643286066,
6.210242390637271
],
“Year”: “365.2495755”
}
PS C:\Users\paul\github\pukpr\python\simple\run0>

amo.dat.p

compare to warnemunde reference, warne.dat.p

{
“Aliased”: [
“0.0537449”,
“0.1074898”,
“0.220485143”,
“0.5”,
“1”,
“2”
],
“AliasedAmp”: [
-0.4042092506880945,
0.1498026647936091,
0.34974191131892546,
-0.06275860364797245,
-0.12693112051883154,
0.05360693094611856
],
“AliasedPhase”: [
5.022341284265671,
6.12724416388633,
5.10501755051668,
1.3489606861498495,
0.1576762764662913,
6.305517708416614
],
“DC”: -0.008758390763317466,
“Damp”: -0.004169125923760335,
“DeltaTime”: “3.416666667”,
“Hold”: 0.001492802207237816,
“Imp_Amp”: 197.45336102884804,
“Imp_Amp2”: 1.8841384082886352,
“Imp_Stride”: 8,
“Initial”: 0.06797642598445004,
“LTE_Amp”: 1.1234722131058268,
“LTE_Freq”: 129.45433340867712,
“LTE_Phase”: 0.9136521644032515,
“LTE_Zero”: 1.4732244756410906,
“Periods”: [
“27.2122”,
“27.3216”,
“27.5545”,
“13.63339513”,
“13.69114014”,
“13.6061”,
“13.6608”,
“13.71877789”,
“6795.985773”,
“1616.215172”,
“2120.513853”,
“13.77725”,
“3232.430344”,
“9.132931547”,
“9.108450374”,
“9.120674533”,
“27.0926041”,
“3397.992886”,
“9.095011909”,
“9.082856397”,
“6.809866946”,
“2190.530426”,
“6.816697567”,
“6.823541904”,
“1656.572278”
],
“PeriodsAmp”: [
0.2969846885625734,
0.12715090239433,
0.11195966030804025,
-0.014279802990919828,
-0.007476472864580455,
-0.027618411935182365,
-0.0314800276468536,
0.01803389223741826,
0.011163663341122482,
-0.0012907337497222084,
0.010385914775159287,
-0.024140665704639786,
-0.0024596839864129026,
0.00027007377126487056,
-0.014632061204798591,
-0.005915227697593744,
-0.04415788786521701,
-0.0030602495341499583,
0.009422574691039923,
0.013666201034033513,
-0.011874548174887829,
-0.01644029616663989,
-0.027183125961912056,
-0.01849393725550493,
0.0035426632273613356
],
“PeriodsPhase”: [
14.521637612309751,
8.824373362823483,
6.120768972631713,
5.031389621562438,
7.68019623052033,
5.535148594183447,
7.8408960747147844,
3.7085965346643084,
7.8128946785721185,
5.8037304389860065,
5.996864724827583,
8.12109584535951,
2.86102851568745,
6.520420198470608,
5.568571652192804,
7.4330567654835455,
4.544814917547044,
6.625719182549832,
7.045017606299215,
6.1446045083619385,
6.171838481758574,
4.209559209227534,
6.043091099560879,
4.664388204620863,
5.099462955240412
],
“Year”: “365.2495755”
}

warne.dat.p

AMO LTE

“LTE_Amp”: 1.587179814234174,
“LTE_Freq”: 125.53536829233441,
“LTE_Phase”: 1.2439579952989555,
“LTE_Zero”: 0.896474895660982,

Warne LTE

“LTE_Amp”: 1.1234722131058268,
“LTE_Freq”: 129.45433340867712,
“LTE_Phase”: 0.9136521644032515,
“LTE_Zero”: 1.4732244756410906,

AMO Warnemunde

Simpler models … alternate interval

continued from last post.

The last set of cross-validation results are based on training of held-out data for intervals outside of 0.6-0.8 (i.e. training on t<0.6 and t>0.8 of the data, which extends from t=0.0 to t=1.0 normalized). This post considers training on intervals outside of 0.3-0.6 — a narrower training interval and correspondingly wider test interval.

Stockholm, Sweden
Korsor, Denmark
Klaipeda, Lithuania
Continue reading

Simpler models … examples

continued from last post.

Each fitted model result shows the cross-validation results based on training of held-out data — i.e. training on only the intervals outside of 0.6-0.8 (i.e. training on t<0.6 and t>0.8 of the data, which extends from t=0.0 to t=1.0 normalized). The best results are for time-series that have 100 years or more worth of monthly data, so the held-out data is typically 20 years. There is no selection bias trickery here, as this is a collection of independent sites and nothing in the MLR fitting process is specific to an individual time-series. In the following, the collection of results starts with the Stockholm site in Sweden, keeping in mind that the dashed line in the charts indicates the test or validation interval.

I was recently in Stockholm, and this is a photo pointed toward the location of the measurement station, about 4000 feet away labeled by the marker on the right below:
Stockholm, Sweden
Korsor, Denmark
Klaipeda, Lithuania
Continue reading

Simpler models can outperform deep learning at climate prediction

This article in MIT News:

https://news.mit.edu/2025/simpler-models-can-outperform-deep-learning-climate-prediction-0826

“New research shows the natural variability in climate data can cause AI models to struggle at predicting local temperature and rainfall.” … “While deep learning has become increasingly popular for emulation, few studies have explored whether these models perform better than tried-and-true approaches. The MIT researchers performed such a study. They compared a traditional technique called linear pattern scaling (LPS) with a deep-learning model using a common benchmark dataset for evaluating climate emulators. Their results showed that LPS outperformed deep-learning models on predicting nearly all parameters they tested, including temperature and precipitation.

Machine learning and other AI approaches such as symbolic regression will figure out that natural climate variability can be done using multiple linear regression (MLR) with cross-validation (CV), which is an outgrowth or extension of linear pattern scaling (LPS).

https://pukpr.github.io/results/image_results.html

When this was initially created on 9/1/2025, there were 3000 CV results on time-series
that averaged around 100 years (~1200 monthly readings/set) so over 3 million data points

In this NINO34 (ENSO) model, the test CV interval is shown as a dashed region

I developed this github model repository to make it easy to compare many different data sets, much better than using an image repository such as ImageShack.

There are about 130 sea-level height monitoring stations in the sites, which is relevant considering how much natural climate variation a la ENSO has an impact on monthly mean SLH measurements. See this paper Observing ENSO-modulated tides from space

“In this paper, we successfully quantify the influences of ENSO on tides from multi-satellite altimeters through a revised harmonic analysis (RHA) model which directly builds ENSO forcing into the basic functions of CHA. To eliminate mathematical artifacts caused by over-fitting, Lasso regularization is applied in the RHA model to replace widely-used ordinary least squares. “

Mathematical GeoEnergy 2018 vs ChatGPT 2025

On RealClimate.org

Paul Pukite (@whut) says

1 JUL 2025 AT 9:48 PM

Your comment is awaiting moderation.

“If so, do you have an explanation why the diurnal tides do not move the thermocline, whereas tides with longer periods do?”

The character of ENSO is that it shifts by varying amounts on an annual basis. Like any thermocline interface, it reaches the greatest metastability at a specific time of the year. I’m not making anything up here — the frequency spectrum of ENSO (pick any index NINO4, NINO34, NINO3) shows a well-defined mirror symmetry about the value 0.5/yr. Given that Incontrovertible observation, something is mixing with the annual impulse — and the only plausible candidate is a tidal force.
So the average force of the tides at this point is the important factor to consider. Given a very sharp annual impulse, the near daily tides alias against the monthly tides — that’s all part of mathematics of orbital cycles. So just pick the monthly tides as it’s convenient to deal with and is a more plausible match to a longer inertial push.

Sunspots are not a candidate here.

Some say wind is a candidate. Can’t be because wind actually lags the thermocline motion.

So the deal is, I can input the above as a prompt to ChatGPT and see what it responds with

https://chatgpt.com/share/68649088-5c48-8010-a767-4fe75ddfeffc

Chat GPT also produces a short Python script which generates the periodogram of expected spectral peaks.

I placed the results into a GitHub Gist here, with charts:
https://gist.github.com/pukpr/498dba4e518b35d78a8553e5f6ef8114

I made one change to the script (multiplying each tidal factor by its frequency to indicate its inertial potential, see the ## comment)

At the end of the Gist, I placed a representative power spectrum for the actual NINO4 and NINO34 data sets showing where the spectral peaks match. They all match. More positions match if you consider a biennial modulation as well.

Now, you might be saying — yes, but this all ChatGPT and I am likely coercing the output. Nothing of the sort. Like I said, I did the original work years ago and it was formally published as Mathematical Geoenergy (Wiley, 2018). This was long before LLMs such as ChatGPT came into prominence. ChatGPT is simply recreating the logical explanation that I had previously published. It is simply applying known signal processing techniques that are generic across all scientific and engineering domains and presenting what one would expect to observe.

In this case, it carries none of the baggage of climate science in terms of “you can’t do that, because that’s not the way things are done here”. ChatGPT doesn’t care about that prior baggage — it does the analysis the way that the research literature is pointing and how the calculation is statistically done across domains when confronted with the premise of an annual impulse combined with a tidal modulation. And it nailed it in 2025, just as I nailed it in 2018.

Reply

Thread on tidal modeling

Someone on Twitter suggested that tidal models are not understood “The tides connection to the moon should be revised.”. Unrolled thread after the “Read more” break

Continue reading