Group Abstract Group Abstract

Message Boards Message Boards

[WSS22] Photon propagation through variable-dimensional space

enter image description here

POSTED BY: Simon Fischer
8 Replies

5-3-23
Dear Professor Fischer,
Great article and congratulations.
Can you extend it in some additional ways - travel through dark matter and dark energy as well?
Near black holes?
Bosonic stars?
And to neutrino travel?

Best wishes,
Paul Shapshak. PhD
University of South Florida

"Any comments or discussions are welcome", though, as Stephen Wolfram reminds us, "computational notebooks have a mixture of text together with images and code" and--much like books that have this feature that they kind of have a certain expected structure, and you can kind of pick it up and see its length and so on--they provide a clear framework for presenting and running ideas.

But we're not done yet. Next, we'll generalize the Kirchoff (Laplacian) matrix via eigen-decomposition into fractional dimensions. By spectrally raising L to a non-integer power, we obtain the fractional Laplacian, alternatively and instead the initial conditions on the graph exist through vertex weights. Versus--in the delta-spike version--we can "set a delta bump at one vertex." Method 1 (the diffusion kernel) uses $e^{-λt}$, whereas Method 2 (the wave kernel) swaps out $e^{-λt}$ for $cos(ω t)$ in the spectral domain, turning diffusion into oscillation.

FractionalGraphLaplacian[g_, \[Alpha]_] := 
 Module[{L}, L = N[SparseArray[KirchhoffMatrix[g]]];
  Check[MatrixPower[L, \[Alpha]/2], $Failed, MatrixPower::nmxpwr]]
RandomInitialTemperature[g_] := RandomReal[{0, 1}, VertexCount[g]]
mem : FractionalHeatStep[L\[Alpha]_, ics_, t_] := 
 mem = MatrixExp[-L\[Alpha]*t] . ics
DynamicGridGraph[size_] := 
 GridGraph[{size, size}, 
  EdgeShapeFunction -> (If[
      RandomReal[] < 0.1, {Red, Thick}, {Black, Thin}] &), 
  VertexSize -> 0.3]
VisualizeHeat[g_, temps_] := 
 GraphPlot3D[g, 
  VertexStyle -> 
   Thread[VertexList[
      g] -> (ColorData["AlpineColors"] /@ Rescale[temps])], 
  EdgeStyle -> Directive[Thick, GrayLevel[0.3]], PlotRange -> {0, 1}, 
  Boxed -> False]
Manipulate[
 Module[{g, L\[Alpha], initTemp, currentTemp}, 
  g = DynamicGridGraph[gridSize];
  L\[Alpha] = FractionalGraphLaplacian[g, \[Alpha]];
  initTemp = RandomInitialTemperature[g];
  currentTemp = FractionalHeatStep[L\[Alpha], initTemp, t];
  VisualizeHeat[g, currentTemp]], {{gridSize, 5, "Grid Size"}, 3, 8, 
  1, Appearance -> "Labeled"}, {{\[Alpha], 1.5, "Fractional Order"}, 
  0.1, 2, 0.1, Appearance -> "Labeled"}, {{t, 0.1, "Time"}, 0.01, 2, 
  0.01, Appearance -> "Labeled"}, 
 TrackedSymbols :> {gridSize, \[Alpha], t}, ControlPlacement -> Left, 
 SynchronousUpdating -> False]

Heat Diffusion Animation

That's "your diffusion kernel", the direct analogue of the wave-kernel but for heat. And so, the extrinsically fractional graphs.."introduce fractional dimensional regions by relabeling vertices without changing graph structure", randomly recolors and / or could relabel edges, to produce a "mixed" or "perturbed" grid--just like the @Simon Fischer extrinsic hack for assigning different D-values to subregions. What about presenting 3-Dimensional plots of amplitude / intensity, and making an interactive notebook? Well, Mathematica already has this baked into the cake, letting us dial in fractional order α, time-t, and grid size on the fly. In a nutshell the future fractional Laplacian Matrix, in order to "impose initial conditions on the graph", the wave-kernel being comprised of the exp(-L^{α} t) thing, leads us to an extrinsic heterodimensional graph à la § the extrinsically fractional graphs, just as we do for wave propagation, we've taken the same spectral-graph toolbox that Simon Fischer uses for photons and waves, and apply it to fractional heat diffusion in mixed-dimension grids. If we wanted to we could now swap in the EigenSpaceAdvance[spectrum, coords, t_]:=Cos[t*√spectrum["eigenvalues"]] and turn it into the wave simulation--completing the circle from diffusion -> fractional wave propagation exactly as described. But that should be an "exercise to the reader" right?

n = 20; 
h = 1.0/(n + 1);
s = 0.5; 
L1D = SparseArray[{Band[{1, 1}] -> 2.0, Band[{1, 2}] -> -1.0, 
     Band[{2, 1}] -> -1.0}, {n, n}]/h^2;
L2D = KroneckerProduct[L1D, IdentityMatrix[n]] + 
   KroneckerProduct[IdentityMatrix[n], L1D];
{vals, vecs} = Eigensystem[L2D];
f = ConstantArray[1.0, n*n];
coeffs = vecs . f; 
coeffsScaled = coeffs/(vals^s);
u = coeffsScaled . vecs; 
uMatrix = Partition[u, n];
ListDensityPlot[uMatrix, PlotRange -> All, 
 ColorFunction -> "SunsetColors", 
 PlotLabel -> Row[{"Fractional Poisson Equation, s = ", s}], 
 FrameLabel -> {"x", "y"}, DataRange -> {{0, 1}, {0, 1}}]

Fractional Poisson Equation

Here is the spectral definition of the fractional Laplacian (or more precisely its inverse) on a 2-Dimensional finite-difference grid with Dirichlet boundary conditions. Concretely the process is like this--one builds the 1-Dimensional, Dirichlet Laplacian of size n × n, form the 2-Dimensional Laplacian by Kronecker sums $L_{\text{2D}} = L_{\text{1D}} \otimes I_n + I_n \otimes L_{\text{1D}}$ which we diagonalize and then for the (fractional) Poisson problem $L^s u = f$ we scaled each spectral coefficient by $\lambda^{-s} \ \text{where } s = 0.5$, and the result we plot on the $[0, 1]^2$ grid. The spectral approach $\sum_i \lambda_i^{-s} \langle f, v_i \rangle v_i$ as opposed to the fractional graph Laplacian via MatrixPower[L, α/2] is something that we, on a regular grid we can exploit the Kronecker structure and the full Eigensystem. Now on a general graph we would replace the L2D with the graph Laplacian and still do {λs, vs} = Eigensystem[Lgraph]; and then u = (vs . f)/λs^s . vs; as Fischer suggests in §5.2, which automatically enforces the right boundary conditions (the method of Dirichlet on the grid edges)..with an arbitrary graph we get whatever "boundary" the graph encodes, limited only by the full diagonalization that is $O(N^3)$, wherein it only works up to a few thousand nodes. For large graphs we should try sparse methods (e.g. Lanczos) or rational approximations to $L^{-s}$ that's why I said we're not done yet because, for teaching or prototyping we've got some small 2-Dimensional examples however in order to solve the fractional Poisson or to generate a fractional-power Laplacian spectrally there is another much less clean way to do so.

make1DLaplacian[n_] := 
  SparseArray[{Band[{1, 1}] -> -2., Band[{1, 2}] -> 1., 
    Band[{2, 1}] -> 1.}, {n, n}];
make2DLaplacian[n_] := 
  With[{L1D = make1DLaplacian[n]}, 
   KroneckerProduct[L1D, IdentityMatrix[n]] + 
    KroneckerProduct[IdentityMatrix[n], L1D]];
fractionalLaplacian2D[n_, \[Alpha]_] := 
  Module[{L2D}, L2D = make2DLaplacian[n];
   MatrixPower[-L2D, \[Alpha]/2]];
n = 5;
\[Alpha] = 0.5;
fracLap = fractionalLaplacian2D[n, \[Alpha]];
MatrixPlot[fracLap, 
 PlotLabel -> 
  Style["2D Fractional Laplacian Matrix (\[Alpha]=0.5)", 16], 
 ColorFunction -> "Temperature", ImageSize -> Medium]
eigenvalues = Eigenvalues[N@fracLap];
ListPlot[Sort[eigenvalues, Greater], 
 PlotLabel -> Style["Eigenvalues of Fractional Laplacian", 16], 
 AxesLabel -> {"Index", "Eigenvalue"}, ImageSize -> Medium, 
 PlotStyle -> {Red, PointSize[Medium]}]

2d laplacian matrix fractional

eigenvalues of laplacian matrix

Notice that, for whatever reason, the integer-order Laplacian (tridiagonal in 1 dimension or block-tridiagonal in 2 dimensions) when raised to a fractional power "spreads out nonzero entries well beyond the nearest-neighbor stencil." The resulting "heatmap" exhibits a dominant diagonal of large entries with weaker off-diagonals that decay in a roughly algebraic fashion. I actually picked up this idea from some vagrant named Don--his studded red-pink-neon-blue-and-yellow shorts might seem distracting, but as he quipped, it wasn't painful to learn because he'd "read all the classics" and even memorized the eigenvalue spectrum of that same 25 × 25 matrix, confirming every eigenvalue is positive (as expected for $(-\Delta)^{\alpha/2}$).

Don also reminded me that if we extend this article we must "fulfill the Ruliad," and that choosing Mathematica lets us preserve "both the structure of the operator in the standard basis and its action in its own spectral basis," avoiding compromise of our original "intention". We know those eigenvalues lie in a tight band around 1 – 1.7, and their spread governs how our diffusion kernel (via $e^{-λt}$ in the spectral domain) transitions to oscillatory behavior under a wave kernel (via $\cos(ωt)$). Finally, it’s worth recalling how powerful computational frameworks can be--"computational notebooks have a mixture of text together with images and code" and that is how the operator structure can be conveniently combined with spectral dimensionality--and, these tools "have a certain expected structure" so in a sense we can "pick up" Mathematica notebooks and see their length and so on.

n = 5;
alpha = 1.5;  
k = 1; 
g = GridGraph[{n, n}];
laplacian = KirchhoffMatrix[g];
{vals, vecs} = Eigensystem[laplacian];
fractionalVals = vals^(alpha/2);
U = Transpose[vecs];
initialCondition = UnitVector[n^2, Ceiling[n^2/2]];
t = 0.1*k; 
expVals = Exp[-t*fractionalVals]; 
solution = 
  U . DiagonalMatrix[expVals] . Transpose[U] . initialCondition;
reshaped = Partition[solution, n];
ListDensityPlot[reshaped, PlotRange -> All, PlotLegends -> Automatic, 
 Frame -> False]

List density

Here is the fractional-heat solution on a 5 × 5 grid with α = 1.5 at t = 0.1, shown as a density map: the "temperature" spreads out from the central vertex under the kernel $e^{–t λ^{α/2}}$. Notice that, unlike the integer-order Laplacian--which in 1D is tridiagonal or in 2D block-tridiagonal--the fractional power $L^{\alpha/2}$ "spreads out nonzero entries well beyond the nearest-neighbor stencil," producing a dominant diagonal plus off-diagonals that decay roughly algebraically. Initial conditions can be imposed either by assigning vertex weights or, in the delta-spike version, by "setting a delta bump at one vertex." Spectrally, diffusion (Method 1) corresponds to replacing each eigenvalue λ with $e^{-\lambda t}$, whereas the wave analogue (Method 2) swaps in $\cos(\omega t)$--giving a direct heat-kernel counterpart to the wave kernel.

As we know from the documentation, "a thing that we invented back in 1987 has a mixture of of text together with images and code," and that code is “intended to be read as well as to be written". This is in effect a relative image of our goal: to preserve both the operator’s sparse-matrix structure in the standard basis and its action in the spectral basis, with “the math expected to carry some of the exposition".

In this example the eigenvalues lie in a fairly tight band around 1.0–1.7, and their spread governs how the fractional diffusion evolves over time. Future directions include exploring other values of α, larger grids, or using the eigenvectors themselves to build fractional Poisson, heat, and wave solutions.

make1DLaplacian[n_] := 
  SparseArray[{Band[{1, 1}] -> -2., Band[{1, 2}] -> 1., 
     Band[{2, 1}] -> 1.}, {n, n}]/(1/(n + 1))^2;
n = 10;
\[CapitalDelta]1D = make1DLaplacian[n];
\[CapitalDelta]2D = 
  KroneckerProduct[\[CapitalDelta]1D, IdentityMatrix[n]] + 
   KroneckerProduct[IdentityMatrix[n], \[CapitalDelta]1D];
{vals, vecs} = Eigensystem[\[CapitalDelta]2D];
vals = Reverse[vals];
vecs = Reverse[vecs];
s = 0.5;
fractionalVals = vals^(s/2);
fractional\[CapitalDelta] = 
  Transpose[vecs] . DiagonalMatrix[fractionalVals] . vecs;
rhs = ConstantArray[1., n^2];
solution = LinearSolve[fractional\[CapitalDelta], rhs];
Grid[{{ArrayPlot[Partition[vals, n], 
    PlotLabel -> "Standard Laplacian Spectrum", 
    ColorFunction -> "AlpineColors", ColorFunctionScaling -> True], 
   ArrayPlot[Partition[fractionalVals, n], 
    PlotLabel -> StringForm["Fractional (s=``) Spectrum", s], 
    ColorFunctionScaling -> True]}, {ArrayPlot[Partition[solution, n],
     PlotLabel -> "Solution to (-\[CapitalDelta])^s u = 1", 
    ColorFunctionScaling -> True]}}, Frame -> All, 
 Spacings -> {2, 2}]
ListPlot[{Sort[vals], Sort[fractionalVals]}, 
 PlotLabel -> "Eigenvalue Distribution", 
 AxesLabel -> {"Index", "Eigenvalue"}, 
 PlotLegends -> {"Standard Laplacian", "Fractional Laplacian"}, 
 Joined -> True, PlotRange -> All]

Laplacians

All Eigenvalues

And so there you have it, the standard vs. Fractional Spectrum and Fractional Poisson Solution; on the upper left you will find the spectrum of the ordinary 2-dimensional finite-difference Laplacian (eigenvalues $λ_k$, and on the upper right you will find the spectrum of $(-Δ)^{s}$ with $s=0.5$ (eigenvalues $λ_{k}^{s}$), and, on the bottom-left you will find the solution u of $(-\Delta)^s u = 1$ and on the $10×10$ grid with zero Dirichlet boundary, that we can show as an ArrayPlot of $u_{i}^j$. So that's how you know, that what Wolfram is "really saying"..is the fact that you "effectively sign up for computational irreducibility". But that's what you do when you try writing this in Python or in C#, whereas I found in my experience that the Wolfram Mathematica Language is the most least computationally irreducible language that I have ever found. Sure there are "pockets of irreducibility" where you can say "mostly it's doing complicated things" but "something about it I can say something simple about". You could even talk about geopolitics (as though you wanted to)..and don't go running around telling your friends this like some droopy eyed zombie. But you could do that if you wanted to, and bounce your ideas off of me in all of my, fractional-Poisson solution $u$ because it's smoother and more "bulged" in the interior than the standard 2 dimensional Poisson solution would be.

n = 10; 
g = GridGraph[{n, n}];
coords = GraphEmbedding[g]; 
L = N@KirchhoffMatrix[g];
MatrixPlot[L, ImageSize -> 300, PlotLabel -> "2D Laplacian Matrix"]
alpha = 0.7; 
Lfrac = MatrixPower[L, alpha/2];
MatrixPlot[Lfrac, ImageSize -> 300, 
 PlotLabel -> "Fractional Laplacian"]
initTemp = Normal@SparseArray[{Floor[n^2/2 + n/2] -> 1.}, {n^2}];
TimeStep[temp_, L_, dt_] := temp - dt*(L . temp)
dt = 0.005;
steps = 100;
solution = NestList[TimeStep[#, Lfrac, dt] &, initTemp, steps];
DynamicModule[{i = 1}, 
 Column[{Row[{"Time Step: ", Slider[Dynamic[i], {1, steps, 1}]}], 
   Dynamic@ArrayPlot[Partition[solution[[i]], n], 
     ColorFunction -> "TemperatureMap", PlotRange -> {0, 1}, 
     ImageSize -> 400, Frame -> False]}]]
Block[{eigs}, eigs = Eigenvalues[L];
 ListPlot[{Sort@eigs, Sort@Eigenvalues[Lfrac]}, 
  PlotLabel -> "Eigenvalue Distribution", 
  PlotLegends -> {"Standard", "Fractional"}, ImageSize -> 400, 
  Joined -> True]]
Grid[Partition[
  ArrayPlot[Partition[#, n], ColorFunction -> "TemperatureMap", 
     ImageSize -> 100] & /@ Take[Eigenvectors[Lfrac], 4], 2], 
 Frame -> All, FrameStyle -> LightGray]

2d1

2d2

2d3

2d4

2d5

The standard graph-Laplacian on a 10×10 grid (Dirichlet boundary), is represented in 2 dimensions while the fractional Laplacian (α=0.7), $L^{α/2}$ "fills in" more off-diagonal structure--long-range couplings appear. You start with a delta at the center and repeatedly apply fractional heat flow $u^{m+1} = u^m - \Delta t \, (L^{\alpha/2} u^m)$ for 100 steps. The slider moves like, a watch of the "fractional diffusion" evolved under $L^{0.35}$. The eigenvalue comparison, is an overlay of the standard Laplacian matrix versus the fractional one; notice that small eigenvalues are "pulled up" by the exponent 0.7. Thus the ArrayPlots of the first four eigenvectors of $L^{0.35}$. These give you the smoothest "modes" of your fractional operator. Based on n, α, Δt the fractional operator changes both the matrix structure and the diffusion across time steps.

MakeGridGraph[n_Integer] := 
 GridGraph[{n, n}, VertexSize -> Medium, VertexStyle -> Blue, 
  EdgeStyle -> Gray]
GraphLaplacian[g_Graph] := 
 N@KirchhoffMatrix[g] + IdentityMatrix[VertexCount[g]]
SpectralDecomposition[L_] := Module[{eigs}, eigs = Eigensystem[L];
  {First[eigs], Transpose[Last[eigs]]}]
FractionalLaplacian[L_, s_] := 
 Module[{vals, vecs}, {vals, vecs} = SpectralDecomposition[L];
  vecs . (vals^s*Inverse[vecs])]
InitialTemperature[n_] := 
 ReplacePart[ConstantArray[0., n^2], {Ceiling[n^2/2 + n/2] -> 1.}]
AnimateHeatDiffusion[L_, s_, tmax_, n_] := 
 Module[{fracL, T0, frames, dt = 0.05, steps}, 
  fracL = FractionalLaplacian[L, s];
  T0 = InitialTemperature[n];
  steps = Ceiling[tmax/dt];
  frames = 
   Table[MatrixPlot[Partition[MatrixExp[-fracL*t] . T0, n], 
     PlotRange -> {0, 1}, ColorFunction -> "TemperatureMap", 
     ImageSize -> 300, Frame -> False], {t, 0, tmax, dt}];
  ListAnimate[frames, ControlPlacement -> Top]]
n = 10; 
g = MakeGridGraph[n];
L = GraphLaplacian[g];
Row[{AnimateHeatDiffusion[L, 0.5, 2, n], 
  AnimateHeatDiffusion[L, 1.5, 2, n]}]

Fractional Heat 1

Fractional Heat 2

So when $s = 0.5$ that's sub-diffusive. You'll see the heat "spreads" more slowly, with a pronounced central peak persisting. Whereas with $s = 1.5$ that's super-diffusive; the heat spreads much faster, almost "jumping" to distant nodes. The full spectrum spans the range from very slow localized diffusion to very rapid long-range transport.

InitializeGraph[] := 
  Module[{g}, g = GridGraph[{10, 10}, VertexSize -> Medium];
   SetProperty[
    g, {VertexLabels -> "Name", 
     GraphLayout -> "SpringElectricalEmbedding"}]];
FractionalLaplacian[g_, alpha_] := 
  Module[{L}, L = N@KirchhoffMatrix[g];
   MatrixPower[L, alpha/2]];
AnimateHeatDiffusion[g_, Lalpha_, initTemp_, {tStart_, tEnd_, dt_}] :=
   Module[{frames, temps, vertices, colors, t}, 
   vertices = VertexList[g];
   frames = Table[temps = MatrixExp[-t*Lalpha] . initTemp;
     colors = Blend[{Blue, Yellow, Red}, #] & /@ Rescale[temps];
     Graph[g, VertexStyle -> Thread[vertices -> colors], 
      PlotLabel -> 
       Style[Row[{"Fractional Diffusion \!\(\*SuperscriptBox[\(-(-\
\[CapitalDelta])\),\(\[Alpha]/2\)]\)", " (\[Alpha]=", alpha, ", t=", 
          NumberForm[t, {3, 2}], ")"}], 16]], {t, tStart, tEnd, dt}];
   ListAnimate[frames, AnimationRate -> 0.5]];
Module[{g, alpha = 1.5, initTemp, Lalpha}, g = InitializeGraph[];
 initTemp = Normal@SparseArray[{50 -> 1}, VertexCount[g]];
 Lalpha = FractionalLaplacian[g, alpha];
 AnimateHeatDiffusion[g, Lalpha, initTemp, {0, 2, 0.1}]]

Fractional Heat Diffusion

And when we start with a single "hot" vertex (#50) and use a fractional order $α = 1.5$ diffusion, we see sub- vs. super-diffusion via the fractional exponent α in (0, 2) values, if we were to list more indices in SparseArray we would seed multiple vertices hot, and that is how heat (or any diffusive quantity) propagates under a fractional power of the Laplacian on a network.

Laplacian1D[n_Integer] := 
  SparseArray[{Band[{1, 1}] -> -2.0, Band[{1, 2}] -> 1.0, 
    Band[{2, 1}] -> 1.0}, {n, n}];
Laplacian2D[n_Integer] := 
  Module[{L1D = Laplacian1D[n]}, 
   KroneckerProduct[L1D, IdentityMatrix[n]] + 
    KroneckerProduct[IdentityMatrix[n], L1D]];
FractionalLaplacian[n_Integer, \[Alpha]_] := 
  MatrixPower[Laplacian2D[n], \[Alpha]/2];
InitialCondition[n_Integer] := 
  Module[{center = Ceiling[n/2]}, 
   SparseArray[{{center, center} -> 1.0}, {n, n}] // Flatten];
HeatKernelEvolve[state_, L_, t_] := 
  Module[{vals, vecs, coeffs}, {vals, vecs} = Eigensystem[N@L];
   coeffs = Exp[-t*vals]*(vecs . state);
   vecs . coeffs];
GenerateHeatAnimation[n_, \[Alpha]_, tmax_, steps_] := 
  Module[{L = FractionalLaplacian[n, \[Alpha]], frames, 
    ic = InitialCondition[n]}, 
   frames = 
    Table[Partition[HeatKernelEvolve[ic, L, t], n], {t, 0, tmax, 
      tmax/steps}];
   ListAnimate[
    ArrayPlot[#, ColorFunction -> "TemperatureMap", 
       PlotRange -> {0, 1}, ImageSize -> 300] & /@ frames, 
    AnimationRate -> 1]];
GenerateHeatAnimation[20, 1.5, 1.0, 50]

Fractional heat Kernel

And so this particular article (who knows it might even have applications to this Autobahn I'm hearing about)..I think how we could get contributors..we could find somebody on a park bench or riding in a fire truck (because they skimp)..nevertheless our article has this feature that books have..a certain expected structure, and you can kind of build up enough historical knowledge that might be integrable into this article. But the real issue is that we've really been skimping on our article; there's so much more to the integer-dimensional Laplacian we have to construct, we're just about ready to blast off, with our graphs, might as well shutter the Department of Education because Mathematica, has got all kinds of funky stuff like illustrations, of how the wings of an insect touch each other on the up-flap, and then they pull air in as the wings peel apart and so on and so forth, all of which gives me hope and confidence that yes, when we diagonalize the Kirchhoff (graph Laplacian) matrix and set our initial condition Δ as the point-source excitation at the graph center, the time evolution $u(t) = V \left[ \cos(\omega t) + \sin(\omega t) \right] V^{-1} u(0)$--will produce "standing-wave solutions' and "circular wavefronts" on our 16 × 16 grid.

And the Fischer continuum in dimension D predicts $\Phi(R, t) = A R^{1 - \frac{2}{D}} H^{(2)}_{\nu}(kR) \cos(\omega t)$ sampling that “continuous solution (with fractional D) directly "painted" onto each vertex by replacing R |-> graph-distance” will reproduce the same behavior: intensity is amplified for D < 2 & damped for D > 2. In practice, we can even insert extra edges between non-adjacent vertices to mimic the effect of a locally higher dimension--just as when you look at the exact spectral-propagation code… the wavefront "speeds up" when it hits the curved region, confirming our two complementary approaches to fractional dimensions in discrete spaces: either encode D in the operator or in the graph geometry.

Honestly, if you've seen how his portion of the Ruliad--if you wanted to just do some bird watching and lean against the wall a little bit you'd be more interested in physics, interested in the integer-D Laplacian operator as we fix it (but it's a bit more painful than it's all cracked up to be) but regardless, I have yet to see someone who can literally take that and still be interested in, after being run over, interested in the integer-D Laplacian operator as we fix it, as we fix your fractional dimension in the graph’s structure. So many complementary approaches illustrate our central message. You provide the continuum plots like in Figures 8–9, and I’ll show you the graphs--because that’s why we’re writing this article.

make1DLaplacian[n_] := 
  SparseArray[{Band[{1, 1}] -> 2., Band[{1, 2}] -> -1., 
    Band[{2, 1}] -> -1.}, {n, n}];
make2DLaplacian[n_] := 
  KroneckerProduct[make1DLaplacian[n], IdentityMatrix[n]] + 
   KroneckerProduct[IdentityMatrix[n], make1DLaplacian[n]];
fractionalLaplacian[L_, alpha_] := MatrixPower[L, alpha/2];
initialTemperature[n_] := 
  Module[{grid = ConstantArray[0., {n, n}]}, grid[[n/2, n/2]] = 1.; 
   Flatten[grid]];
heatKernelStep[fracL_, t_, ic_] := Exp[-t*fracL] . ic;
Manipulate[Module[{n = 20, L, fracL, ic, temp}, L = make2DLaplacian[n];
  fracL = fractionalLaplacian[L, alpha];
  ic = initialTemperature[n];
  temp = heatKernelStep[fracL, t, ic];
  ArrayPlot[Partition[temp, n], ColorFunction -> "TemperatureMap", 
   DataReversed -> True, PlotRange -> {0, 1}, 
   Frame -> False]], {alpha, 0.1, 2., 0.1, 
  Appearance -> "Labeled"}, {t, 0.01, 5., 0.1, 
  Appearance -> "Labeled"}, ControlPlacement -> Top]

Temperature Map Single Laplacian

Now that we’ve seen “intensity is amplified for D < 2, damped for D > 2,” let’s build the discrete Laplacian. Start in one dimension with the familiar “second-difference matrix on a 1 … n grid (Neumann-style interior stencil).” Once that 1D operator is in place, we “lift to 2 dimensions by Kronecker products” to easily satisfy the classic five-point Laplacian on an n×n grid.

Thanks to a “full dense spectral decomposition under the hood,” we can define the fractional power $(-\Delta)^{\alpha/2}$ and--centering a single “point-source” hot pixel--write the heat-kernel solution as $u(t) = e^{-t(-\Delta)^{\alpha/2}} u(0)$. This exactly mirrors the way we handled waves--just swap out the oscillatory $cos / sin$ kernel for the diffusion kernel $e^{-t λ}$, then take the matrix to a fractional power to explore non-integer "dimensions."

As with Fischer’s continuum formula, varying α “recovers standard diffusion when α = 2. For α > 2, the kernel stays more localized--“slower diffusion”--whereas α < 2 produces “faster spreading” (Lévy-flight-like behavior). Any further extensions--“how a delta-spike at the center spreads out as you vary both the fractional power and elapsed time”--follow immediately from this same spectral approach.

n = 20;
G = GridGraph[{n, n}, VertexSize -> Tiny];
coords = GraphEmbedding[G];
initialTemp = ConstantArray[0., {n, n}];
initialTemp[[n/2, n/2]] = 1;
initialTemp = Flatten[initialTemp];
K = N@KirchhoffMatrix[G]; 
\[Alpha] = 1.5; 
{\[Lambda]s, U} = Eigensystem[K];
\[CapitalLambda] = DiagonalMatrix[\[Lambda]s];
frac\[CapitalLambda] = 
  DiagonalMatrix[Sign[\[Lambda]s] Abs[\[Lambda]s]^(\[Alpha]/2)];
K\[Alpha] = U . frac\[CapitalLambda] . Inverse[U];
times = Range[0, 2, 0.1];
frames = Table[T = MatrixExp[-t*K\[Alpha]] . initialTemp;
   ListDensityPlot[Partition[T, n], PlotRange -> {0, 1}, 
    ColorFunction -> "TemperatureMap", 
    Epilog -> {Black, Point /@ coords}, 
    PlotLabel -> 
     Style[Row[{"Time = ", NumberForm[t, {3, 2}]}], 16]], {t, 
    times}];
ListAnimate[frames, ControlPlacement -> Top, AnimationRate -> 0.5, 
 ImageSize -> 600]

Fractional Grid Graph 1

I decided to “make a book computable” by hand, rebuilding the same fractional-heat-diffusion operator via KirchhoffMatrix and an explicit eigen-decomposition. As the speaker notes, computational notebooks “have a mixture of text together with images and code,” so once we assemble our grid and initial condition, form the unnormalized Graph Laplacian, and diagonalize K, we collect the eigenvalues $λ_{i}$ and assemble U from their corresponding eigenvectors. Then the fractional power $(-\Delta)^{\alpha/2}$ “lends itself naturally to the fractional heat and wave equations” by simply raising each $λ_{i}$ to the $α / 2$ power (retaining sign if you ever go negative). You might wonder why we conjugate back through U--it’s because to evolve under the heat kernel we need the full dense matrix K[α]. For each time t we compute $u(t) = e^{-t K^{[\alpha]}} u(0)$ via MatrixExp, then reshape onto the $n × n$ lattice and render a density plot “overlaid with the vertex coordinates so you see the underlying graph.” Just like “the code is set up to be sort of a computational description of what’s going on,” diagonalizing once and building $K[α]$ up front lets us reuse the same fractional operator at every time step--far more efficient than re-computing spectral powers inside the animation loop. And, as always, when $α = 2$ you recover the usual graph-heat equation; $α < 2$ gives “long-range” super-diffusion; and $α > 2$ grows even more localized. It’s a full-fledged, eigen-based approach--“pretty soon” we’ll need to embed this code in our article, or we’ll certainly run out of space!

Base2DLaplacian::badMethod = "Unknown method `1`.";
Base2DLaplacian[n_Integer, method_ : "FD"] := 
 Module[{h = 1.0/(n + 1), fd1D, lapFD, mass1D, stiff1D, mass2D, 
   stiff2D, lapFE}, 
  fd1D[\[Beta]_] := 
   SparseArray[{Band[{1, 1}] -> 2, Band[{1, 2}] -> -1, 
      Band[{2, 1}] -> -1}, {n, n}]/h^2;
  lapFD = 
   SparseArray[
    KroneckerProduct[fd1D[2], IdentityMatrix[n]] + 
     KroneckerProduct[IdentityMatrix[n], fd1D[2]]];
  mass1D = 
   SparseArray[
     Join[{Band[{1, 1}] -> 2}, Table[{i, i + 1} -> 1, {i, 1, n - 1}], 
      Table[{i + 1, i} -> 1, {i, 1, n - 1}]], {n, n}]*(h/6);
  stiff1D = fd1D[2]*h;
  mass2D = SparseArray[KroneckerProduct[mass1D, mass1D]];
  stiff2D = 
   SparseArray[
    KroneckerProduct[mass1D, stiff1D] + 
     KroneckerProduct[stiff1D, mass1D]];
  lapFE = SparseArray[Inverse[mass2D] . stiff2D];
  Switch[method, "FD", lapFD, "FE", lapFE, _, 
   Message[Base2DLaplacian::badMethod, method]; $Failed]]
FractionalLaplacianMatrix::badMethod = "Unknown method `1`.";
FractionalLaplacianMatrix[n_Integer, \[Alpha]_?NumericQ, 
  method_ : "FD"] := Module[{L0}, L0 = Base2DLaplacian[n, method];
  If[L0 === $Failed, Return[$Failed]];
  MatrixFunction[#^(\[Alpha]/2) &, L0]]
VisualizeSpectrum[n_Integer, \[Alpha]_?NumericQ, method_ : "FD"] := 
 Module[{L0, eigs0, eigsFrac}, L0 = Base2DLaplacian[n, method];
  eigs0 = 
   Eigenvalues[L0, 10, Method -> {"Arnoldi", "Tolerance" -> 1*^-6}];
  eigsFrac = eigs0^(\[Alpha]/2);
  GraphicsRow[{Histogram[eigsFrac, Automatic, 
     PlotLabel -> 
      Style[Row[{"\[Alpha] = ", \[Alpha], ", method = ", method}], 14,
        Bold], ImageSize -> 200], 
    ListPlot[ReverseSort[eigsFrac], 
     PlotMarkers -> {Automatic, Medium}, 
     AxesLabel -> {"Index", "Eigenvalue"}, PlotRange -> All, 
     ImageSize -> 200]}]]
SolveFractionalPoisson[n_Integer, \[Alpha]_?NumericQ, method_] := 
 Module[{A, grid, f, sol}, 
  A = FractionalLaplacianMatrix[n, \[Alpha], method];
  grid = N@Range[0, 1, 1/(n + 1)][[2 ;; -2]];
  f = Flatten@Outer[Sin[\[Pi] #1] Sin[\[Pi] #2] &, grid, grid];
  sol = LinearSolve[A, -f];
  ListPlot3D[Partition[sol, n], DataRange -> {{0, 1}, {0, 1}}, 
   PlotLabel -> 
    Row[{"Solution, \[Alpha] = ", \[Alpha], ", method = ", method}], 
   ColorFunction -> "TemperatureMap", ImageSize -> 300]]
Manipulate[
 Column[{GraphicsRow[{VisualizeSpectrum[n, \[Alpha], "FD"], 
     VisualizeSpectrum[n, \[Alpha], "FE"]}, Spacings -> 2], 
   GraphicsRow[{SolveFractionalPoisson[n, \[Alpha], "FD"], 
     SolveFractionalPoisson[n, \[Alpha], "FE"]}, 
    Spacings -> 2]}], {{n, 30, "Grid size"}, 10, 60, 5, 
  Appearance -> "Labeled"}, {{\[Alpha], 1.5, "Fractional order"}, 0.1,
   2.0, 0.1, Appearance -> "Labeled"}, ControlPlacement -> Top]

Alpha Fractional Order

But we're not done fixing your article yet. We still have to discretize $−Δ$ on an $n×n$ grid, we still have the finite differences "FD" describing the classic 5-point stencil, spacing $h = 1 / (n + 1)$..we build 1 dimensional mass and stiffness matrices (linear heat functions), then "tensor" them up--the usual "mass"-"stiffness" approach for bilinear elements on each square. You pick either one and get the fractional power of the Laplacian wherein once you have your

$L_{0}$ (FD or FE), that's what serves as the foundation of the formation of the equivalence between the continuous and discrete fractional Laplacian operators. $(-\Delta)^{\alpha/2} \longleftrightarrow (L_0)^{\alpha/2}$. This represents the correspondence between the continuous operator $(-\Delta)^{\alpha/2}$ power, and shows (and you did say you wanted to show this Simon), a histogram of those $\lambda_i^{\alpha/2}$ values..wherein the "values" really are to create a bit of a "time series" of sorts, based on the progressive indexing of the eigenvalues we acquire a log-style plot, which tells us how the two discretizations distribute their fractional spectra differently as you vary $α$. Finally, SolveFractionalPoisson solves the $(-\Delta)^{\alpha/2} u = -f(x, y)$ with $f(x, y) = sin(πx)sin(πy)$ on the interior nodes. You end up with..the two 3-dimensional surfaces (FD versus FE) side by side, upon which one can compare the finite-difference versus finite-element spectra, as well as the finite-difference versus the finite-element fractional-Poisson solutions, all in one neat interactive panel. Of course you might say, you wanna switch to a sparse eigensolver e.g. "Arnoldi" in Eigenvalues or precompute your mass-stiffness factorizations outside the animation loop, wherein the boundary conditions have both FD and FE here assume homogeneous Dirichlet (u = 0) on the outer boundary, you could even set a temperature gauge color scheme, some salmon colors, or even the official "Rainbow" or "Thermometer" color schemes, but that I think is a bit far ahead what with our, it's a bit far-fetched so for now we just roll with ListPlot3D but apparently we can add Mesh -> None, and that how we built this flexible "playground" wherein we can explore how the choice of discretization affects fractional operators--and to see at a glance how the solution changes as you dial α from standard (α = 2) down into the "long-range" regime (α < 2).

n = 10;
g = GridGraph[{n, n}];
laplacian = KirchhoffMatrix[g] // N;
FractionalLaplacian[L_, alpha_] := MatrixPower[L, alpha/2];
initialHeat = ConstantArray[0., {n^2}];
initialHeat[[Ceiling[n^2/2]]] = 1;  
HeatDiffusion[L_, initial_, t_] := 
  Module[{vals, vecs, expDiag}, {vals, vecs} = Eigensystem[L];
   expDiag = DiagonalMatrix[Exp[-t*vals]];
   vecs . expDiag . Transpose[vecs] . initial];
VisualizeHeat[vec_] := 
  ArrayPlot[Partition[vec, n], ColorFunction -> "TemperatureMap", 
   PlotRange -> {0, 1}, Frame -> False];
Manipulate[
 Module[{flap, heatState, fracState}, 
  flap = FractionalLaplacian[laplacian, alpha];
  heatState = HeatDiffusion[laplacian, initialHeat, time];
  fracState = HeatDiffusion[flap, initialHeat, time];
  GraphicsRow[{VisualizeHeat[heatState], VisualizeHeat[fracState]}, 
   ImageSize -> 600]], {{alpha, 1, "Fractional Order"}, 0.1, 2, 0.1, 
  Appearance -> "Labeled"}, {{time, 0.1, "Time"}, 0.01, 2, 0.01, 
  Appearance -> "Labeled"}, 
 Button["Reset Initial Heat", initialHeat = ConstantArray[0., {n^2}]; 
  initialHeat[[Ceiling[n^2/2]]] = 1], TrackedSymbols :> {alpha, time}]

Reset Initial heat

So obviously here's the side-by-side type of comparisons of ordinary heat diffusion versus fractional, heat diffusion on a 10 × 10 grid. And because it's fractional, we can build the standard graph Laplacian L of the 10 × 10 grid (Kirchhoff matrix), and define a "fractional Laplacian" $L^{α/2}$ by taking the matrix power, were whereupon our initial condition is a single hot spot of value 1 at the center node, zero everywhere else. As for the heat kernels, the classical diffusion solves $\dot{u} = -L u $ giving $u(t) = e^{-tL} u(0)$ whereas fractional diffusion, solves $\dot{u} = -L^{\alpha/2} u$, gives $u^{\alpha}(t) = e^{-t L^{\alpha/2}} u(0)$ wherein both we get by diagonalizing L and exponentiating the eigenvalues. α ∈ [0.1, 2] simply means that we're in the fractional order wherein α = 2 recovers normal diffusion and α < 2 gives "long-range" diffusion with heavier tails--you'll see the hot spot spread more quickly into the corners. The time, t ∈ [0.01,2] simply means that's how long you let the diffusion run, wherein the reset button returns the initial heat back to a single central spike. Of course, $e^{-tL}$ is standard diffusion on the left grid while $e^{-t L^{\alpha/2}}$ is fractional diffusion on the right grid. Both we show with the same "TemperatureMap" color scale from blue (0) to red (1) but you can use any color, the thing to look for is that at $α = 2$ (top of the slider) both of the images, are identical and as you decrease α, the fractional version (right) flattens out faster which is how we send heat more rapidly to distant nodes--this is the hallmark of nonlocal, 'heavy-tailed" diffusion. The experiment of course is how 'fractional" the diffusion can get.

n = 20;
h = 1.0/(n + 1);
laplacian1D = 
  SparseArray[{Band[{1, 1}] -> 2.0/h^2, Band[{1, 2}] -> -1.0/h^2, 
    Band[{2, 1}] -> -1.0/h^2}, {n, n}];
laplacian2D = 
  KroneckerProduct[laplacian1D, IdentityMatrix[n]] + 
   KroneckerProduct[IdentityMatrix[n], laplacian1D];
s = 0.5;
{eigenvals, eigenvecs} = Eigensystem[laplacian2D];
fractionalEigenvals = eigenvals^s;
u0 = Flatten@
   Table[Exp[-((i - n/2.0)^2 + (j - n/2.0)^2)/(2*(n/5.0)^2)], {i, 
     n}, {j, n}];
solution[t_] := 
  eigenvecs . (Exp[-t*fractionalEigenvals]*(Transpose[eigenvecs] . 
       u0));
frames = 
  Table[ListPlot3D[Partition[solution[t], n], PlotRange -> {0, 1}, 
    AxesLabel -> {"x", "y", "u"}, ColorFunction -> "TemperatureMap", 
    PlotLabel -> "Fractional Heat Equation\nTime = " <> ToString[t], 
    ImageSize -> 400], {t, 0, 0.1, 0.005}];
ListAnimate[frames, ControlPlacement -> Top]
\[Theta] = Pi*Range[n]/(n + 1);
symbols = 
  Flatten@Table[(4 - 2*Cos[\[Theta][[i]] - 2*Cos[\[Theta][[j]]]])^
     s, {i, n}, {j, n}
    ];
sortedEigenvalues = Sort[fractionalEigenvals, Greater];
sortedSymbols = Sort[symbols, Greater];
ListPlot[{sortedEigenvalues, sortedSymbols}, Joined -> True, 
 PlotStyle -> {Blue, Red}, 
 PlotLegends -> {"Matrix Eigenvalues", "Theoretical Symbol"}, 
 AxesLabel -> {"Index", "Value"}, 
 PlotLabel -> "Spectral Distribution Comparison", ImageSize -> 500]

eigenvalues

Eigenvalues Theoretical Symbol

But we don't have to just ride off into the sunset; we can look at the macro, the construction and utilization of Laplacian matrices in simulating the fractional heat equation. Starting with a one-dimensional Laplacian, this matrix is extended to two dimensions using Kronecker products to form the two-dimensional Laplacian. This two-dimensional matrix quite suavely portrays the identity matrix and the one-dimensional Laplacian to cover spatial interactions in both dimensions.

The eigenvalues from this matrix are then modified to represent fractional powers, indicative of the alterations necessary for handling fractional dimensions within the context of the heat equation: $\{\text{eigenvals}, \text{eigenvecs}\} = \text{Eigensystem}[\text{laplacian2D}];$

$\text{fractionalEigenvals} = \text{eigenvals}^{\text{degree of fractional diffusion}};$.

The initial conditions and solution approach are detailed with the system evolving over time as $u_0 = \text{Flatten}@\text{Table}[\exp\left(-\frac{(i - n/2.0)^2 + (j - n/2.0)^2}{2*(n/5.0)^2}\right), \{i, n\}, \{j, n\}]; $

and

$\text{solution}[t\_] := \text{eigenvecs} . (\exp[-t*\text{fractionalEigenvals}]*(\text{Transpose}[\text{eigenvecs}] . u0));$.

Animations and plots take a more "deist" approach in that we compare theoretical predictions with computational results, momentarily illustrating the spectral properties and effects of fractional dimensions on the system. For instance, frames generated over time periods demonstrate the evolution of temperature distribution, reconstructing the narrative and if you don't think that's good well then, let's link mathematical theories with practical simulations in computational physics. This detailed exposition bridges complex theoretical concepts with their practical applications, as a dim reflection of the potent proof that there is a link between numerical methods and theoretical knowhow in scientific investigations.

FractionalGraphLaplacian[graph_, alpha_] := 
  Module[{L}, L = KirchhoffMatrix[graph]; MatrixPower[L, alpha]];
g = GridGraph[{3, 3}];
alpha = 0.5;
fracL = FractionalGraphLaplacian[g, alpha];
eigs = Eigenvalues[N[KirchhoffMatrix[g]]];
fracEigs = Eigenvalues[N[fracL]];
GraphicsRow[{Histogram[eigs, {0.1}, Frame -> True, 
    PlotLabel -> "Standard Laplacian Eigenvalues", 
    FrameLabel -> {"Eigenvalue", "Frequency"}, PlotRange -> All], 
   Histogram[fracEigs, {0.1}, Frame -> True, 
    PlotLabel -> 
     Row[{"Fractional (\[Alpha]=", alpha, ") Eigenvalues"}], 
    FrameLabel -> {"Eigenvalue", "Frequency"}, PlotRange -> All]}, 
  ImageSize -> 800];
MatrixPlot[fracL, 
 PlotLabel -> 
  Row[{"Fractional Graph Laplacian (\[Alpha]=", alpha, ")"}], 
 ColorFunction -> "TemperatureMap", 
 FrameTicks -> {None, None, Automatic, Automatic}]

LaPlacian fractional graph

In this particular instance we have that the graph is 3 × 3 with 9 vertices, and the fractionation happens when the Kirchhoff (Graph Laplacian), which defines $L = D - A$ where D is the degree matrix and A the adjacency matrix of g, defines the fractional Laplacian wherein $L^{\alpha} = (\text{KirchhoffMatrix}(g))^{\alpha}$ uses Mathematica's MatrixPower[L, α] that is how we get the usual "fractional Laplacian", which is often $L^{α / 2}$, but here we're using full α. The spectral distributions of the ordinary versus fractional operators mean that the eigs are the eigenvalues of L while the fractional, fracEigs have the eigenvalues of L^{α}, and the effects of using $α = 0.5$ are that the spectrum shrinks in the "sense" that fractional powers push eigenvalues toward 1. Small eigenvalues of L become larger wince since λ^{0.5} > λ for 0 < λ < 1 while large eigenvalues shrink ( $λ^{0.5}$ < λ when λ > 1). The fractional spectrum them is more tightly clustered (the distribution narrows) which indicates that modes (eigenvectors) decay more uniformly. The MatrixPlot of fracL shows that off-diagonal entries now typically smaller in magnitude (since α < 1), meaning weaker "local coupling" between neighbors, not to mention the diagonal entries have adjusted, they're gone like the wind..so each row still sums to zero (property of any Laplacian). So if you solve $\dot{u} = -L u \quad \text{vs.} \quad \dot{u} = -L^{\alpha} u$, the fractional version will mix or diffuse (more non-locally and more evenly) across modes, due to the "flattened" spectrum. Small-scale (high-frequency) variations are more gently smoothed, and large-scale (low-frequency) components decay faster relative to the standard Laplacian case. For α = 1 you recover the ordinary Laplacian and, as α approaches 0 and $L^{α}$ approaches I, so too do you approach pure identity (no diffusion at all)..and, as α approaches 2 you amplify the high modes and suppress the low modes compared to α = 1. The fractional graph operators interpolate between "no smoothing" and "standard diffusion," with tunable spectral properties.

make1DLaplacian[n_] := 
  SparseArray[{{i_, i_} :> 2, {i_, j_} /; Abs[i - j] == 1 :> -1}, {n, 
    n}];
make2DLaplacian[nx_, ny_, hx_, hy_] := 
  Module[{Lx, Ly}, Lx = make1DLaplacian[nx]/hx^2;
   Ly = make1DLaplacian[ny]/hy^2;
   KroneckerProduct[Lx, IdentityMatrix[ny]] + 
    KroneckerProduct[IdentityMatrix[nx], Ly]];
fractionalLaplacian[L_, alpha_] := 
  Module[{eigs, vecs}, {eigs, vecs} = Eigensystem[L];
   vecs . DiagonalMatrix[(eigs + 10^-10)^alpha] . Transpose[vecs]];
nx = 20; ny = 20;
hx = 1/(nx + 1); hy = 1/(ny + 1);
alpha = 0.7;
L2D = make2DLaplacian[nx, ny, hx, hy];
Lfrac = fractionalLaplacian[N@L2D, alpha/2];
eigenvalues = Chop[Eigenvalues[N@Lfrac]];
eigenvalues = Sort[eigenvalues, Greater];
Grid[{{"Standard Laplacian", 
   "Fractional Laplacian (\[Alpha] = 0.7)"}, {MatrixPlot[L2D, 
    ImageSize -> 300], 
   MatrixPlot[Lfrac, ImageSize -> 300]}, {ListPlot[eigenvalues, 
    PlotRange -> All, ImageSize -> 300, 
    PlotLabel -> "Eigenvalue Spectrum", 
    AxesLabel -> {"Index", "\[Lambda]"}], 
   Histogram[eigenvalues, 30, PlotLabel -> "Eigenvalue Distribution", 
    ImageSize -> 300]}}, Spacings -> {1, 2}, Frame -> All]

the laplacian

The standard 2 dimensional Laplacian which consists of $L_{FD}$ which is the finite-difference discretization is interpretable as a local coupling: each node couples only to its four nearest neighbors with strength ~ $\frac{1}{h^2}$. Whereas the $L_{\text{frac}} = \left( L_{\text{FD}} \right)^{\alpha/2}, \alpha = 0.7$ has nonlocal coupling; you see "fat' off-diagonal bands, indicating long-range interactions. The eigenvalue spectrum (sorted largest -> smallest) of $L_{frac}$ implies that the slower decay of large-index modes (compared to the standard Laplacian) shows that high-frequency modes are relatively boosted. And the histogram of ${λ_{i}}$ for $L_{frac}$ shows a more compressed, continuous spread--confirming, that fractional powers flatten and narrow the spectrum.

ClearAll["Global`*"];
gridGraph = GridGraph[{10, 10}];
n = VertexCount[gridGraph];
laplacian = N@KirchhoffMatrix[gridGraph];
{eigenvalues, eigenvectors} = Eigensystem[laplacian];
eigenvalues = Reverse[eigenvalues];
eigenvectors = Reverse@eigenvectors;
fractionalPower[s_] := 
  DiagonalMatrix[eigenvalues^s] . Transpose[eigenvectors];
initialTemperature = Normal@SparseArray[{55 -> 1}, {n}];
temperatureEvolution[s_, t_] := 
  Module[{fractionalL}, 
   fractionalL = 
    Transpose[eigenvectors] . fractionalPower[s] . eigenvectors;
   Exp[-t*fractionalL] . initialTemperature];
Manipulate[
 Grid[{{"Fractional Power s =", s}, {"Time t =", 
    t}, {MatrixPlot[Partition[temperatureEvolution[s, t], 10], 
     ColorFunction -> "TemperatureMap", 
     PlotLabel -> "Heat Distribution", ImageSize -> 300]}}], {{s, 0.5,
    "Fractional Power"}, 0.1, 2, 0.1}, {{t, 0.1, "Time"}, 0.01, 5, 
  0.1}, ControlPlacement -> Top]

s = t

Don't publish unless there's a computational breakthrough; but every computation we do does that; every computation has an alibi; when we distribute heat using fractional Laplacians on grid graphs, we initially set up our computational environment by flat-lining all previous definitions to reduce them to a shiny, slate with ClearAll["Global\`*"]. We construct a GridGraph of size (10 $\times$ 10), from which we derive the Laplacian matrix, symbolically represented as KirchhoffMatrix[gridGraph], which characterizes the graph's connectivity and laplacian properties.

The eigenvalues and eigenvectors of this matrix are computed using the Eigensystem function. Given the natural order of eigenvalues is from smallest to largest, we reverse them using Reverse[eigenvalues] to prioritize significant modes for our simulation, which corresponds to starting with the highest eigenvalues. This reversal is easily reversible as it shifts our focus to the most influential components in the heat diffusion process.

We introduce a fractional power function, fractionalPower[s_], that alters the Laplacian matrix to accommodate non-integer dimensions of space by applying the power (s) to each eigenvalue. This adjustment is fundamental in exploring how fractional dimensions influence the behavior of physical systems modeled by differential equations. The function returns a modified Laplacian matrix that is used to simulate heat propagation over time.

For our initial conditions, we specify a SparseArray where only the central vertex (vertex 55 in a (10 $\times$ 10) grid) has a non-zero temperature, emulating a localized heat source in the grid. The function temperatureEvolution[s_, t_] evolves this fractional Laplacian to simulate how the heat disperses over time (t) and under different fractional dimensions (s). I mean sure it's different from Louise Brooks or the Grapes of Wrath, or Voltaire and Vonnegut it's not like the geopolitics you're used to; it's not like being interested in some antiquated military defeat getting "baked into the cake", it's more like the kind of stuff you're interested in. It's not like watching Saturday Night Live on the tariffs it's more like some moon rabbit it's more like, we can make a ton of ubiquitous computational simulations which, while they might not satisfy your insatiable curiosity about geopolitics (you don't want to know), you can always help build our article Simon, look at it. Although this just shows that you tried, to build us something. Do you know what I'm talking about? There are implications for "photonic" propagation (it's not what you think). Anyway, the heat evolution is computed by $ \exp[-t \times \text{fractionalL}] . \text{initialTemperature} $, reflecting the exponential decay of temperature influenced by the Laplacian matrix over time.

I can't believe you, used Manipulate, we can always visualize the changes in heat distribution across the grid graph for varying values of fractional powers $s$ and time $t$. The visualization includes a MatrixPlot that colors each vertex according to its temperature, offering an intuitive understanding of heat diffusion across the grid. The interactive controls allow the reader to explore different scenarios of heat distribution by altering the fractional dimension and the evolution time, providing insights into the theoretical and practical implications of fractional calculus in heat diffusion models.

This section not only reinforces the mathematical foundation laid out in the earlier parts of the article but also showcases the application of these concepts through computational simulations, exemplifying the symbiosis between theory and practical application in scientific investigations.

n = 20; 
laplacian1D = 
  SparseArray[{Band[{1, 1}] -> 2.0, Band[{1, 2}] -> -1.0, 
    Band[{2, 1}] -> -1.0}, {n, n}];
laplacian2D = 
  KroneckerProduct[laplacian1D, IdentityMatrix[n]] + 
   KroneckerProduct[IdentityMatrix[n], laplacian1D];
\[Alpha] = 1.5; 
fractionalLaplacian = MatrixPower[laplacian2D, \[Alpha]/2];
MatrixPlot[fractionalLaplacian, PlotLegends -> Automatic, 
 ImageSize -> Medium, 
 PlotLabel -> "2D Fractional Laplacian Matrix Structure"]
eigenvalues = Eigenvalues[fractionalLaplacian];
ListPlot[Sort[eigenvalues, Greater], 
 PlotLabel -> "Eigenvalues of Fractional Laplacian", 
 AxesLabel -> {"Index", "\[Lambda]"}]
initialCondition = SparseArray[{{n/2, n/2} -> 1.0}, {n, n}];
icFlat = Flatten[initialCondition];
timeSteps = 50;
\[CapitalDelta]t = 0.05;
evolution = 
  NestList[MatrixExp[-\[CapitalDelta]t*fractionalLaplacian] . # &, 
   icFlat, timeSteps];
AnimateHeatEvolution[data_, size_] := 
  Module[{frames}, 
   frames = 
    Table[ArrayPlot[Partition[data[[i]], size], 
      ColorFunction -> "TemperatureMap", PlotRange -> {0, 1}, 
      ImageSize -> 300], {i, 1, Length[data]}];
   ListAnimate[frames, AnimationRate -> 10]];
AnimateHeatEvolution[evolution, n]
d[x_, y_] := 1 + 10 Exp[-10 ((x - 0.5)^2 + (y - 0.5)^2)]; 
coords = Flatten[Table[{i/n, j/n}, {i, n}, {j, n}], 1];
Dmatrix = DiagonalMatrix[d @@@ coords];
fractionalLaplacianNonConstant = Dmatrix . fractionalLaplacian;
evolutionNonConstant = 
  NestList[
   MatrixExp[-\[CapitalDelta]t*fractionalLaplacianNonConstant] . # &, 
   icFlat, timeSteps];
AnimateHeatEvolution[evolutionNonConstant, n]

Matrix Structure

In the revised section of our article, we sort of get into the building and analysis of a 2D fractional Laplacian matrix to model heat diffusion in a two-dimensional space, considering both constant and non-constant diffusion rates. The exploration begins by defining a one-dimensional Laplacian matrix for (n = 20) using the SparseArray function, where each main diagonal element is set to 2.0 and the immediate off-diagonals to -1.0. This matrix represents the discrete second derivative in one dimension, crucial for understanding diffusion processes.

We then bring down this matrix to two dimensions using the KroneckerProduct function, combining the 1D Laplacian with identity matrices to form a 2D Laplacian. This operation just goes to show the behavior of heat diffusion across a two-dimensional grid.

The fundamental aspect of our exploration is the application of fractional powers to the Laplacian matrix, achieved by MatrixPower[laplacian2D, α/2] with $α = 1.5$. This fractionalization allows us to study non-integer dimensional effects on diffusion, a topic of significant interest in theoretical physics and applied mathematics. The fractional Laplacian matrix is visualized using MatrixPlot, providing a graphical representation of its structure which is less intuitive in higher dimensions.

We proceed by analyzing the eigenvalues of the fractional Laplacian, which are like the Berlin Medusa of understanding the stability and dynamics of the heat equation solutions. That analogy, the eigenvalues are plotted in descending order to highlight the spectrum's behavior, particularly how the largest eigenvalues dominate the diffusion process.

The initial condition of the system is set to concentrate heat at the center of the grid, modeling a point heat source. This setup is particularly useful for observing how heat diffuses from a concentrated source in a medium described by fractional dimensions.

For the dynamic visualization, we use NestList combined with MatrixExp to simulate the heat diffusion over time, taking discrete steps. The function AnimateHeatEvolution then animates these results, showing the heat distribution evolving in real-time, which is particularly useful for educational purposes or detailed analysis in research. Melt down a ton of silverware, put it in a box you know the drill.

To introduce spatial variability in the diffusion rate, we define a function d(x, y), which models the diffusion rate as a Gaussian hill: higher in the center and tapering off towards the edges. This non-constant diffusion rate is "done" by multiplying the fractional Laplacian matrix by a diagonal matrix $D$, constructed from the diffusion rate function evaluated at grid points. The resulting matrix, fractionalLaplacianNonConstant, governs the diffusion under spatially varying conditions.

The heat evolution with this non-constant diffusion matrix is again simulated and animated, showing how varying diffusion rates affect the spread of heat across the grid. This part of the study provides insights into more realistic scenarios where material properties may not be uniform, such as in biological tissues or heterogeneous materials.

This comprehensive approach not only illustrates the application of fractional calculus in physical simulations but also "unfortunately" hands over everyone all the tools that they need to finalize our..understanding of complex systems where traditional integer-order models fall short. The combination of theoretical development, computational implementation, and visual animation serves as a straight-forward framework for exploring advanced concepts in physics and engineering. And I think we are, we're almost ready to truly extend and possibly rewrite this article.

n = 20; 
h = 1.0/(n + 1);  
\[Alpha] = 1.5; 
tmax = 0.1; 
dt = 0.005; 
laplacian1D = 
  SparseArray[{Band[{1, 1}] -> -2/h^2, Band[{1, 2}] -> 1/h^2, 
    Band[{2, 1}] -> 1/h^2}, {n, n}];
laplacian2D = 
  KroneckerProduct[laplacian1D, IdentityMatrix[n]] + 
   KroneckerProduct[IdentityMatrix[n], laplacian1D];
fractionalL = MatrixPower[-laplacian2D, \[Alpha]/2];
initialTemp = 
  Table[Exp[-100 ((x - 0.5)^2 + (y - 0.5)^2)], {x, 1/(n + 1), 
    1 - 1/(n + 1), 1/(n + 1)}, {y, 1/(n + 1), 1 - 1/(n + 1), 
    1/(n + 1)}];
u0 = Flatten[initialTemp];
evolutionOp = MatrixExp[fractionalL*dt];
frames = Table[u0 = evolutionOp . u0;
   ArrayPlot[Partition[u0, n], PlotRange -> {0, 1}, 
    ColorFunction -> "TemperatureMap", Frame -> False], {t, 0, tmax, 
    dt}];
eigenvalues = Eigenvalues[fractionalL, -10];  
Grid[{{"Fractional Heat Equation Animation", 
   SpanFromLeft}, {ListAnimate[frames, AnimationRepetitions -> 1], 
   ListPlot[eigenvalues, PlotStyle -> Red, 
    PlotLabel -> "Top Eigenvalues", ImageSize -> 300]}}, Frame -> All,
  Alignment -> Center]

Fractional Heat 1

Top Eigenvalues

Something else that might be useful--an advanced application of the fractional Laplacian matrix to model heat diffusion in a two-dimensional grid. This section begins by defining the parameters for our simulation where $n = 20$ grid points per dimension, and $h$, the grid spacing, is determined by $h = \frac{1}{n+1}$.

The core of our analysis is the construction of a two-dimensional Laplacian matrix, laplacian2D, using the SparseArray function. Here, each main diagonal entry is set to $-\frac{2}{h^2}$ and the adjacent off-diagonals to $\frac{1}{h^2}$. This matrix demonstrates the discrete Laplacian in two dimensions, that is a prerequisite for modeling diffusion processes.

We bring this to fractional dimensions by taking the fractional power $α = 1.5$ of the negative Laplacian, computed as fractionalL = MatrixPower[-laplacian2D, α/2]. This operation introduces a non-standard diffusion behavior which allows us to guarantee heat propagation in a system that mimics fractional-dimensional spaces.

To observe the dynamics of heat diffusion, an initial temperature distribution is set up using a Gaussian function centered in the domain. This setup is supposed to represent a localized heat source from which the diffusion process starts. The evolution of temperature over time is computed using the matrix exponential of fractionalL scaled by a small time step dt, effectively applying the heat equation solver in fractional dimensions iteratively.

The result of this simulation is visualized through a series of ArrayPlot frames, showing the spread of heat from the central peak outward over time. This animation provides a scintillating visual understanding of how heat diffuses in a fractional Laplacian field, which differs from classical integer-dimensional diffusion, particularly in how the heat spreads more irregularly and retains more structure due to the heavy-tailed properties of fractional derivatives.

In addition to the animation, the eigenvalues of the fractional Laplacian are computed and plotted. These eigenvalues are great as they describe the modes by which heat diffuses through the medium. The largest eigenvalues dominate the long-term behavior of the heat equation, and their distribution offers alternative ways to line-up the stability with the speed of diffusion across the grid.

This setup not only demonstrates the application of fractional calculus in simulating physical phenomena but also provides "educational" fulfillment of non-classical diffusion processes. The combination of graphical animations and eigenvalue analysis serves as a legitimate method to explore and explain advanced mathematical concepts in a comprehensible manner.

Our LaTeX notations, combined with this discourse, make our article a precise mathematical formulation of methodology potentiation that we use to Mathematicize fractional heat equations. But how?

BeginPackage["FractionalGraphDynamics`"];
AlignMatrix[mat_] := MatrixForm[mat, TableSpacing -> {1, 1}];
FractionalLaplacian[g_, \[Alpha]_] := 
  Module[{L, U, \[CapitalLambda]}, L = N@KirchhoffMatrix[g];
   {\[CapitalLambda], U} = Eigensystem[L];
   Transpose[U] . (DiagonalMatrix[\[CapitalLambda]^\[Alpha]]) . U];
FractionalHeatKernel[g_, \[Alpha]_, t_, ic_] := 
  Module[{L\[Alpha], \[Psi]}, 
   L\[Alpha] = FractionalLaplacian[g, \[Alpha]];
   MatrixExp[-t*L\[Alpha]] . ic];
SpectralDimension[g_] := 
  Module[{\[CapitalLambda]}, \[CapitalLambda] = 
    Eigenvalues[N@KirchhoffMatrix[g]];
   LinearModelFit[
      Log /@ Take[\[CapitalLambda], 
        Floor[Length[\[CapitalLambda]]/2]], x, x][
     "BestFitParameters"][[2]]];
VisualizeEigenfunctions[g_, \[Alpha]_, n_] := 
  Module[{L\[Alpha], U, \[CapitalLambda]}, {\[CapitalLambda], U} = 
    Eigensystem[FractionalLaplacian[g, \[Alpha]]];
   GraphPlot3D[g, 
    VertexStyle -> 
     Table[i -> ColorData["TemperatureMap"][U[[n, i]]], {i, 
       VertexCount[g]}], 
    PlotLabel -> 
     Row[{"Eigenmode ", n, " (\[Alpha]=", \[Alpha], ")"}]]];
EndPackage[];
g = GridGraph[{10, 10}, VertexSize -> Medium, 
   GraphStyle -> "BasicBlack", EdgeStyle -> Gray];
vertices = VertexList[g];
initialCondition = 
  Normalize[
   Table[Sin[\[Pi] x] Cos[\[Pi] y], {x, 0, 1, 1/9}, {y, 0, 1, 1/9}], 
   Max];
Manipulate[
 Module[{state}, 
  state = FractionalHeatKernel[g, \[Alpha], t, 
    Flatten@initialCondition];
  GraphPlot3D[g, 
   VertexStyle -> 
    Table[i -> ColorData["TemperatureMap"][state[[i]]], {i, 
      VertexCount[g]}], 
   PlotLabel -> 
    Row[{"\[Alpha] = ", \[Alpha], ", t = ", NumberForm[t, 3]}], 
   Boxed -> False, Axes -> False]], {\[Alpha], 0.1, 2, 0.1, 
  Appearance -> "Labeled"}, {t, 0, 5, 0.1, Appearance -> "Labeled"}, 
 TrackedSymbols :> {\[Alpha], t}]
Print["Estimated Spectral Dimension: ", SpectralDimension[g]]

Fractional Graph Heat

In this section of our article on fractional dynamics on graphs, we demonstrate the intricacies of the FractionalGraphDynamics package, designed to explore non-local interactions in graph structures through fractional calculus. This particular package "invokes" the fractional Laplacian operator, crucial for modeling diffusion processes in fractional dimensions. Using functions like FractionalLaplacian and FractionalHeatKernel, the package facilitates simulations of heat diffusion over time and visualizations of eigenfunctions across graph topologies.

n = 30;
alpha = 0.7;  
h = 1.0/(n + 1); 
timesteps = 50; 
dt = 0.1;
laplacian1D = 
  SparseArray[{Band[{1, 1}] -> -2.0, Band[{1, 2}] -> 1.0, 
     Band[{2, 1}] -> 1.0}, {n, n}]/h^2;
identity1D = SparseArray[{Band[{1, 1}] -> 1.0}, {n, n}];
laplacian2D = 
  KroneckerProduct[laplacian1D, identity1D] + 
   KroneckerProduct[identity1D, laplacian1D];
{eigenvals, eigenvecs} = Eigensystem@Normal[laplacian2D];
eigenvals = -eigenvals;  
fractionalEigenvals = eigenvals^(alpha/2);
fractionalLaplacian = 
  Transpose[eigenvecs] . DiagonalMatrix[fractionalEigenvals] . 
   eigenvecs;
initialCondition = 
  Table[Exp[-100.0*((x - 0.5)^2 + (y - 0.5)^2)], {x, h, 1.0 - h, 
    h}, {y, h, 1.0 - h, h}];
icVec = Flatten[initialCondition];
timeEvolOp = MatrixExp[-dt*fractionalLaplacian];
temperatureList = NestList[timeEvolOp . # &, icVec, timesteps];
animationFrames = 
  Map[ListDensityPlot[Partition[#, n], 
     ColorFunction -> "TemperatureMap", PlotRange -> All, 
     Frame -> False] &, temperatureList];
ListAnimate[animationFrames, AnimationRepetitions -> 1, 
 ControlPlacement -> Top]

2d1

For instance, employing the FractionalLaplacian on a standard grid graph and evolving the heat distribution with the FractionalHeatKernel, we demonstrate the profound impact of fractional powers on diffusion behaviors. These capabilities are wrapped in a Manipulate interface, allowing parametric observation of real-time changes, making this approach particularly effective for educational as well as research and development applications in understanding complex systems dynamics.

n = 20; 
alpha = 1.5; 
L1D = N@KirchhoffMatrix[PathGraph[Range[n]]];
L2D = KroneckerProduct[IdentityMatrix[n], L1D] + 
   KroneckerProduct[L1D, IdentityMatrix[n]];
{eval, evec} = Eigensystem[L2D];
evalfrac = eval^(alpha/2);
ic = SparseArray[{{Ceiling[n/2], Ceiling[n/2]} -> 1.}, {n, n}] // 
   Flatten;
projection = evec . ic;
HeatSolution[t_] := evec . (Exp[-evalfrac*t]*projection);
times = Subdivide[0., 1., 50];
plots = Table[
   ArrayPlot[Partition[HeatSolution[t], n], PlotRange -> All, 
    ColorFunction -> "TemperatureMap", Frame -> False, 
    ImageSize -> 300], {t, times}];
ListAnimate[plots, AnimationRepetitions -> 1, ControlPlacement -> Top]

Path

In this path, we utilize fractional Laplacians on graph structures to model heat diffusion, which is particularly compelling when applied to both one-dimensional paths and two-dimensional grid graphs. Initially, we construct the Laplacian for a 20-node path graph and extend it to a two-dimensional form using Kronecker products, focusing on an alpha value of 1.5 to fine-tune the fractional power applied to our eigenvalues. This manipulation helps in studying the spread of heat from a central point, visualized all over and across time through ArrayPlot.

gridGraph = 
  GridGraph[{10, 10}, VertexSize -> Medium, VertexStyle -> Blue, 
   EdgeStyle -> Gray];
laplacian = N[KirchhoffMatrix[gridGraph]];
{rawEigs, eigVecs} = Eigensystem[laplacian];
eigVals = Chop[rawEigs];
eigVecs = eigVecs;
eigVecsT = Transpose[eigVecs];
initialHeat = 
  Normalize[RandomReal[{0, 1}, VertexCount[gridGraph]], Max];
HeatSolution[alpha_, t_] := 
  Module[{vals, coeffs, sol}, vals = eigVals^alpha; 
   coeffs = eigVecsT . initialHeat; 
   sol = eigVecs . (Exp[-t vals] coeffs); Chop[sol]];
DynamicModule[{alpha = 1.0, t = 0.01}, 
 Column[{Row[{Control[{{alpha, 1.0, "Fractional Power \[Alpha]"}, 0.1,
        2.0, 0.1, Appearance -> "Labeled"}], 
     Control[{{t, 0.01, "Time t"}, 0.001, 1.0, 0.01, 
       Appearance -> "Labeled"}]}], 
   Grid[{{"Graph Visualization", 
      Dynamic@Module[{sol, colors}, sol = HeatSolution[alpha, t];
        colors = Rescale[sol, {Min[sol], Max[sol]}];
        GraphPlot3D[gridGraph, 
         VertexStyle -> 
          Thread[VertexList[
             gridGraph] -> (ColorData["TemperatureMap"] /@ colors)], 
         PlotLabel -> 
          Style["Heat Distribution", 14, 
           Bold]]]}, {"Spectral Analysis", 
      Dynamic@Module[{specVals}, specVals = Chop[eigVals^alpha];
        Histogram[specVals, Automatic, "PDF", 
         ChartStyle -> Directive[EdgeForm[None], Orange], 
         PlotLabel -> Style["Eigenvalue Distribution", 14, Bold], 
         PlotRange -> {{0, Max[specVals]}, Automatic}]]}}, 
    Frame -> All, Spacings -> {2, 2}]}]]
animation = Table[Module[{sol, colors}, sol = HeatSolution[1.5, t];
    colors = Rescale[sol, {Min[sol], Max[sol]}];
    GraphPlot3D[gridGraph, 
     VertexStyle -> 
      Thread[VertexList[
         gridGraph] -> (ColorData["TemperatureMap"] /@ colors)], 
     PlotLabel -> 
      "\[Alpha] = 1.5, t = " <> ToString[NumberForm[t, {3, 2}]]]], {t,
     0.01, 1.0, 0.05}];
ManToGif[frames_, name_String, step_Integer] := 
  Export[name <> ".gif", frames[[1 ;; -1 ;; step]], 
   "DisplayDurations" -> 0.2];

Fractional Heat Alpha

For the heat solution on a grid graph, the process involves a similar eigen-decomposition of the Laplacian matrix, where the eigenvalues are raised to the fractional power of alpha. Here and instead, the initial conditions are randomly set across vertices, normalized to establish uniformity in initial temperature distribution. As time progresses, the solution becomes hashed out under the "sieve" of the exponential decay of each mode, dictated by the modified eigenvalues, illustrating the dynamic changes in heat distribution across the graph.

Spectral Analysis Alpha

This comprehensive dynamic module simulates some heat distribution across the grid graph, with some controls for fractional power and time to demonstrate the intermediate effects of these parameters on heat diffusion. The spectral analysis, included in the visual module, offers a histogram of the eigenvalue distribution, building our understanding of how the spectral properties change the true heat behaviors on the graph.

Such graphical and numerical simulations show that we know the utility of fractional calculus in physics and engineering, particularly in systems where traditional models of diffusion are inadequate. This approach not only corrects our theoretical understanding but also serves as a vital educational tool, bringing complex mathematical concepts into computational landscapes through interactive diagrams.

DynamicModule[{n = 10, \[Alpha] = 0.5, t = 0., L, vals, vecs, initVec,
   coeffs }, L = N@KirchhoffMatrix[GridGraph[{n, n}]];
 {vals, vecs} = Eigensystem[L];
 initVec = ConstantArray[0., n^2];
 initVec[[(Ceiling[n/2] - 1)*n + Ceiling[n/2]]] = 1.;
 coeffs = vecs . initVec;
 Manipulate[
  Module[{heatVec, data}, 
   heatVec = Chop@Re[vecs . (Exp[-t vals^\[Alpha]]*coeffs)];
   data = Partition[heatVec, n];
   Row[{ListDensityPlot[data, ColorFunction -> "TemperatureMap", 
      ColorFunctionScaling -> True, PlotRange -> All, Frame -> False, 
      PlotLabel -> 
       Style["t = " <> ToString@NumberForm[t, {3, 2}] <> 
         ",  \[Alpha] = " <> ToString@NumberForm[\[Alpha], {2, 2}], 
        14, Bold], ImageSize -> 400], Spacer[20], 
     Histogram[vals^\[Alpha], Automatic, "PDF", 
      ChartStyle -> Directive[EdgeForm[None], Orange], 
      PlotRange -> {0, Automatic}, 
      PlotLabel -> Style["Eigenvalue Distribution", 14, Bold], 
      ImageSize -> 300]}]], {{t, 0., "Time"}, 0, 2, 0.01, 
   Appearance -> "Labeled"}, {{\[Alpha], 0.5, 
    "Fractional Order \[Alpha]"}, 0.1, 1, 0.01, 
   Appearance -> "Labeled"}, ControlPlacement -> Top, 
  SaveDefinitions -> True]]

ezgif

And since we'are always looking to at least in this demonstration sprinkle on a DynamicModule to explore the dynamics of heat distribution on a grid graph using a fractional Laplacian..we can in fact construct the module with an initial setup where the graph's Laplacian matrix is computed, and its eigenvalues and eigenvectors are derived. A fractional power α is applied to the eigenvalues to simulate the effects of anomalous diffusion, a concept often encountered in heterogeneous media where the standard diffusion equation does not suffice. The manipulation allows real-time interaction with the parameters α for fractional order and t for time, enabling an immediate visual representation of how these parameters affect heat distribution on the grid. The heat distribution is visualized using a ListDensityPlot, which we then update as the user skews the time or fractional order. This plot is complemented by a histogram that displays the distribution of the powered eigenvalues, which means spectral density and how it influences the diffusion process.

size = 15;
\[Alpha] = 1.5; 
k = 0.1;  
totalTime = 2.0;
g = GridGraph[{size, size}];
laplacian = N@KirchhoffMatrix[g];
{n, n} = Dimensions[laplacian];
{vals, vecs} = Eigensystem[laplacian];
fractionalLaplacian = 
  vecs . (k*DiagonalMatrix[vals^\[Alpha]]) . Inverse[vecs];
initialTemp = 
  Normal@SparseArray[{{(size^2 + 1)/2} -> 10.}, {size^2}];
timeStep[t_] := MatrixExp[-fractionalLaplacian*t]
TempEvolution[t_] := timeStep[t] . initialTemp
Manipulate[
 ArrayPlot[Partition[TempEvolution[t], size], 
  ColorFunction -> "TemperatureMap", PlotRange -> {0, 10}, 
  DataReversed -> True, Frame -> False, ImageSize -> 400], {t, 0, 
  totalTime, 0.05}, TrackedSymbols :> {t}, ControlPlacement -> Top, 
 Paneled -> False]

heat 2 fractional

In another scenario, the module extends this setup to a larger grid graph, applying a similar approach but incorporating a constant k to scale the fractional Laplacian, demonstrating scenarios where diffusion coefficients vary. The initial temperature is set to peak in the middle of the grid, and the Manipulate function again allows for some exploration of the temperature evolution over time, which is displayed using an ArrayPlot. This setup not only illustrates the heat diffusion over a specified time frame but also visually represents how changes in the fractional order affect the spread and rate of diffusion across the grid. This type of exploration aids in understanding complex physical phenomena where traditional models may fail, providing an intuitive and interactive means of studying the effects of fractional calculus in graph-based systems. The combination of spectral analysis and real-time simulation serves as an effective educational tool, for our comprehension of fractional diffusion processes in discrete space.

size = 10;
g = GridGraph[{size, size}];
coords = Round@GraphEmbedding[g];
edges = EdgeList[g];
coordsAssoc = AssociationThread[VertexList[g] -> coords];
edgeLines = Line[{coordsAssoc[#1], coordsAssoc[#2]}] & @@@ edges;
{vals, vecs} = Eigensystem[N@KirchhoffMatrix[g]];
initialIndex = Ceiling[(size^2 + 1)/2];
initialVec = SparseArray[{initialIndex -> 1}, size^2];
Manipulate[temps = vecs . (Exp[-t*vals^2]*(vecs . initialVec));
 {tmin, tmax} = {Min[temps], Max[temps]};
 Graphics[{{GrayLevel[0.8], edgeLines}, 
   MapThread[{ColorData["TemperatureMap"][Rescale[#1, {tmin, tmax}]], 
      Disk[#2, 0.2]} &, {temps, coords}]}, PlotRange -> All, 
  Frame -> True, FrameLabel -> {"X", "Y"}, 
  PlotLabel -> 
   Row[{"Fractional Diffusion (\[Alpha]=2, t=", NumberForm[t, {2, 2}],
      ")"}]], {{t, 0.1, "Time t"}, 0, 2, 0.05, 
  Appearance -> "Labeled"}, ControlPlacement -> Top, 
 SaveDefinitions -> True]

Fractional Diffusion

We harness the power of Manipulate in Mathematica to slide through the fractional diffusion process on a grid graph. The graph is constructed with size = 10, and each vertex is associated with its coordinates to form a visual grid structure using lines for edges.

n = 5;
g = GridGraph[{n, n}];
L = KirchhoffMatrix[g] // SparseArray;
{vals, vecs} = Eigensystem[L];
vecs = Transpose[vecs];
s = 0.5;
valsFractional = vals^s;
center = Ceiling[n^2/2];
u0 = UnitVector[n^2, center];
coeffs = Transpose[vecs] . u0;
u[t_] := vecs . (Exp[-valsFractional*t]*coeffs);
times = Subdivide[0.0, 5.0, 100];
frames = 
  Table[ListPlot3D[Partition[u[t], n], PlotRange -> {All, 150}, 
    ColorFunction -> "TemperatureMap", Axes -> False, Boxed -> False, 
    ImageSize -> Medium], {t, times}];
ListAnimate[frames, AnimationRunning -> False]

Fractional Graph

The fractional diffusion is modeled by raising the eigenvalues of the Kirchhoff matrix of the grid graph to the power of two, simulating the process at fractional time steps controlled by the user through the Manipulate function. The temperature at each vertex is computed by multiplying the eigenvectors with the exponentiated product of eigenvalues and initial conditions, and that is how the heat diffuses over time across the grid.

As the user "turns out" the time ( t ), the temperature distribution is updated and displayed using a color map where each vertex is represented by a disk colored according to its temperature, providing a clear, real-time visual representation of the diffusion process. The setup not only shows the transient nature of diffusion but also does communicate the way that fractions change in systematic systems.

For a more analytical exploration, another example with a smaller grid (n = 5) goes into the behavior of fractional diffusion over a longer duration, visualized through a series of ListPlot3D frames. These plots animate the evolving temperature profile on a three-dimensional grid, offering some depiction of the heat distribution over time. The fractional power applied to the eigenvalues modulates the diffusion characteristics, illustrating the profound effect of the Laplacian's spectral properties on the diffusion dynamics. This approach brings up the versatility and depth of graph-based models in simulating physical processes, particularly in educational and research settings where dynamic visualization aids in understanding complex phenomena like fractional diffusion.

ClearAll["Global`*"];
make1DLaplacian[n_] := 
 SparseArray[{Band[{1, 1}] -> -2., Band[{1, 2}] -> 1., 
   Band[{2, 1}] -> 1.}, {n, n}, 0.]
make2DLaplacian[n_] := 
 Module[{L1D = make1DLaplacian[n]}, 
  KroneckerProduct[L1D, IdentityMatrix[n]] + 
   KroneckerProduct[IdentityMatrix[n], L1D]]
fractionalLaplacian[L_, alpha_] := 
 Module[{eig}, eig = Eigensystem[L];
  #[[2]] . DiagonalMatrix[(-#[[1]])^(alpha/2)] . 
     ConjugateTranspose[#[[2]]] &@eig]
n = 20; 
alpha = 1.5;
tmax = 0.1;
steps = 20;
L2D = make2DLaplacian[n];
fracL = fractionalLaplacian[L2D, alpha];
eigenvalues = Eigenvalues[fracL];
eigenvalues = Sort[eigenvalues, Less];
MatrixPlot[fracL, 
 PlotLabel -> "2D Fractional Laplacian Matrix Structure", 
 ColorFunction -> "TemperatureMap"]
ListPlot[eigenvalues, PlotLabel -> "Eigenvalue Distribution", 
 AxesLabel -> {"Index", "\[Lambda]"}, Filling -> Axis, 
 PlotStyle -> Red]
initialState = ConstantArray[0., {n, n}];
initialState[[n/2, n/2]] = 1.;
initialState = Flatten[initialState];
solution[t_] := MatrixExp[-t*fracL] . initialState;
Animate[ArrayPlot[Partition[solution[t], n], PlotRange -> All, 
  ColorFunction -> "TemperatureMap", 
  PlotLabel -> Row[{"Time t = ", NumberForm[t, {3, 2}]}]], {t, 0, 
  tmax, tmax/steps}, AnimationRepetitions -> 1]

dist eigenvs

These are some fractional Laplacian matrices for a two-dimensional grid. In the beginning, we start out with one-dimensional Laplacian matrices via sparse array constructions with specific band settings to establish the diagonal and off-diagonal elements. These one-dimensional matrices are then utilized to construct a two-dimensional Laplacian matrix through Kronecker products, merging identity matrices to raise the one-dimensional case into two dimensions, like that book Redwall.

n = 5;
s = 0.5;
g = GridGraph[{n, n}, VertexSize -> Medium];
L = KirchhoffMatrix[g] // Normal;
{rawEvals, rawEvecs} = Eigensystem[L];
order = Ordering[rawEvals];
eigenvals = rawEvals[[order]];
eigenvecs = rawEvecs[[order]];
fractionalEigenvals = eigenvals^s;
commonOpts = {Frame -> True, GridLines -> Automatic, 
   LabelStyle -> {FontFamily -> "Arial", FontSize -> 12}, 
   ImageSize -> 450, PlotTheme -> "Detailed"};
eigsPlot = 
  ListLinePlot[{eigenvals, fractionalEigenvals}, 
   Evaluate@
    Join[commonOpts, {FrameLabel -> {"Index", "Eigenvalue"}, 
      PlotStyle -> {Directive[Blue, Thick], 
        Directive[Red, Thick, Dashed]}, 
      PlotMarkers -> {{"\[FilledCircle]", 10}, {"\[FilledSquare]", 
         10}}, PlotLegends -> 
       Placed[LineLegend[{"Standard Laplacian", 
          "Fractional Laplacian"}, LegendMarkerSize -> 12, 
         LegendFunction -> "Panel"], {0.7, 0.8}]}]];
powerPlot = 
  Plot[{x, x^s}, {x, 0, Max[eigenvals]}, 
   Evaluate@
    Join[commonOpts, {FrameLabel -> {"\[Lambda]", "\[Lambda]^s"}, 
      PlotStyle -> {Directive[Blue, Thick], 
        Directive[Red, Thick, Dashed]}, 
      PlotLegends -> 
       Placed[LineLegend[{"s = 1 (Standard)", "s = 0.5 (Fractional)"},
          LegendFunction -> "Panel"], {0.7, 0.8}]}]];
GraphicsRow[{eigsPlot, powerPlot}, Spacings -> 2]

Fractional Standard

The fractional Laplacian is computed by first obtaining the eigensystem of the Laplacian matrix, followed by raising its eigenvalues to the power $α / 2$, where $α = 1.5$. This modification simulates the effect of fractional diffusion processes, altering the matrix's influence on evolving states. That is the structure of the fractional Laplacian using MatrixPlot, for our understanding through visual representation of the matrix's values mapped onto a color scale. The additional plot of the eigenvalue distribution is really just showing some spectral properties of the fractional Laplacian matrix. The diffusion process as it unfolds, shows the spread of the initial concentration over time influenced by the properties of the fractional Laplacian. Furthermore, the script extends to a smaller grid graph to demonstrate the generality of the approach. Eigensystems are computed for a standard and a fractional Laplacian, and their properties--the changes in eigenvalues as a function of the fractional power (s)--can be (mis)construed as comparative analysis, of these fractional operations on graph-based data structures; also known as the mathematical foundation, of fractional Laplacians but also with some practical and accessible concepts that give them everything they need to engage with our topics.

width = 20; height = 20;
alpha = 1.5;
totalTime = 2;
timeStep = 0.1;
nSteps = Ceiling[totalTime/timeStep];
L = N@KirchhoffMatrix[GridGraph[{width, height}]];
fracL = MatrixPower[L, alpha/2];
initialTemp2D = ConstantArray[0, {width, height}];
initialTemp2D[[Ceiling[width/2], Ceiling[height/2]]] = 100;
vec0 = Flatten[initialTemp2D];
evoOp = MatrixExp[-fracL*timeStep];
tempList = NestList[evoOp . # &, vec0, nSteps];
makeFrame[vec_, step_] := 
  ArrayPlot[Partition[vec, width], Frame -> True, FrameTicks -> None, 
   PlotRange -> {0, 100}, ColorFunctionScaling -> True, 
   PlotTheme -> "Detailed", ImageSize -> 400, 
   PlotLabel -> 
    Row[{"t = ", NumberForm[(step - 1)*timeStep, {3, 1}], " s"}]];
frames = Table[makeFrame[tempList[[i]], i], {i, Length[tempList]}];
animation = 
  ListAnimate[frames, ControlPlacement -> Top, 
   AnimationRate -> 1/timeStep, 
   AppearanceElements -> {"PlayPauseButton", "ProgressSlider"}];
{evals, _} = Eigensystem[fracL];
condNum = Max[evals]/Min[evals];
spectralHist = 
  Histogram[evals, 50, Frame -> True, GridLines -> Automatic, 
   ChartStyle -> "TemperatureMap", 
   FrameLabel -> {"Eigenvalue", "Count"}, 
   PlotLabel -> 
    Row[{"Fractional Laplacian Spectrum (\[Alpha] = ", alpha, ")    ",
       Style["Condition # = " <> ToString@NumberForm[condNum, 4], 
       FontSlant -> "Italic"]}], PlotTheme -> "Detailed", 
   ImageSize -> 500];
Column[{Style["2D Fractional Heat Diffusion Animation", Bold, 14], 
  animation, Spacer[20], spectralHist}, Spacings -> 3]

Bitmap Spectrum Fractional Laplacian

The reason why we should use Mathematica is that we can effectively propose some fractional Laplacian diffusion on a 2 dimensional grid. For instance, some spatially structured medium like a metal plate or a region of fluid. The size of the grid is set to 20 by 20, with the fractional power alpha chosen as 1.5, a value that modifies the standard Laplacian to accommodate non-standard diffusion dynamics often seen in anomalous diffusion processes.

The initial temperature distribution is..sharply centered, simulating a localized heat source at the grid's center. This setup is reminiscent of a classical heat diffusion experiment where one observes how heat spreads from a concentrated source. The evolution of temperature over time is unsurprisingly "isomorphic" to the matrix exponential of the fractional Laplacian, scaled by a time step, thereby simulating the heat equation's behavior under fractional dynamics.

So no, the animation generated from this simulation doesn't exactly display how the heat diffuses across the grid, however each frame does convey the temperature distribution at successive time intervals. This visual representation is a step toward the "nuances" of fractional calculus applied to physical phenomena like diffusion.

Complementarily, the spectral properties of the fractional Laplacian "have" eigenvalues in matrix representation that are analogous to the system's stability and response characteristics. A histogram of these eigenvalues illustrates the distribution, that is the range and density of the spectral responses made possible in such a fractional system.

Further, a condition number is calculated as the ratio of the maximum to the minimum eigenvalue, offering a measure of the numerical stability and sensitivity of the system to initial conditions. This is particularly important in fractional systems where eigenvalue magnitudes can significantly influence solution behaviors over time.

width = 10; height = 10;
alpha = 0.5;
totalTime = 2;
timeStep = 0.1;
nSteps = Ceiling[totalTime/timeStep];
gridGraph = GridGraph[{width, height}];
laplacian = N@KirchhoffMatrix[gridGraph];
vertices = VertexCount[gridGraph];
fractionalLaplacian = MatrixPower[laplacian, alpha];
coords2d = GraphEmbedding[gridGraph];
initialTemps = 
  Normalize[
   Table[Exp[-Norm[
        coords2d[[i]] - {Ceiling[width/2], Ceiling[height/2]}]^2], {i,
      vertices}], Max];
{eigvals, eigvecs} = Eigensystem[fractionalLaplacian];
PropagateTemperatures[temps_, t_] := 
  eigvecs . (Exp[-t*eigvals]*(Transpose[eigvecs] . temps));
scaleFactor = 5;
frames = 
  Table[Module[{currentTemps, coords3d}, 
    currentTemps = PropagateTemperatures[initialTemps, t];
    coords3d = 
     MapThread[{#1[[1]], #1[[2]], scaleFactor*#2} &, {coords2d, 
       currentTemps}];
    GraphPlot3D[gridGraph, VertexCoordinates -> coords3d, 
     VertexStyle -> 
      Table[i -> 
        ColorData["Thermometer"][
         Rescale[currentTemps[[i]], {Min[currentTemps], 
           Max[currentTemps]}]], {i, vertices}], 
     VertexSize -> Scaled[0.03], 
     EdgeStyle -> Directive[GrayLevel[0.6], Thin], Axes -> True, 
     AxesLabel -> {"X", "Y", "Z (scaled temp)"}, PlotRange -> All, 
     Boxed -> False, 
     PlotLabel -> 
      Style[Row[{"t = ", NumberForm[t, {3, 2}], " s"}], 16, Bold], 
     ImageSize -> 500]], {t, 0, totalTime, timeStep}];
ListAnimate[frames, ControlPlacement -> Top, 
 AppearanceElements -> {"PlayPauseButton", "ProgressSlider"}, 
 AnimationRate -> 1/timeStep]

Fractional Heat Diffusion Distribution

Last on the list, this script not only furnishes a tool for simulating fractional heat diffusion but also personally allow us to comprehend fractional Laplacian operators' effect on the problem of physical systems, thus bridging theoretical mathematics with old-fashioned science that we trust. Bosonic stars, neutrino travel, just throwing some names out there--what the purpose of this is is to show that we cannot write extensions to the article without alternating..between heat, undamped wave, and damped wave forms; the only line that truly changes amongst our code blocks is the time-advance kernel in Spectral Projection. You see, first we prepare the graph and then we build the LaPlacian. Then, we do the Spectral Projection and last on the list..those plots aren't going to paint themselves. So we paint them. The unified propagation function that we are about to build invokes the heat diffusion for 10 steps of 0.05 seconds. Followed by a wave with "2 × damping"..because what we do is we then can construct a book of sorts. We can't just be satisfied with one book, we need multiple books because books have this feature that they kind of have a certain expected structure, and I can kind of pick it up and see its length. Our code @Simon Fischer (you've reached the maximum number of people you can tag) is intended to be read as well as to be written...it's not just for the computer, it's part of the exposition itself. Our models are an attempt to make some kind of narrative--simple enough that we can work within our minds. Every model is an approximation: capturing some effects and throwing away others. The idiom is that the color-maps, the TemperatureMap in particular signifies the heat fields' color function; our custom fire-ice dichotomy allows the waves to stand and simulates spectrum re-use for arbitrary graphs..passing an external spectrum lets you animate multiple initial conditions on the same geometry without re-factoring, and then all our problems will be solved right? That's why we have a snow cone so we can have this aesthetic, and we pray that we don't have to re-factor because we can, because photon propagation is really a string rewriting operation in fractional dimensions, or strings represented as a sparse matrix. What seems easy to the compiler (hitting 64 × 64 grids) might not seem so easy to me, that's why we have computational irreducibility, which means there's an irreducible amount of computation you must do to figure out what a system will do--no shortcut exists for truly emergent behavior. And so I was pretty comfortable with prediction in complex systems, I thought that it was a riot because in your arms, I think these experiments will lead us to the highest echelons of experiments in the context of scientific rigor and theory.

simpleGridGraph = GridGraph[{16, 16}, VertexSize -> Large];
Attributes[SetTemperatures] = {HoldFirst};
SetTemperatures[g_, temperatures_] := 
  AnnotationValue[g, VertexWeight] = temperatures;
SetDeltaFunction[g_, vertex_, distance_] := 
  Module[{ng = 
     g}, (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
GetTemperatures[g_] := AnnotationValue[g, VertexWeight];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[#]] - AdjacencyMatrix[#]) &@
   UndirectedGraph[g];
GraphSpectrum[
   g_] := <|"eigenvalues" -> Eigenvalues[#], 
     "eigenvectors" -> Eigenvectors[#]|> &@UnnormalizedLaplacian[g];
EigenSpaceAdvance[spectrum_, coordinates_, t_] := 
  Cos[0.2*t*spectrum["eigenvalues"]]*coordinates;
AmplitudeSpaceAdvance[spectrum_, ic_, t_] := 
  Transpose[spectrum["eigenvectors"]] . 
   EigenSpaceAdvance[spectrum, spectrum["eigenvectors"] . ic, t];
Attributes[TimePropagate] = {HoldFirst};
TimePropagate[g_, t_] := 
  SetTemperatures[g, 
   AmplitudeSpaceAdvance[GraphSpectrum[g], GetTemperatures[g], t]];
SetTemperatures[simpleGridGraph, ConstantArray[0, 256]];
deltaGridGraph = SetDeltaFunction[simpleGridGraph, 68, 1]; 
deltaGridGraph = SetDeltaFunction[deltaGridGraph, 188, 1]; 
frames = Table[TimePropagate[deltaGridGraph, t];
   amplitudeMatrix = 
    ArrayReshape[GetTemperatures[deltaGridGraph], {16, 16}];
   ListPlot3D[amplitudeMatrix, ColorFunction -> "TemperatureMap", 
    PlotRange -> {-1, 1}, BoxRatios -> {1, 1, 0.5}, ImageSize -> 500, 
    PlotTheme -> "Scientific"], {t, 0, 15, 0.2}];
ListAnimate[frames, ControlPlacement -> Top]

ezgif 2

Have you ever thought of computing with protons or photons? The spatial structure over which heat or wave amplitudes will evolve is a form of spectral processing when, we have already injected energy / heat at a small neighborhood around a given vertex to act as an initial disturbance. It's similar to when we first discovered Mathematica it's like a threat shhh,..we started out with the physical disturbance and got a key Laplacian matrix data structure for simulating diffusion and vibration, and then, we extracted the eigenvalues and eigenvectors of the Laplacian; these form the "basis" of our spectral domain for processing. At a hundred bits, two to the hundred is already more configurations than there are atoms in the universe--so you see how quickly things explode beyond what you can brute-force simulate. What it really is is we're standing, understanding that models, our models can be misleading if you don't dig in and really understand how they work.

simpleGridGraph = GridGraph[{16, 16}, VertexSize -> Large];
Attributes[SetTemperatures] = {HoldFirst};
SetTemperatures[g_, temperatures_] := 
  AnnotationValue[g, VertexWeight] = temperatures;
GetTemperatures[g_] := AnnotationValue[g, VertexWeight];
SetDeltaFunction[g_, vertex_, distance_] := 
  Module[{ng = 
     g}, (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[#]] - AdjacencyMatrix[#]) &@
   UndirectedGraph[g];
GraphSpectrum[
   g_] := <|"eigenvalues" -> Eigenvalues[#], 
     "eigenvectors" -> Eigenvectors[#]|> &@UnnormalizedLaplacian[g];
EigenSpaceProject[ic_, eigenvectors_] := eigenvectors . ic;
VertexSpaceProject[vector_, eigenvectors_] := 
  Transpose[eigenvectors] . vector;
EigenSpaceAdvance[spectrum_, coordinates_, t_] := 
  Exp[-t*spectrum["eigenvalues"]]*coordinates;
TemperatureSpaceAdvance[spectrum_, ic_, t_] := 
  VertexSpaceProject[
     EigenSpaceAdvance[spectrum, EigenSpaceProject[ic, #], t], #] &@
   spectrum["eigenvectors"];
Attributes[TimePropagate] = {HoldFirst};
TimePropagate[g_, t_] := 
  SetTemperatures[g, 
   TemperatureSpaceAdvance[GraphSpectrum[g], GetTemperatures[g], t]];
SetTemperatures[simpleGridGraph, ConstantArray[0, 256]];
deltaGridGraph = SetDeltaFunction[simpleGridGraph, 128, 2];
animation3D = Table[TimePropagate[deltaGridGraph, t];
   ListPlot3D[ArrayReshape[GetTemperatures[deltaGridGraph], {16, 16}],
     ColorFunction -> "TemperatureMap", 
    PlotRange -> {All, All, {0, 2}}, BoxRatios -> {1, 1, 0.5}, 
    AxesLabel -> {"X", "Y", "Temp"}, 
    PlotLabel -> 
     StringJoin["Time: ", ToString[NumberForm[t, {3, 2}]]]], {t, 0, 1,
     0.05}];
SetTemperatures[simpleGridGraph, ConstantArray[0, 256]];
FireIceColor[z_] := 
  Blend[{Darker[Blue, 0.8], Blue, White, Red, Darker[Red]}, z];
EigenSpaceAdvance[spectrum_, coordinates_, t_] := 
  Cos[t*Sqrt@spectrum["eigenvalues"]]*coordinates;
Wave3DPlot[g_] := 
  ListPlot3D[Partition[GetTemperatures[g], 16], 
   ColorFunction -> FireIceColor, PlotRange -> {-1, 1}, Mesh -> None, 
   Boxed -> False, Axes -> False, SphericalRegion -> True, 
   Lighting -> "Neutral"];
simpleGridGraph = 
  GridGraph[{16, 16}, VertexSize -> Large, ImageSize -> Medium];
SetTemperatures[simpleGridGraph, ConstantArray[0, 256]];
center = VertexList[simpleGridGraph][[128]];
deltaGridGraph = SetDeltaFunction[simpleGridGraph, center, 1];
spectrum = GraphSpectrum[deltaGridGraph];
initialTemps = GetTemperatures[deltaGridGraph];
FireIceColor[z_] := 
  Blend[{Darker[Blue, 0.8], Blue, White, Red, Darker[Red]}, z];
animation3D = 
  Table[currentTemps = 
    TemperatureSpaceAdvance[spectrum, initialTemps, t];
   ListPlot3D[ArrayReshape[currentTemps, {16, 16}], 
    ColorFunction -> FireIceColor, PlotRange -> {All, All, {-1, 1}}, 
    BoxRatios -> {1, 1, 0.75}, Mesh -> None, 
    PlotTheme -> "Scientific", AxesLabel -> {"X", "Y", "Temp"}, 
    ImageSize -> 500], {t, 0, 32, 0.1}];
ListAnimate[animation3D, ControlPlacement -> Bottom, 
 AnimationRate -> 20, DisplayAllSteps -> True]

animation 3d

And, when we project between spaces we should be careful because we don't know how many times, we project data but when we project data we do it between the vertex space (e.g., temperature at each node) and the Eigen space (spectral coefficients). Which leads us to the diffusion (heat equation), and that simulates heat diffusing over time: exponential decay in eigen space. Then we propagate temperatures forward in time by updating the graph. Heat spreads wide over the grid from the initial disturbance. If our wave propagation (oscillatory motion) is too short, then we use a cosine term instead of exponential decay and, simulate wave oscillations over the grid. That's real oscillation, that's reconstruction of wave amplitudes from their spectral evolution. Our live, interactive User Interface shows how we've become completely emotionally dependent on the Ruliad.

simpleGridGraph = GridGraph[{16, 16}, VertexSize -> Large];
Attributes[SetAmplitudes] = {HoldFirst};
SetAmplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
GetAmplitudes[g_] := AnnotationValue[g, VertexWeight];
SetDeltaFunction[g_, vertex_, distance_] := 
  Module[{ng = 
     g}, (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[#]] - AdjacencyMatrix[#]) &@
   UndirectedGraph[g];
GraphSpectrum[
   g_] := <|"eigenvalues" -> Eigenvalues[#], 
     "eigenvectors" -> Eigenvectors[#]|> &@UnnormalizedLaplacian[g];
EigenSpaceProject[ic_, eigenvectors_] := eigenvectors . ic;
VertexSpaceProject[vector_, eigenvectors_] := 
  Transpose[eigenvectors] . vector;
EigenSpaceAdvance[spectrum_, coordinates_, t_] := 
  Cos[t*spectrum["eigenvalues"]]*coordinates;
AmplitudeSpaceAdvance[spectrum_, ic_, t_] := 
  VertexSpaceProject[
   EigenSpaceAdvance[spectrum, 
    EigenSpaceProject[ic, spectrum["eigenvectors"]], t], 
   spectrum["eigenvectors"]];
Attributes[TimePropagate] = {HoldFirst};
TimePropagate[g_, t_] := 
  SetAmplitudes[g, 
   AmplitudeSpaceAdvance[GraphSpectrum[g], GetAmplitudes[g], t]];
SetAmplitudes[simpleGridGraph, ConstantArray[0, 256]];
centerVertex = First[GraphCenter[simpleGridGraph]];
deltaGridGraph = SetDeltaFunction[simpleGridGraph, centerVertex, 1];
WaveColor[z_] := 
  Blend[{RGBColor[0, 0.3, 0.7], RGBColor[0.4, 0.5, 1], 
    RGBColor[0.3, 0.05, 0.05] }, Rescale[z, {-1, 1}]];
animation3D = Table[TimePropagate[deltaGridGraph, t];
   amplitudes = GetAmplitudes[deltaGridGraph];
   ListPlot3D[Partition[amplitudes, 16], ColorFunction -> WaveColor, 
    PlotRange -> {1.2, -1}, ImageSize -> 500, 
    AxesLabel -> {"X", "Y", "Amplitude"}, 
    PlotLabel -> 
     StringJoin["Time = ", ToString[NumberForm[t, {3, 2}]]]], {t, 0, 
    2  \[Pi], 0.2}];
ListAnimate[animation3D, ControlPlacement -> Top]
waveGridGraph = 
  GridGraph[{16, 16}, VertexSize -> Large, ImageSize -> Medium];
SetAmplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
GetAmplitudes[g_] := AnnotationValue[g, VertexWeight];
EigenSpaceAdvance[spectrum_, coordinates_, 
   t_] := (Cos[t*Sqrt@spectrum["eigenvalues"]] + 
     Sin[t*Sqrt@spectrum["eigenvalues"]])*coordinates;
AmplitudeSpaceAdvance[spectrum_, ic_, t_] := 
  Transpose[spectrum["eigenvectors"]] . 
   EigenSpaceAdvance[spectrum, spectrum["eigenvectors"] . ic, t];
Attributes[TimePropagateWave] = {HoldFirst};
TimePropagateWave[g_, t_] := 
  SetAmplitudes[g, 
   AmplitudeSpaceAdvance[GraphSpectrum[g], GetAmplitudes[g], t]];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[#]] - AdjacencyMatrix[#]) &@
   UndirectedGraph[g];
GraphSpectrum[
   g_] := <|"eigenvalues" -> Eigenvalues[#], 
     "eigenvectors" -> Eigenvectors[#]|> &@UnnormalizedLaplacian[g];
SetDeltaFunction[g_, vertex_, distance_] := 
  Module[{ng = 
     g}, (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
SetAmplitudes[waveGridGraph, ConstantArray[0, 256]];
deltaWaveGraph = 
  SetDeltaFunction[waveGridGraph, First[GraphCenter[waveGridGraph]], 
   1];
Wave3DPlot[g_, size_] := 
  ListPlot3D[Partition[GetAmplitudes[g], size], 
   ColorFunction -> WaveColor, PlotRange -> All, 
   BoxRatios -> {1, 1, 0.4}, Axes -> True, Mesh -> True, 
   SphericalRegion -> True];
frames = Table[TimePropagateWave[deltaWaveGraph, t];
   Wave3DPlot[deltaWaveGraph, 16], {t, 0, 2 \[Pi], 0.15}];
ListAnimate[frames, ControlPlacement -> Top, Paneled -> False]

first image

Second image

So there. The Ruliad answers all of our questions look at it: the GridGraph[{n,n}] our lattice over which physical processes happen, the VertexWeight holds either heat or wave amplitude, Laplacian + Spectrum encodes spatial relationships and oscillatory nodes, Exp[-t λ] models diffusion (heat spreading), Cos[t √λ] models wave propagation, and ListAnimate & Manipulate drive real-time or pre-rendered animations..that is how we muster up a few spectral simulation frameworks using graphs, both static and dynamic versions of physical-like behavior in grid structure wherein you, put a hat on your head, you put shoes on your feet...books are the same way. There are things which are set up to be kind of...right for humans as humans are. Computing the spectrum of the graph LaPlacian is "like" breaking up the system into harmonic modes. Like a rock dropped in a pond, the initial impulse we inject at the center using a "delta".

waveGraph = 
  GridGraph[{32, 32}, VertexSize -> Tiny, ImageSize -> Medium];
SetAmplitudes[waveGraph, ConstantArray[0, 32*32]];
deltaWaveGraph = 
  SetDeltaFunction[waveGraph, First@GraphCenter[waveGraph], 1];
laplacianDense = Normal@UnnormalizedLaplacian[waveGraph];
eigenvals = Eigenvalues[laplacianDense]; 
eigenvecs = Eigenvectors[laplacianDense];
waveSpectrum = <|"eigenvalues" -> eigenvals, 
   "eigenvectors" -> eigenvecs|>;
EigenSpaceWaveAdvance[spectrum_, coords_, t_, 
   v_] := (Cos[v t spectrum["eigenvalues"]] + 
     Sin[v t spectrum["eigenvalues"]]) coords;
AmplitudeSpaceWaveAdvance[spectrum_, ic_, t_, v_, damp_] := 
  Exp[-damp t]*
   Transpose[spectrum["eigenvectors"]] . 
    EigenSpaceWaveAdvance[spectrum, spectrum["eigenvectors"] . ic, t, 
     v];
TimePropagate[g_, t_, v_, d_] := 
  SetAmplitudes[g, 
   AmplitudeSpaceWaveAdvance[waveSpectrum, GetAmplitudes[g], t, v, d]];
AmplitudeMatrix3D[g_, n_] := ArrayReshape[GetAmplitudes[g], {n, n}];
WaveColor[z_] := 
  Blend[{{0, Darker@Blue}, {0.3, Blue}, {0.5, White}, {0.7, Pink}, {1,
      RGBColor[1, 0.4, 0.7]}}, Rescale[z, {-1, 1}]];
Manipulate[
 Module[{g = deltaWaveGraph}, 
  TimePropagate[g, time, waveSpeed, damping];
  ListPlot3D[AmplitudeMatrix3D[g, 32], ColorFunction -> WaveColor, 
   PlotRange -> {{1, 32}, {1, 32}, {-1.5, 1.5}}, 
   BoxRatios -> {1, 1, 0.4}, MeshFunctions -> {#3 &}, Mesh -> 7, 
   PerformanceGoal -> "Quality", SphericalRegion -> True, 
   AxesLabel -> {"X", "Y", "Amplitude"}, 
   PlotLabel -> Style["Wave Propagation Simulation", Bold, 14], 
   ImagePadding -> {{Automatic, Automatic}, {20, 40}}]], {{time, 0, 
   "Time"}, 0, 20, 0.1, 
  Appearance -> "Labeled"}, {{waveSpeed, 0.5, "Wave Speed"}, 0.1, 2, 
  0.1, Appearance -> "Labeled"}, {{damping, 0.1, "Damping"}, 0, 1, 
  0.01, Appearance -> "Labeled"}, 
 Button["Reset", (SetAmplitudes[waveGraph, ConstantArray[0, 32*32]];
   SetAmplitudes[deltaWaveGraph, ConstantArray[0, 32*32]];
   time = 0; waveSpeed = 0.5; damping = 0.1;)], 
 ControlPlacement -> Left, SynchronousUpdating -> False]

Wave Propagation Simulation

Or we can have two rocks, like two peas in a pod; just remember that there are no redos in wave evolution but the initial conditions, which govern how each spectral component logically oscillates over time at a scaled rate v. We project to spectral space, advance in time, then transform back--including exponential damping to simulate energy loss. That's our Manipulate; amplitudes on the graph; like Einstein at the post office the only way this can fall through the 2D matrix is if we reshape the amplitude vector and apply custom coloring for wave intensity (height). So you really got a real-time interface to explore wave propagation wherein you change time to move the wave forward and all these settings are just one-time settings, set the waveSpeed to scale the oscillation rate and tweak damping to simulate loss. Then reset button, zeros, everything. It's sort of like this. I have some grid about 32×32 and, the heat simulation component is one half of that that's 16×16. The amount of data I track is simulated via the wave, motion oscillatory (amplitude) whereas in the heat simulation the amount of data I track is less, it's diffusion of temperature..or anything else you can think of. That's why I said they're just jealous of your article. It's like when Pokémon Go came out at first and then we got the Pikachus and, I stayed quiet because I'm not your mother I don't have the authority to formally extend your article. So we just did it. It's going to be multi-way or it's going to be like this whole Giordano Bruno thing where, and I learned all about this from some tramp with a t-shirt that says REACH and now it says BEACH STAFF, I learned about Byzantium and Constantinople and the way that Catholicism, instead of that we have the multi-way, the difference is that when we "make waves" we can do so interactively but when we simulate heat, we have to precompute it. When we oscillate with waves we perform oscillatory actions via spectral advance of Cos + Sin whereas the diffusion / decay Exp[-λt] is something that we, purely diffuse whereas with waves we use damping. That's our graph topology; it could be hexagonal it could be because nature, always finds clever hacks we'd never have thought of--it's smarter than our incremental engineering. Neurons that fire together get stronger synapses between them. It kind of looked like when the web arrived what with the games of Pong that books were toast, however, we know exactly what to do now. If anyone asks about your, photon propagation just roll over and remember, envy is not the root of all evil; books are not a bottomless pit of links--they have structure. You can pick one up and feel its weight, its length, its wholeness. A book's index gives you a map of meaning, not just a search result. Unless..as the rooster crows every scientific model throws something away--it keeps what matters, and discards the rest. Every model of the universe wants to be precise. But the moment you observe or apply it, you're dealing with approximations. Computational irreducibility means: even if you know the rules , the only way to see what happens is to let it unfold.. And there you have it, the computation of the graph's spectrum with the centralized hotspot and the temperature (heat) simulation on just 16×16 blocks of grid space! When biology looks complicated--it probably is. And the theory might just be the data. But sometimes, theory is truer than experiment. However, even the most elegant model can be completely wrong so don't be fooled by equations. So when all these discrete atoms of space come to fruition what do you do? If you want to simulate the universe perfectly, you'd need a universe-sized computer, not a continuous blob--there are pockets of reducibility in an irreducible universe--islands of simplicity in oceans of complexity. That's why, Wolfram Language code is meant to be read as well as executed--much like mathematics in a textbook. When you see the way Wolfram's computational notebooks echo throughout our reading--it's for thinking, for doing, for running. It's alive. If you do it in Mathematica, they will tell me.

simpleGridGraph = 
  GridGraph[{16, 16}, VertexSize -> Tiny, ImageSize -> Medium];
SetTemperatures[simpleGridGraph, ConstantArray[0, 256]];
deltaGridGraph = 
  SetDeltaFunction[simpleGridGraph, 
   First[GraphCenter[simpleGridGraph]], 1];
spectrum = GraphSpectrum[simpleGridGraph];
AmplitudeMatrix2D[g_] := ArrayReshape[GetTemperatures[g], {16, 16}];
WaveColor[z_] := 
  Blend[{{0, RGBColor[0, 0.3, 0.8]}, {0.5, RGBColor[1, 1, 1]}, {1, 
     RGBColor[0.8, 0, 0]}}, Rescale[z, {-1, 1}, {0, 1}]];
animation3D = Table[TimePropagate[deltaGridGraph, t];
   ListPlot3D[AmplitudeMatrix2D[deltaGridGraph], 
    ColorFunction -> WaveColor, ColorFunctionScaling -> False, 
    PlotRange -> All, BoxRatios -> {1, 1, 0.6}, 
    AxesLabel -> {"X", "Y", "Temp"}, 
    PlotLabel -> StringJoin["t = ", ToString[NumberForm[t, {3, 1}]]], 
    ImageSize -> 500], {t, 0, 4, 0.1}];
ListAnimate[animation3D, ControlPlacement -> Top]

forward back

There's a lot the main discovery is how much you don't need in the underlying structure of the neural net. You can have much simpler underlying structures from which all sorts of the richness of typical neural net behavior can emerge. This is sort of an analogous story to the story that I've discovered many times, but, originally forty five years ago in connection with simple programs like cellular automata, where there was a very simple program but yet when you run it you can get very complicated behavior. You don't need a lot of complexity in the underlying structure to get richness in the overall behavior. Light, as a form of electromagnetic radiation, travels through different media. When photons travel from one medium to another with a different refractive index, their speed changes, causing them to change direction--a phenomenon known as refraction. Reflection, on the other hand, is a tricky thing because it occurs when photons bounce off the surface of a medium rather than entering it.

animationTable = Table[
   Graphics3D[
    {Blue,
     Table[
      Arrow[{{x, y, 0}, {x, y, Sin[x + t]}}],
      {x, -3, 3, 0.5},
      {y, -3, 3, 0.5}
      ], Red, 
     Table[Arrow[{{x, y, 0}, {Sin[x + t], y, 0}}], {x, -3, 3, 
       0.5}, {y, -3, 3, 0.5}],
     {Yellow, Opacity[1], Sphere[{0, 0, 0}, 0.5]}},
    Boxed -> False, ImageSize -> Large,
    PlotRange -> {{-4, 4}, {-4, 4}, {-2, 2}},
    Background -> Black
    ],
   {t, 0, 2  \[Pi], 0.1}];
ListAnimate[animationTable]

As photons propagate through a medium, they can be absorbed or they can be scattered. It's too easy. Because of the way that absorption occurs, the energy of photons is taken up by the medium's atoms, possibly resulting in phenomena such as flourescence or heat. Scattering involves the redirection of light due to interaction with particles within the medium, which can affect the color of the sky or the visibility of laser beams in foggy conditions. But it's really the magnetic field and electromagnetic waves that you want to watch out for, they create this phase shift and that's why we need the Ruliad. The issue is at some level what do you want the AIs to do? And there's a fundamental difficulty--as soon as the AIs are doing computational kinds of things, whatever the way you try and tweak the AI at the beginning saying, I want you to just be a good AI, you'll never be able to do that successfully because of this phenomenon I call computational irreducibility. And I know it's fun, how in "vacuum" photons travel at a constant speed, approximately 299,792,458 meters per second. Thus the speed of light will forever be considered to be a fundamental and sacred constant of the universe that plays a critical role..in theories of relativity. Some things are better left unseen; some photons end up propagating, interfering, diffracting, and ultimately polarizing with both wave-like and particle-like properties. That's why this article provides such a foundational documentary of how photons move and interact with materials, quite rapidly but not withstanding, that even in the development of quantum computers photons can be used as qubits. You could have made a movie about how Mathematica got started..one of the tests for understanding variable-dimensional space is that the propagation of photon equations of motion have a singularity only when the photons are standing absolutely still with their velocities locked. Then enters the element of how time can influence simple or complex outcomes in photological applications such as in a tank of water. The question, though, is a detailed question of, well, how hard do we have to train our models of physics? How hard do we have to bash them? How much money do you have to spend to do that training when it is set up one way versus another? Let's suppose all the photons have gone to sleep and then, does it matter that you have a particular way of connecting one photon to another? Well, some of those things probably matter by a factor of five, let's say. For instance we have this model of the electromagnetic quantum field theory that describes how light and matter interact; the creation and annihilation of photons as they interact with charged particles such as electrons. It's the forty five year continuation of optical communications, medical imaging such as PET scans and optical coherence tomography, lasers, and even in the development of quantum computers..

EZ GIF

I think one of the things that helps scientific revolution is when the places it's going into is desolate. So you know it helps when things are kind of burnt out and there's this new spark of life that can expand into a vacuum instead of having to push back existing ideas in that area. So that would be my impression about what's involved there. You get this effective acceleration, photon propagation through variable-dimensional space and "how to make the world a better place" ...the fact is that like other systems that have computational irreducibility when you set down a system with rules the system has a computationally irreducible behavior that it will follow that will always lead to unexpected things happening. My perfect scheme will always have a bug. The intensity of the EM wave is either amplified or damped, so when you see us under the stars, our recent continuum results are a little less brittle. They seem to work better than approaches that are more constrained and we seem to know what's "going" to happen.

simpleGridGraph = 
  GridGraph[{32, 32}, VertexSize -> Small, ImageSize -> Large];
GetAmplitudes[g_] := AnnotationValue[g, VertexWeight];
Attributes[SetAmplitudes] = {HoldFirst};
SetAmplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
SetDeltaFunction[g_, vertex_, distance_] := 
  Module[{ng = 
     g}, (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[#]] - AdjacencyMatrix[#]) &@
   UndirectedGraph[g];
GraphSpectrum[
   g_] := <|"eigenvalues" -> Eigenvalues[#], 
     "eigenvectors" -> Eigenvectors[#]|> &@UnnormalizedLaplacian[g];
EigenSpaceAdvance[spectrum_, coordinates_, 
   t_] := (Cos[1/10*t*spectrum["eigenvalues"]] + 
     Sin[1/10*t*spectrum["eigenvalues"]])*coordinates;
AmplitudeSpaceAdvance[spectrum_, ic_, t_] := 
  Transpose[spectrum["eigenvectors"]] . 
   EigenSpaceAdvance[spectrum, spectrum["eigenvectors"] . ic, t];
Attributes[TimePropagate] = {HoldFirst};
TimePropagate[g_, t_] := 
  SetAmplitudes[g, 
   AmplitudeSpaceAdvance[GraphSpectrum[g], GetAmplitudes[g], t]];
SetAmplitudes[simpleGridGraph, ConstantArray[0, 1024]];
deltaGridGraph = 
  SetDeltaFunction[simpleGridGraph, 
   First[GraphCenter[simpleGridGraph]], 1];
AmplitudeMatrix2D[g_, n_] := ArrayReshape[GetAmplitudes[g], {n, n}];
SnowconeColor[z_] := 
  Blend[{RGBColor[0, 0, 1], RGBColor[1, 1, 1], RGBColor[1, 0.4, 0.7]},
    z];
animation3DTable = Table[TimePropagate[deltaGridGraph, t];
   ListPlot3D[AmplitudeMatrix2D[deltaGridGraph, 32], 
    ColorFunction -> SnowconeColor, 
    PlotRange -> {{1, 32}, {1, 32}, All}, 
    BoxRatios -> {1, 1, 0.5}], {t, 0, 10, 0.25}];
ListAnimate[animation3DTable]

Animation 3D Table

The Simon Fischer method to model the propagation of a classical photon represented as a transversal electromagnetic (EM) wave...through a space that changes in dimensionality and is discretized on a graph...Plato had approaches to, this is how to set up the perfect system of government. The king of philosophy, what aristocracy may particularly..the ability of history and by necessity..any aspects of society successfully have a habit of repeating themselves..one country will puff out and pop and it's like what you could imagine. The computational irreducibility bites you, what with this and that thorough exploration that we have made, of the wave equation on graphs, whether it's the use of the wave equation and I use Mathematica all the time to go do exploration of the wave equation on graphs, particularly the use of the Laplacian Matrix and the sound of discretizing continuum solutions. It's the look that we have into binary code, heterodimensional graphs, which are chains of different dimensions connected via methods like corner docking or face docking. It's been known that the concept of fractional dimensions is addressed with intrinsic fractional graphs (like the Sierpiński graph) and extrinsic methods by..labeling certain regions to indicate a dimension change.

SierGraph[n_, d_] := 
  MeshConnectivityGraph[SierpinskiMesh[n, d], 0, 
   VertexLabels -> Automatic];
sierpinskiGraph = SierGraph[2, 3];
PhotonPropagation[g_, steps_] := 
  Module[{amplitudes = ConstantArray[0, VertexCount[g]], photonPos}, 
   photonPos = RandomChoice[VertexList[g]];
   amplitudes[[photonPos]] = 1;
   Table[photonPos = RandomChoice[AdjacencyList[g, photonPos]];
    amplitudes[[photonPos]] = 1;
    HighlightGraph[g, photonPos, VertexSize -> Large], {steps}]];
SimulateEffects[g_, effectType_, steps_] := 
  Module[{propagationFunction}, 
   propagationFunction = 
    Switch[effectType, "DarkMatter", PhotonPropagation, "DarkEnergy", 
     PhotonPropagation, "BlackHoles", PhotonPropagation, 
     "BosonicStars", PhotonPropagation, "NeutrinoTravel", 
     PhotonPropagation, _, PhotonPropagation];
   ListAnimate[propagationFunction[g, steps]]];
animationPhoton = ListAnimate[PhotonPropagation[sierpinskiGraph, 30]]
animationDarkMatter = 
 SimulateEffects[sierpinskiGraph, "DarkMatter", 30]
animationOfDarkEnergy = 
 SimulateEffects[sierpinskiGraph, "DarkEnergy", 30]
animateBlackHoles = 
 SimulateEffects[sierpinskiGraph, "BlackHoles", 30]
animatedNeutrinoTravel = 
 SimulateEffects[sierpinskiGraph, "NeutrinoTravel", 30]
animationBosonicStars = 
 SimulateEffects[sierpinskiGraph, "BosonicStars", 30]

Bosonic Stars

If you set up the binary numbers in a fixed number of digits, you have this tree structure where you say it's a 1-branch or a 0-branch and that, is what happens with the hexagons, the concept of fractional dimensions and curvature that I discuss as a model for fractional dimensions, with the introduction of curvature into graphs mimicking dimension change. Because presumably if you do an infinite number of batches you'll get, eventually, one particle that just by "luck", just perfectly..just goes the exact way. To generalize the Laplacian Matrix to fractional dimensions, alone is going to need to require none of the fractional dimensions implicitly..but first I kind of investigate the role of curvature in modeling non-integer dimensions. Let's say the users "deplete" the simulation of photon propagation into various hypothetical scenarios, including travel through dark matter, dark energy, near black holes, bosonic stars, and neutrino travel. All of those computational marbles that I have dropped case in point, brings about a generous way of getting these hypothetical scenarios whether it's setting up an animating these scenarios, fully capturing the dynamics of wave propagation in fractional dimensions..and the idea of Lyapunov exponents in studying control systems had this idea that you can measure the exponential divergence, and when things are stable the thing will damp out our exponent, exponential divergence is like excavating lower and lower order digits, smaller and smaller digits in the number so to speak as time goes on. So in the 1930s, in the origin of this thing called symbolic dynamics, specifically Garrett Birkhoff..mainstream mathematics where Marson Morse, Konrad Zuse, had a clear choice. We've already developed a mathematical framework that extends the definition of the Laplacian in non-integer dimensions and studying its spectral properties. This is self-explanatory, how curvature introduced to graphs can prettify and simulate fractional dimensions and lead to new insights in geometric analysis and graph theory. And apparently we can simulate something like physical phenomena, just as a shortcut for accessing the black hole event horizons garbage "dump" and bosonic stars which involve incorporating general relativity and quantum field theory into the graph-based framework, pictures of octopuses and so on and base 8..so at that time, it certainly was a slightly obscure piece of knowledge, something that was part of the engineering of computers but not part of the everyday, ordinary, world like ours.

Attributes[SetAmplitudes] = {HoldFirst};
Attributes[TimePropagate] = {HoldFirst};
simpleGridGraph = GridGraph[{32, 32}, VertexSize -> Small];
GetAmplitudes[g_] := AnnotationValue[g, VertexWeight];
SetAmplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
SetDeltaFunction[g_, vertex_, distance_] := 
  Module[{ng = 
     g}, (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[g]] - AdjacencyMatrix[g]) &@
   UndirectedGraph[g];
GraphSpectrum[
   g_] := <|"eigenvalues" -> Eigenvalues[#], 
     "eigenvectors" -> Eigenvectors[#]|> &@UnnormalizedLaplacian[g];
EigenSpaceAdvance[spectrum_, coordinates_, 
   t_] := (Cos[1/10*t*spectrum["eigenvalues"]] + 
     Sin[1/10*t*spectrum["eigenvalues"]])*coordinates;
AmplitudeSpaceAdvance[spectrum_, ic_, t_] := 
  Transpose[spectrum["eigenvectors"]] . 
   EigenSpaceAdvance[spectrum, spectrum["eigenvectors"] . ic, t];
TimePropagate[g_, t_] := 
  SetAmplitudes[g, 
   AmplitudeSpaceAdvance[GraphSpectrum[g], GetAmplitudes[g], t]];
SetAmplitudes[simpleGridGraph, ConstantArray[0, 1024]];
deltaGridGraph = 
  SetDeltaFunction[simpleGridGraph, 
   First[GraphCenter[simpleGridGraph]], 1];
AmplitudeMatrix2D[g_, n_] := ArrayReshape[GetAmplitudes[g], {n, n}];
SnowconeColor[z_] := 
  Blend[{RGBColor[0, 0, 1], RGBColor[1, 1, 1], RGBColor[1, 0.4, 0.7]},
    z];
animation3DTable = Table[TimePropagate[deltaGridGraph, t];
   ListPlot3D[AmplitudeMatrix2D[deltaGridGraph, 32], 
    ColorFunction -> SnowconeColor, 
    PlotRange -> {{1, 32}, {1, 32}, {-0.1, 1.2}}, 
    BoxRatios -> {1, 1, 0.5}], {t, 0, 5, 0.1}];
ListAnimate[animation3DTable]

New 3D Table

So there's this implicit regularization inherent to Fischer's methodology, the architecture that serves as the foundation of intelligent modeling of the influence of dark matter and dark energy on photon propagation, with an elegant construction of graph models that is going to cut it - the gravitational effects predicted by theories of dark matter and energy distributions in the universe. When he said "bit" I thought it was sort of a binary choice that leads to everything, that was actually the idea of subsequent efforts this choice of distinction that makes everything. So in the midst of that, the graph approach could be adapted to simulate neutrino oscillations and their propagation through space, that's the implicit perspective on particle physics because "no matter how" much "corruption" is inherent in the data, the hypergraphs within the Wolfram Model of physics uses hypergraphs to model the evolution of space-time. What really matters is the interaction between fractional dimensionality and hypergraph rewriting rules, which could be a fruitful area of research in the randomness or unstructuredness or the meaningfulness of the algorithmic data which "historically" simulates photon propagation in variable-dimensional spaces, supporting the simulation of the Wolfram Language.

Attributes[SetAmplitudes] = {HoldFirst};
Attributes[TimePropagate] = {HoldFirst};
simpleGridGraph = GridGraph[{32, 32}];
GetAmplitudes[g_] := AnnotationValue[g, VertexWeight];
SetAmplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
SetDeltaFunction[g_, vertex_, distance_] := Module[{ng = g},
   (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[g]] - AdjacencyMatrix[g]) &@
   UndirectedGraph[g];
GraphSpectrum[g_] := <|"eigenvalues" -> Eigenvalues[#],
     "eigenvectors" -> Eigenvectors[#]|> &@
   UnnormalizedLaplacian[g];
EigenSpaceAdvance[spectrum_, coordinates_, t_] := (
    Cos[1/10*t*spectrum["eigenvalues"]] +
     Sin[1/10*t*spectrum["eigenvalues"]]
    )*coordinates;
AmplitudeSpaceAdvance[spectrum_, ic_, t_] := 
  Transpose[spectrum["eigenvectors"]] .
   EigenSpaceAdvance[spectrum, spectrum["eigenvectors"] . ic, t];
TimePropagate[g_, t_] := SetAmplitudes[g,
   AmplitudeSpaceAdvance[GraphSpectrum[g], GetAmplitudes[g], t]];
SetAmplitudes[simpleGridGraph, ConstantArray[0, 1024]];
deltaGridGraph = SetDeltaFunction[simpleGridGraph,
   First[GraphCenter[simpleGridGraph]],
   1];
AmplitudeMatrix2D[g_, n_] := ArrayReshape[
   GetAmplitudes[g],
   {n, n}];
SnowconeColor[z_] := Blend[{
    RGBColor[0, 0, 1],
    RGBColor[1, 1, 1],
    RGBColor[1, 0.4, 0.7]}, z];
animation3DTable = Table[TimePropagate[deltaGridGraph, t];
   ListPlot3D[
    AmplitudeMatrix2D[deltaGridGraph, 32],
    ColorFunction -> SnowconeColor,
    PlotRange -> {
      {1, 32}, {1, 32},
      {-10000, 10000}
      }, BoxRatios -> {1, 1, 0.5}],
   {t, 0, 10, 0.25}];
la = ListAnimate[animation3DTable]

@Simon Fischer When you see the propagation of the transversal EM wave through variable-dimensional space and yeah. I don't know, but you can see it in the intensity of the wave that gets amplified or damped depending on the dimensional change..the recent results in the continuum. Okay, so I love all this interpretation of interactive educational modules that we have made as a springboard to help students and enthusiasts learn about complex concepts in physics and mathematics. So all this "interpretation" is just a few simple mathematical equations, such as biological networks or social structures and how they can provide new methods for analyzing "agnostic" system behaviors. Now "quickly" exploring your variable-dimensional graph models, in computational geometry...has allowed me to descend gradient-wise through theoretical physics and beyond. Applied mathematics and computational science and its connections to the Observer and the Ruliad. The primary cybernetics, focus of the research on controllability so that they stay within a certain required boundary, because if you place constraints in the right way you can decay dark matter particles that result in the emission of photons, which would be indicated by a narrow line-like spectral feature. Of 32 line-like features detected above a 3sigma significance, 29 coincide with known instrumental and astrophysical lines. The ON-OFF approach which constrains the lifetime of dark matter particles with masses ranging from 4 keV to 14 MeV is greater than 10^20 - 10^21 years. How can that be right? Oh, boy the updated constraints that you provide on dark matter decay, iteratively refine our understanding of the properties of dark matter particles. Systematic uncertainties fluctuate and bounce down your gradient descent because your gradient descent triggers a lot of scientific interpretation in a rather different direction. It's sort of like those two decades of data from the INTEGRAL spacecraft's SPI spectrometer. Lots of people getting together to talk about this problem of how all these systems like animals get to do, what they do. And you can load this popup, no YouTube just the mixing angle of sterile neutrino dark matter that is (and/or) its limits when all that stuff in Wolfram Language runs off the screen. So we've got that.

animation3DTable1

simpleGridGraph = GridGraph[{32, 32}];
GetAmplitudes[g_] := AnnotationValue[g, VertexWeight];
Attributes[SetAmplitudes] = {HoldFirst};
SetAmplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
SetDeltaFunction[g_, vertex_, distance_] := Module[{ng = g},
   (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[#]] - AdjacencyMatrix[#]) &@
   UndirectedGraph[g];
GraphSpectrum[g_] := <|"eigenvalues" -> Eigenvalues[#],
     "eigenvectors" -> Eigenvectors[#]|> &@
   UnnormalizedLaplacian[g];
EigenSpaceAdvance[spectrum_, coordinates_, 
   t_] := (Cos[2*t*spectrum["eigenvalues"]])*coordinates;
AmplitudeSpaceAdvance[spectrum_, ic_, t_] := 
  Transpose[spectrum["eigenvectors"]] .
   EigenSpaceAdvance[spectrum,
    spectrum["eigenvectors"] . ic,
    t];
Attributes[TimePropagate] = {HoldFirst};
TimePropagate[g_, t_] := SetAmplitudes[g,
   AmplitudeSpaceAdvance[GraphSpectrum[g],
    GetAmplitudes[g],
    t]];
SetAmplitudes[simpleGridGraph, ConstantArray[0, 1024]];
deltaGridGraph = SetDeltaFunction[
   simpleGridGraph,
   First[GraphCenter[simpleGridGraph]],
   1];
AmplitudeMatrix2D[g_, n_] := ArrayReshape[GetAmplitudes[g], {n, n}];
SnowconeColor[z_] := Blend[{
    RGBColor[0, 0, 1],
    RGBColor[1, 1, 1],
    RGBColor[1, 0.4, 0.7]}, z];
animation3DTable = Table[TimePropagate[deltaGridGraph, t];
   ListPlot3D[
    AmplitudeMatrix2D[deltaGridGraph, 32],
    ColorFunction -> SnowconeColor,
    PlotRange -> {{1, 32}, {1, 32}, {-0.1, 1.2}},
    BoxRatios -> {1, 1, 0.5}],
   {t, 0, 5, 0.1}];
Export["animation3DTable2.gif", animation3DTable]
ListAnimate[animation3DTable]

People were talking about Cybernetics and Cyber everything..the Doctor Who program, might be classified as science fiction might be classified as comedy but it's changed over the course of time this "must have been" 1965.. what I call it, my broken tape recorder. That is when, we will computerize everything. I will show you, how complex behavior arises from simple rules: a sterile neutrino decays into a photon and a neutrino. And it has "no mass" so you can do, whatever you want, to do. Look at me. The best functions were the Laplacian and the ColorByInternalamplitude.

animation3DTable2

The observation of dark matter decay signals within the SPI data requires a complex understanding of both the observer's capabilities and limitations. Your constraints on decaying dark matter provide the "architectural" foundation of computational analysis of data, and Wolfram's emphasis on computation as a powerful tool to formalize the world. Spectral lines that is their analysis is implicitly a multiway system, where each line represents a potential path of history for a decaying dark matter particle. In the context of quantum mechanics and modeling growth processes, akin to the computational processes Wolfram describes, we can find this whole "American induction" technique to use generative AI to simulate the perception of alien minds where the attempt is to understand and model dark matter decay phenomena that are not directly observable, much like an alien process to our everyday, practical, experience of what we are doing "right now". The progression of Mathematica and the Wolfram Language, as described by Wolfram, illustrates the evolution of computational tools that could potentially be used to analyze and visualize the kind of astrophysical data we deal with and we have every credential, exponential. The expression evaluation that relates to the algorithms and methods used has a lot of duck-like behavior, to describe what would happen. Sure we can discuss the propagation of INTEGRAL/SPI data but when I saw your specific empirical data anlysis that consrains dark matter properties, I sort of jumped a bit because I don't have advice, I have a suggestion. Thank you for the Resource function GraphMerge.

CornerDockingRules[x_, y_, dockingIndex_] := 
  Join[{x*y -> dockingIndex},
   Table[i -> Subscript[v, i], {i, x*y - 1}]];
Create2DGridGraphCorner[x_, y_, dockingIndex_] := 
  Graph[EdgeList[GridGraph[{x, y}]] /. 
    CornerDockingRules[x, y, dockingIndex]];
FaceDockingRules[x_, y_, dockingIndices_] := Join[
   Thread[Table[i, {i, Length[dockingIndices]}] -> dockingIndices],
   Table[i -> Subscript[v, i],
    {i,
     DeleteCases[VertexList[GridGraph[{x, y}]],
      Alternatives @@ dockingIndices]
     }]];
Create2DGridGraphFace[x_, y_, dockingIndices_] := 
  Graph[EdgeList[GridGraph[{x, y}]] /.
     FaceDockingRules[x, y, dockingIndices]];
AppendLowerDimensionGridGraph[highDimensionGridGraph_, 
   lowDimensionGridGraph_] := 
  GraphUnion[highDimensionGridGraph, lowDimensionGridGraph];
highDimensionGridGraph = GridGraph[{7, 7, 7},
   VertexSize -> 0.3,
   VertexStyle -> LightBlue,
   EdgeStyle -> Lighter@Gray];
cornerGraph = Create2DGridGraphCorner[15, 15, 1];
faceGraph = Create2DGridGraphFace[15, 15,
   {1, 2, 3, 4, 5}];
outlandishGraph = AppendLowerDimensionGridGraph[
   AppendLowerDimensionGridGraph[highDimensionGridGraph, 
    cornerGraph],
   faceGraph];
layouts = {"CircularMultipartiteEmbedding", 
   "LayeredDigraphEmbedding",
   "HighDimensionalEmbedding", "SpringElectricalEmbedding",
   "SpringEmbedding", "SpectralEmbedding",};
graphs = Table[
   Graph[outlandishGraph,
    GraphLayout -> layout],
   {layout, layouts}];
Grid[Partition[graphs, 2]]

Just remember. You, can do. Whatever, you want, to do. My physical parameters, like lots of rays of light coming in to that lens will make those rays of light converge..so when we look at things far away from a distance, the way those things get focused on our retina and our eye, it does lensing to make light be "bent" and converge together. The same thing happens with light going around a galaxy. The raw observational data that expands our understanding across the universe with data from telescopes and that is your theory of dark matter, your energy distribution in the universe. It's their propagation through the spaceline when neutrinos oscillate that could be used to model the influence of dark matter and dark energy, on photon propagation. To observe the effect of fractional dimensionality we can see the chain of the dimensions and the corner and face docking.

GridPhoton1

I think that that "time evolution" of a system is usually described by the Schrödinger equation, which can involve a Laplacian operator when dealing with spatial variables. In a vacuum, light goes at the standard speed of light but in a piece of glass, light goes one and a half times slower than it does in the vacuum.. so it's going faster ...than the speed of light as it existed in a sheet of glass and when you have the Hamiltonian, that dictates how the wavefunction of a system evolves over time, or the "amplitudes" in quantum mechanics that describe my probabilistic calculation of assigning amplitudes to graph vertices and performing time evolution in the eigenspace of the Laplacian. @Gianmarco Morbelli, it's been fun.

SierGraph[n_, d_] := 
  MeshConnectivityGraph[SierpinskiMesh[n, d], 0, 
   VertexLabels -> Automatic];
fSier[g_, dockingIndex_, vertexname_] := 
  Join[{{0, 1} -> dockingIndex}, 
   Table[{0, i} -> Subscript[vertexname, i], {i, 
     Length[VertexList[g]]}]];
CreateSierpinskiCorner[n_, d_, dockingIndex_, vertexname_] := 
  Graph[EdgeList[SierGraph[n, d]] /. 
    fSier[SierGraph[n, d], dockingIndex, vertexname]];
sierpinskiCorner = CreateSierpinskiCorner[3, 2, 1, a];
gg = GridGraph[{5, 5}];
g1 = Graph[GraphUnion[gg, CreateSierpinskiCorner[3, 2, 1, b]]];
g2 = Graph[GraphUnion[gg, CreateSierpinskiCorner[4, 2, 1, c]]];
g3 = Graph[GraphUnion[gg, CreateSierpinskiCorner[5, 2, 1, d]]];
g4 = Graph[GraphUnion[gg, CreateSierpinskiCorner[6, 2, 1, e]]];
g5 = Graph[GraphUnion[gg, CreateSierpinskiCorner[7, 2, 1, f]]];
g6 = Graph[GraphUnion[gg, CreateSierpinskiCorner[3, 2, 1, g]]];
g7 = Graph[GraphUnion[g6, CreateSierpinskiCorner[4, 2, 25, h]]];
g8 = Graph[GraphUnion[g7, CreateSierpinskiCorner[5, 2, 25, j]]];
g9 = Graph[GraphUnion[g8, CreateSierpinskiCorner[6, 2, 25, k]]];
g10 = Graph[GraphUnion[g8, CreateSierpinskiCorner[7, 2, 25, l]]];
graphs = {g1, g2, g3, g4, g5, g6, g7, g8, g9, g10}

One of the things that really mystified people in the 1800s was what heat is. So when you model the behavior of a classical photon as an electromagnetic (EM) wave through spaces of varying dimensions, there's nothing that I can focus on other than how the intensity of a wave, the caloric fluid flows from the hot metal to the cold metal, the whole wave equation on graphs where we've already established the Laplacian Matrix for integer dimensions and then we can discretize the solution of the wave equation in continuous space and sample it on the vertices of the graph. That is how we model fractional dimensions. It was amazing chaining graphs of different dimensions together because that's how we get them chained, @Simon Fischer it's really about different methods of introducing fractional dimensions to a graph, with particles. The associated production of strange particles, quarks, you know.

sierpGraph

The Laplacian Matrix method, this method, doesn't inherently capture fractional dimensions in the operator itself. Space is made of molecules bouncing around, hitting each other..the solution to the wave equation in fractional dimensions involves a function of the dimension, a radial coordinate, and the Hankel function of the second type. And with this solution we built this whole model of physics that seems to work remarkably well, that is based on this idea of a discrete space and these rules being applied. And if you ask, you know what it is, what merges..are there features of space that we're not taking into account? This solution exhibits different spatial behaviors compared to integer dimensions, specifically amplifying or damping the wave amplitude..based on whether the dimension is less than or greater than two. The introduction of curvature into a graph to simulate dimension change can be achieved by adding edges between non-adjacent vertices.

gridToGraph[gridSize_, {x_, y_}] := 
  With[{theta = 2 Pi x/gridSize, phi = Pi y/gridSize},
   {Cos[theta] Sin[phi], Sin[theta] Sin[phi], Cos[phi]}];
fPertD[g_, vertexname_, pertRadius_] := 
  Table[i -> Subscript[vertexname, i],
   {i, VertexList[
     NeighborhoodGraph[g, First[GraphCenter[g]], pertRadius]]}];
introducePert[g_, pertRadius_, vertexname_] := Graph[EdgeList[g] /.
     fPertD[g, vertexname, pertRadius]];
GG1010 = GridGraph[{10, 10}];
vertexCoordinates = gridToSpherical[10, #] & /@
   (GraphEmbedding[GG1010]);
graph = Graph[VertexList[GG1010],
   EdgeList[GG1010],
   VertexCoordinates -> vertexCoordinates,
   VertexSize -> 0.1,
   EdgeStyle -> Directive[Thickness[0.005]],
   ImageSize -> 500];
perturbedGraph = introducePert[graph, 2, a];
perturbedVertexCoordinates = 
  Thread[VertexList[perturbedGraph] -> gridToGraph[10, #] & /@
    GraphEmbedding[perturbedGraph]];
DirectedGraph[
 Graph[
  perturbedGraph,
  VertexCoordinates -> perturbedVertexCoordinates,
  VertexLabels -> "Name",
  VertexSize -> Thread[VertexList[perturbedGraph] -> Table[
      If[IntegerQ[i],
       0.1,
       0.2],
      {i, VertexList[perturbedGraph]}]],
  VertexStyle -> Thread[VertexList[perturbedGraph] -> Table[
      If[IntegerQ[i],
       RGBColor[0.4, 0.8, 1],
       RGBColor[1, 0.6, 0.8]],
      {i, VertexList[perturbedGraph]}]],
  EdgeStyle -> Directive[Thickness[0.001]],
  ImageSize -> 500]]
Graphics3D[{
  Opacity[0.5],
  RGBColor[0.4, 1, 0.6],
  Line[{{0, 0, 0}, #}] & /@
   (perturbedVertexCoordinates[[All, 2]])}]

It turns out that dark matter ironically is a feature of the microscopic structure of space, just like heat turned out to be a feature of the microscopic structure of materials, the kind of multiway mobile automata that we've been having in our models of physics..our research has generated jealousy in the Wolfram Community. There are so many inquiries and it's full of the effects of dark matter, dark energy, and other cosmological entities, applied to areas such as the study of cosmological structures like black holes and dark matter, in our exploration if you know the formula for the volume of a sphere it's 4/3rds Pi R^3. And formulating gravity as being associated with the curvature of space, you can think about gravity as a feature of small dimension change of space, the "value system" that brings about this introduction of fractional dimensionality within a graph. And that's still up in the air because sometimes, when we get these graphs all solved out it's like introducing curved graphs, the propagation of an electromagnetic wave on a 2D grid graph, with a light flash originating from the center of a sphere.

perturbationGraph1

It's like if you're on a sphere for example and you say let's keep going..at worst I come back around the sphere but I never reach the edge of the sphere that's not a concept that is a thing in the surface of a sphere. In the beginning of the universe, there was; you know there was a Big Bang, it was like using graph theory to model physical spaces, especially those with non-integer dimensions. The universe will start coming back and there will be a big time crunch, the computational simulation of complex physical phenomena that will explain how we crunch time by representing space as a network of connected nodes (vertices), where researchers can explore the behavior of waves as they travel through different structures. But what about people like us who don't even propagate any waves in fractal dimensions? I saw the differential spatial spread sound in the center of the wave, and in its wake it's like how proper time is not a local nor global concept; it is rather associated to a specific reference frame (a priori of arbitrary size).

perturbationGraph2

Now we don't know that matter with a negative mass exists, people say oh we don't really know matter..what is a tensor? All of the implications for Quantum Mechanics and General Relativity for the last hundred years, it's not been possible to have a situation where there's truly nothing there where there's truly a "vacuum" with nothing there. In Quantum Mechanics one of the features of it is to say you never know exactly what is going on. These structures, the fractal dimensions such as those present in the Sierpiński graph - these structures do not conform to traditional Euclidean geometry and can model naturally bubbling fractal patterns found in various scales of physics, from microscopic to cosmic structures. If the concept of fractional dimensions can be integrated into the standard model of quantum mechanics and general relativity..those atoms of space are constantly being rewritten and offer new ways to understand phenomena like quantum entanglement or the fabric of spacetime near singularities such as black holes. It knits together the structure of space, the activity of the universe does. This is so observer-centric. But that's just the graph. @Simon Fischer.

Plot[{
  (Re[x^(1 - (1.585)/2) HankelH2[3, x]] + Re[HankelH2[3, x]])*
   Sin[2*Pi*x],
  (Re[x^(1 - (2.3)/2) HankelH2[3, x]] + Re[HankelH2[3, x]])*
   Sin[2*Pi*x]},
 {x, 0, 10},
 PlotStyle -> {
   Directive[RGBColor[0.4, 0.8, 1], Thick],
   Directive[RGBColor[1, 0.6, 0.3], Thick]
   },
 ImageSize -> Large,
 AxesLabel -> {"Radial distance r [a.u.]", "Amplitude [V/m]"},
 PlotLegends -> "Expressions"]

Everything that we care about is this tiny piece of fluff, it might be one in ten to the hundred and twenty..one path in a trillion trillion trillion trillion trillion trillion simulations and visualizations of complex wave dynamics and so our embarrassing techniques, are associated with a certain amount of mass. Our vacuum fluctuations, it's sort of like conceptualizing interactions that are difficult to observe directly. The universe isn't curled into a tiny ball but it's cool how if you cross your eyes at these complex systems it sort of kind of looks like..when we lay down and advance in fields that require non-traditional geometric and algebraic frameworks. I'm always down for further exploration into how these concepts can be applied beyond electromagnetism..such as those places where there's less activity that will appear to have less mass..such as in acoustic waves or even gravitational waves. It's a big hack to do with current physics and it only makes us look bad. When you see what happened with the compact-closed dagger symmetric monoidal categories..we really contributed to larger theoretical frameworks theorizing like a champ, every 30 minutes we found fundamental theories of physics through computational exploration. A very sad day for C, the lower level programming language instead of the notation, the starry way that we collaborate on methodological approaches to studying physics. Discretized solutions, the use of and the Laplacian Matrix for modeling wave propagation offers a blueprint for researches like us who are looking, to tackle similar problems in physics or related fields. So we took all of space and we said we're putting down all these angles in different places.

Radial Distance

@Simon Fischer? You can say electromagnetism is associated with an arbitrary choice of what amounts of an angle. In electromagnetism, there's this idea of a voltage. We say, in standard electricity we say, we say such and such is a voltage. When you have a 9 volt battery, the difference in voltage is like a man modeling wave propagation between two poles of the battery, volts is a measure of, you can think of it as a measure of electric potential and you can say there's a 9 volt difference between the positive pole and that voltage difference is what pushes electrons through a wire, makes electric currents. But the choice of what, we say one side of the battery it's at 712 volts. The only thing we know is the other side of the battery is 9 volts different from that.

Getamplitudes[g_] := AnnotationValue[g, VertexWeight];
Attributes[Setamplitudes] = {HoldFirst};
Setamplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
GraphDistSmooth[g_, v1_, v2_] := 
  If[String[v1] === String[v2], 1, GraphDistance[g, v1, v2]];
d[g_, v_, perturbedDimension_] := 
  If[IntegerQ[v], 2, perturbedDimension];
Phi[g_, vCenter_, v2_, t_, v_, beta_, perturbedDimension_] := 
  2*GraphDistSmooth[g, vCenter, 
     v2]^(1 - (d[g, v2, perturbedDimension])/2) HankelH2[v, 
    beta*GraphDistSmooth[g, vCenter, v2]]*Cos[t];
newVertexValuesFracDim[g_, v1_, t_, q_, c_, perturbedDimension_] := 
  Table[Re[Phi[g, v1, it, t, q, c, perturbedDimension]],
   {it, VertexList[g]}];
AmplitudeMatrix3D[g_, n_] := ArrayReshape[Getamplitudes[g], {n, n, n}];
SnowconeColor[z_] := Blend[{RGBColor[0, 0, 1],
    RGBColor[1, 1, 1],
    RGBColor[1, 0.4, 0.7]}, z];
GG101010 = GridGraph[{10, 10, 10},
   VertexShapeFunction -> "Circle",
   VertexSize -> Large];
animation3DTableGG = Table[Setamplitudes[GG101010,
    newVertexValuesFracDim[GG101010,
     First[GraphCenter[GG101010]],
     t, 0.3, 1, 3]];
   ListPlot3D[AmplitudeMatrix3D[GG101010, 10],
    ColorFunction -> SnowconeColor,
    PlotRange -> {{1, 10}, {1, 10}, {-2, 2}},
    BoxRatios -> {1, 1, 1}], {t, 0, 7, 0.5}];
ListAnimate[animation3DTableGG]

The graph formats..maybe there are other ways to render them. The only thing that means something is the volt difference. So at every point in space you could say there's a voltage, but all that matters is the difference of voltages between different places in space. How does one place in space kind of, if you model wave propagation, how do you relate the voltages effectively in different places in space and one way to think about that is, let's imagine that you have this voltage arranged in space and suddenly you change, I should say, when there's a difference in voltage you can represent that difference by an electric field, and you can kind of say "roughly" what's going to happen is you've got one place where there's a voltage another place where there's a voltage and an electric field that produces a change in one of these changes, that's got to change the electric field. When we change the voltage here that means we make that change, somewhere - how fast does the electric field change?

animation3DTableGG

10 miles away, it doesn't do it instantaneously, it does it at the speed of light. It does it as kind of a wave of change that propagates out, that wave of change is essentially an electromagnetic wave. And the fact that there has to be this wave of change, is the reason that photons exist in this picture. You think of it as a carrier of change, tell the rest of the universe that there was a change in this voltage. So it was a necessary feature of this idea that there was a voltage and this voltage was arbitrary, the difference between gauge and different places has a different effect..as you make a change in gauge, how does the rest of the universe get to know about that change? Gauge fields, like photons, kind of carriers of that change. And the answer is..exploring the propagation of waves through such systems could yield insights into quantum superposition and parallelism and when you say there's a change in this electric potential, well - okay you have to include this change in conventions..the bottom line is this connection field, this carrier of change is something like a photon. Maybe we can render them on Android. Like how we found common ground between us, was really foundational.

With[{gg = GridGraph[{10, 10, 10}, VertexShapeFunction -> "Circle"]}, 
  perturbedGraph3D = 
   Graph[introducePert[gg, 3, a], 
    VertexSize -> 
     Thread[VertexList[introducePert[gg, 3, a]] -> 
       Table[If[IntegerQ[i], 3, 5], {i, 
         VertexList[introducePert[gg, 3, a]]}]]]];
newVertexValuesFracDim[g_, v1_, t_, q_, c_, perturbedDimension_] := 
  Table[Re[Phi[g, v1, it, t, q, c, perturbedDimension]],
   {it, VertexList[g]}];
animation3DTableGGpertD = Table[
   Setamplitudes[perturbedGraph3D,
    newVertexValuesFracDim[perturbedGraph3D, 
     First[GraphCenter[perturbedGraph3D]],
     t, 0.3, 1, 2.4]];
   ListPlot3D[
    AmplitudeMatrix3D[perturbedGraph3D, 10],
    ColorFunction -> SnowconeColor,
    PlotRange -> {{1, 10}, {1, 10}, {-1, 1.5}},
    BoxRatios -> {1, 1, 1}],
   {t, Table[i, {i, 0, 6.5, 0.5}]}];
ListAnimate[
 Rasterize[#, RasterSize -> 400] & /@ animation3DTableGGpertD]

And you're a free man. This rate of change goes at the speed of light, has mass like a photon. Your work relates to multiway systems, a concept from the Wolfram Physics Project that suggests multiple simultaneous states or histories of a system. There's a mathematical theory of zero-mass gauge features..very elegant. Exploring the propagation of waves through systems as such kind of could yield insights into quantum superposition and parallelism, because that's how we understand how photons propagate through spaces of varying dimensions with direct implications for photonics, what we'll call the Higgs field. It interacts with this background thing it's just going happily along but it's being kicked by the fact that there's a background field. Normally, you just have electrons and photons that interact with each other. I'm hanging out around the Higgs field and there are Higgs particles everywhere, the whole universe is densely filled with Higgs particles. It will keep on, it will be keeping on affecting the process of being, where the electron given an effective mass in fractional dimensions, where the Higgs condensate, will make the electron have a mass. So you went from this thing. Thank you for this. So now you know the analytic solution for the wave equation, in the order that it happens.

animation3DTableGGpertD

SierGraph[n_, d_] := 
  MeshConnectivityGraph[SierpinskiMesh[n, d], 0, 
   VertexLabels -> Automatic];
fSier[g_, dockingIndex_, vertexname_] := Join[{{0, 1} -> dockingIndex},
   Table[{0, i} -> Subscript[vertexname, i],
    {i, Length[VertexList[g]]}]];
CreateSierpCorner[n_, d_, dockingIndex_, vertexname_] := Graph[
   EdgeList[SierGraph[n, d]] /.
     fSier[SierGraph[n, d],
     dockingIndex,
     vertexname]];
TableOfSierps[sierpx_, sierpDim_, firstDockingIndex_, 
   lastDockingIndex_] := Table[
   CreateSierpCorner[sierpx, sierpDim, a,
    ToString[Part[Alphabet[], a - firstDockingIndex + 1]] <>
     ToString[firstDockingIndex]],
   {a, firstDockingIndex, lastDockingIndex}];
Getamplitudes[g_] := AnnotationValue[g, VertexWeight];
Attributes[Setamplitudes] = {HoldFirst};
Setamplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
ColorByamplitude[g_, amplitudes_] := 
  HighlightGraph[g, 
   MapThread[
    Style, {VertexList[g], Map[ColorData["Rainbow"], amplitudes]}]];
ColorByInternalamplitude[g_] := 
  ColorByamplitude[g, Getamplitudes[g]];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[#]] - AdjacencyMatrix[#]) &@
   UndirectedGraph[g];
GraphSpectrum[
   g_] := <|"eigenvalues" -> Eigenvalues[#], 
     "eigenvectors" -> Eigenvectors[#]|> &@
   UnnormalizedLaplacian[g];
EigenSpaceProject[ic_, eigenvectors_] := eigenvectors . ic;
VertexSpaceProject[vector_, eigenvectors_] := 
  Transpose[eigenvectors] . vector;
EigenSpaceAdvance[spectrum_, coordinates_, 
   t_] := (Cos[1/10*t*spectrum["eigenvalues"]] +
     Sin[1/10*t*spectrum["eigenvalues"]])*coordinates;
amplitudeSpaceAdvance[spectrum_, ic_, t_] := VertexSpaceProject[
     EigenSpaceAdvance[spectrum, EigenSpaceProject[ic, #], t], #] &@
   spectrum["eigenvectors"];
Attributes[TimePropagate] = {HoldFirst};
TimePropagate[g_, t_] := 
  Setamplitudes[g, 
   amplitudeSpaceAdvance[GraphSpectrum[g], Getamplitudes[g], t]];
SetDeltaFunction[g_, vertex_, distance_] := Module[{ng = g},
   (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]];
   ng];
ThreeDGG = GridGraph[{10, 10, 10},
   VertexSize -> 6,
   VertexShapeFunction -> "Circle",
   ImageSize -> 400, VertexLabels -> Automatic];
t1 = TableOfSierps[3, 2, 1, 10];
t2 = TableOfSierps[3, 2, 91, 100];
finalChained3D = 
  Graph[GraphUnion[GridGraph[{10, 10, 10}], t1[[5]], t2[[5]]],
   ImageSize -> 400,
   VertexShapeFunction -> "Circle",
   VertexSize -> 6];
Setamplitudes[finalChained3D,
  ConstantArray[0, Length[VertexList[finalChained3D]]]];
ColorByInternalamplitude[finalChained3D];
deltaGridGraph3DSierp = SetDeltaFunction[finalChained3D,
   First[GraphCenter[GridGraph[{10, 10, 10}]]], 1];
ColorByInternalamplitude[deltaGridGraph3DSierp];
animation3DTableSierp = Table[
   TimePropagate[deltaGridGraph3DSierp, t];
   ColorByInternalamplitude[deltaGridGraph3DSierp],
   {t, Table[i, {i, 0, 30, 1}]}];
ListAnimate[
 Rasterize[#, RasterSize -> 400] & /@ animation3DTableSierp]

What we focus on is adding our own edges, which might explain the spatial behavior of the wave in cases where the dimension is less than or greater than two. And this thing effectively has a non-zero mass, that's all good, and you have to assume there's a self-interaction with the Higgs particles, if you have particles in a water the molecules of water interact with each other and that's how you get liquid water as opposed to the molecules flowing around and not paying any attention to each other, this condensate together is a consequence of the fact that they have interactions. There's this assumption that the Higgs field has this self-interaction that enriches our understanding of space-time geometry, I always thought this black hole massive object was just a massive hack and eventually, in the Large Hadron Collider, Higgs particles were discovered. 120 times the mass of a proton roughly and in the context of curved space-time around black holes, masses of all the elementary particles. I could quote you all those masses that existed at the time.

animation3DTableSierp

But, I am modeling, we know the transmission of signals in the irregular and fractal-like medium of interstellar space, especially when you accompany it with visualizations and simulations..it's an excitation, it's like the eddy in the fluid whereas the underlying fluid is like the whole fluid itself. In that sense we can switch places from the 3D to the Simon Fischer 2D grid graph, this is the place to be.

simpleGridGraph = GridGraph[{10, 10, 10},
   ImageSize -> 400,
   VertexSize -> 6,
   VertexShapeFunction -> "Circle"];
simpleGridGraph = EdgeAdd[simpleGridGraph,
   {529 <-> 500, 529 <-> 498, 529 <-> 558, 529 <-> 560, 529 <-> 561,
    529 <-> 501, 529 <-> 497, 529 <-> 557, 529 <-> 590, 529 <-> 588,
    529 <-> 620, 529 <-> 618, 529 <-> 470, 529 <-> 440, 529 <-> 468, 
    529 <-> 438}];
Setamplitudes[simpleGridGraph, ConstantArray[0, 1000]];
ColorByInternalamplitude[simpleGridGraph];
deltaGridGraphLocalPert = SetDeltaFunction[simpleGridGraph, 259, 1];
ColorByInternalamplitude[deltaGridGraphLocalPert];
TimePropagate[deltaGridGraphLocalPert, 0];
ColorByInternalamplitude[deltaGridGraphLocalPert];
animation3DTableLocalPert = 
  Table[TimePropagate[deltaGridGraphLocalPert, t];
   ColorByInternalamplitude[deltaGridGraphLocalPert],
   {t, Table[i, {i, 0, 16, 0.5}]}];
ListAnimate[Rasterize[#, RasterSize -> 400] & /@
  animation3DTableLocalPert]

I just show that the intensity of the wave gets amplified or damped whatever the dimensional shape. With these high-energy particles..we've got these electron-positron pairs, charge -1 and +1, and there's a cloud of electrons and positrons around the electron which in some sense will screen the charge of the electron, roughly.

animation3DTableLocalPert

edAddFct[g_] := 
 Sort /@ UndirectedEdge @@@ 
      Position[Outer[EuclideanDistance@## &, #, #, 1], N@Sqrt@3] &@
   GraphEmbedding@g // Union
AddCrossBars[g_] := EdgeAdd[g, edAddFct[g]]
simpleCrossGraph = EdgeAdd[GridGraph[{10, 10, 10},
    ImageSize -> 400,
    VertexSize -> 6,
    VertexShapeFunction -> "Circle"],
   edAddFct[GridGraph[{10, 10, 5}]]];
Setamplitudes[simpleCrossGraph,
  ConstantArray[0, Length[VertexList[simpleCrossGraph]]]];
ColorByInternalamplitude[simpleCrossGraph];
deltaGGCrossBar = SetDeltaFunction[simpleCrossGraph, 500, 1];
ColorByInternalamplitude[simpleCrossGraph];
animation3DTableCross = Table[TimePropagate[deltaGGCrossBar, t];
   ColorByInternalamplitude[deltaGGCrossBar],
   {t, Table[i, {i, 0, 16, 0.5}]}];
ListAnimate[animation3DTableCross]

These are quite some models for fractional dimensional shape.

animation3DTableCross

Fractional dimensions can cause damping or amplifying effects on the amplitude of EM waves, exploring the concept of curvature and modeling non-integer, spatial dimensions..this graph is particularly electromagnetically heating up, to say the least. Less than a microsecond after the beginning of the universe one wouldn't expect this condensate to exist. This condensate has a bunch of mass associated with it. So that means the fertile intersection of graph theory, physics, and computational modeling attracts scholars at us at the café, at the library meeting up for a chess match from diverse fields where we can contribute to a more holistic understanding of the universe's fabric, it's not like we can't efficiently handle the computations involved with this blanket notion that we can model wave propagation in variable-dimensional spaces! It would have to be as if one took steam and made it colder and colder and still had to turn it into water by a factor of a billion. I see the Simon Fischer resource functions for heterodimensional graphs, arbitrary wave equations, and grid graphs with crossbars. Yeah, I would like to express gratitude to you Simon for what happened between us and for supervising part of my project, with support and encouragement from Stephen Wolfram. The photon can carry momentum.

simpleGridGraph = 
  GridGraph[{16, 16}, VertexSize -> Large, ImageSize -> 350];
AnnotationValue[simpleGridGraph, VertexWeight];
Getamplitudes[g_] := AnnotationValue[g, VertexWeight];
Attributes[Setamplitudes] = {HoldFirst};
Setamplitudes[g_, amplitudes_] := 
  AnnotationValue[g, VertexWeight] = amplitudes;
ColorByamplitude[g_, amplitudes_] := 
  HighlightGraph[g, 
   MapThread[
    Style, {VertexList[g], Map[ColorData["Rainbow"], amplitudes]}]];
ColorByInternalamplitude[g_] := 
  ColorByamplitude[g, Getamplitudes[g]];
SetDeltaFunction[g_, vertex_, distance_] := 
  Module[{ng = 
     g}, (AnnotationValue[{ng, #}, VertexWeight] = 
       ConstantArray[1, Length[#]]) &@
    VertexList[NeighborhoodGraph[g, vertex, distance]]; ng];
UnnormalizedLaplacian[g_] := 
  N@(DiagonalMatrix[VertexOutDegree[#]] - AdjacencyMatrix[#]) &@
   UndirectedGraph[g];
AdjMatrix[g_] := N@AdjacencyMatrix[#] &@UndirectedGraph[g];
GraphSpectrum[
   g_] := <|"eigenvalues" -> Eigenvalues[#], 
     "eigenvectors" -> Eigenvectors[#]|> &@UnnormalizedLaplacian[g];
EigenSpaceProject[ic_, eigenvectors_] := eigenvectors . ic;
VertexSpaceProject[vector_, eigenvectors_] := 
  Transpose[eigenvectors] . vector;
EigenSpaceAdvance[spectrum_, coordinates_, 
   t_] := (Cos[1/10*t*spectrum["eigenvalues"]] + 
     Sin[1/10*t*spectrum["eigenvalues"]])*coordinates;
amplitudeSpaceAdvance[spectrum_, ic_, t_] := 
  VertexSpaceProject[
     EigenSpaceAdvance[spectrum, EigenSpaceProject[ic, #], t], #] &@
   spectrum["eigenvectors"];
Attributes[TimePropagate] = {HoldFirst};
TimePropagate[g_, t_] := 
  Setamplitudes[g, 
   amplitudeSpaceAdvance[GraphSpectrum[g], Getamplitudes[g], t]];
Setamplitudes[simpleGridGraph, ConstantArray[0, 256]];
ColorByInternalamplitude[simpleGridGraph];
deltaGridGraph = 
  SetDeltaFunction[simpleGridGraph, 
   First[GraphCenter[simpleGridGraph]], 1];
ColorByInternalamplitude[deltaGridGraph];
animation2DTable = 
  Table[TimePropagate[deltaGridGraph, t]; 
   ColorByInternalamplitude[deltaGridGraph], {t, 
    Table[i, {i, 1, 10, 0.5}]}];
ListAnimate[animation2DTable]

Combined Graph

But later on, people said look it's such a cool effect that you get this exponential expansion that something must work out okay with respect to the supercooling phenomenon, it led to a lot of scenarios that are patched and so on; I think the story of the universe and its expansion are that the universe started out infinite-dimensional and "required" all these patches in existing theories, which could benefit a wide range of computational applications. The potential of mass density, non-Euclidean geometries in physics, suggests ways these geometries could be employed in practical applications such as the expansion of the universe that accelerates; relative to us at some particular place in the universe, there are parts of the universe that are receding from us faster than the speed of light, the universe tears itself apart and there are pieces we just don't know what's going to happen to them because you might be sending, exchanging radio signals, the radio signals will never get to you.

EigenSpaceAdvance[spectrum_, coordinates_, 
   t_] := (Cos[1/10*t*spectrum["eigenvalues"]])*coordinates;
Setamplitudes[simpleGridGraph, ConstantArray[0, 256]];
ColorByInternalamplitude[simpleGridGraph];
deltaGridGraph = 
  SetDeltaFunction[simpleGridGraph, 
   First[GraphCenter[simpleGridGraph]], 1];
ColorByInternalamplitude[deltaGridGraph];
animation2DTable = Table[TimePropagate[deltaGridGraph, t];
   Graph[ColorByInternalamplitude[deltaGridGraph], 
    VertexSize -> 
     Thread[VertexList[ColorByInternalamplitude[deltaGridGraph]] -> 
       0.8*(Abs[
          AnnotationValue[ColorByInternalamplitude[deltaGridGraph], 
           VertexWeight]])]], {t, Table[i, {i, 0, 8, 0.5}]}];
ListAnimate[animation2DTable]

Combination Graph

Inside a black hole, that radio signal will never get out and it's the same type of thing here because of this thing called Principle of Equivalence, the equivalence between gravity and acceleration you will just never get, this signal so to speak so I think that by intertwining theoretical physics with computational and mathematical techniques we get this erratic, irregular and fractal-like medium of interstellar space where we can transmit these electromagnetic waves, photon propagation through variable-dimensional space.

f[x_, y_, dockingIndex_] := 
 Join[{x*y -> dockingIndex}, Table[i -> Subscript[v, i], {i, x*y - 1}]]
Create2DGGCorner[x_, y_, dockingIndex_] := 
 Graph[EdgeList[GridGraph[{x, y}]] /. f[x, y, dockingIndex]]
fFace[x_, y_, dockingIndices_] := 
 Join[Thread[Table[i, {i, Length[dockingIndices]}] -> dockingIndices],
   Table[i -> Subscript[v, i], {i, 
    DeleteCases[VertexList[GridGraph[{x, y}]], 
     Alternatives @@ Table[i, {i, Length[dockingIndices]}]]}]]
Create2DGGFace[x_, y_, dockingIndices_] := 
 Graph[EdgeList[GridGraph[{x, y}]] /. fFace[x, y, dockingIndices]]
appendLowerDGG[highDGG_, lowDGG_] := GraphUnion[highDGG, lowDGG]
appendLowerDGG[GridGraph[{5, 5, 5}], Create2DGGCorner[5, 5, 1]]
appendLowerDGG[GridGraph[{5, 5, 5}], 
 Create2DGGFace[5, 5, {1, 2, 3, 4, 5}]]
SierGraph[n_, d_] := 
  MeshConnectivityGraph[SierpinskiMesh[n, d], 0, 
   VertexLabels -> Automatic];
SierGraph[2, 3]
fSier[g_, dockingIndex_, vertexname_] := 
 Join[{{0, 1} -> dockingIndex}, 
  Table[{0, i} -> Subscript[vertexname, i], {i, 
    Length[VertexList[g]]}]]
CreateSierpCorner[n_, d_, dockingIndex_, vertexname_] := 
 Graph[EdgeList[SierGraph[n, d]] /. 
   fSier[SierGraph[n, d], dockingIndex, vertexname]]
Graph[GraphUnion[GridGraph[{5, 5}], CreateSierpCorner[3, 2, 1, v]], 
 ImageSize -> 500]
fPertD[g_, vertexname_, pertRadius_] := 
 Table[i -> Subscript[vertexname, i], {i, 
   VertexList[
    NeighborhoodGraph[g, First[GraphCenter[g]], pertRadius]]}]
introducePert[g_, pertRadius_, vertexname_] := 
 Graph[EdgeList[g] /. fPertD[g, vertexname, pertRadius]]
GG1010 = GridGraph[{10, 10}];
g1 = introducePert[GG1010, 2, v];
perturbedGraph1010 = 
 Graph[g1, 
  VertexSize -> 
   Thread[VertexList[g1] -> 
     Table[If[IntegerQ[i], 0.2, 0.9], {i, VertexList[g1]}]], 
  ImageSize -> 300]
Plot[{Re[x^(1 - (1.585)/2) HankelH2[3, 1*x]], 
  Re[HankelH2[3, 1*x]]}, {x, 0, 100}, PlotLegends -> "Expressions", 
 ImageSize -> Large, 
 AxesLabel -> {"Radial distance r [a.u.]", "Amplitude [V/m]"}]
Plot[{Re[x^(1 - (2.3)/2) HankelH2[3, 1*x]], Re[HankelH2[3, 1*x]]}, {x,
   0, 100}, PlotLegends -> "Expressions", ImageSize -> Large, 
 AxesLabel -> {"Radial distance r [a.u.]", "Amplitude [V/m]"}]
Phi[g_, vCenter_, v2_, t_, v_, beta_, perturbedDimension_] := 
 2*GraphDistSmooth[g, vCenter, 
    v2]^(1 - (d[g, v2, perturbedDimension])/2) HankelH2[v, 
   beta*GraphDistSmooth[g, vCenter, v2]]*Cos[t]
GraphDistSmooth[g_, v1_, v2_] := 
 If[String[v1] === String[v2], 1, GraphDistance[g, v1, v2]]
d[g_, v_, perturbedDimension_] := 
 If[IntegerQ[v], 2, perturbedDimension]
dEstimate[g_, v_] := 
 ResourceFunction["WolframHausdorffDimension"][g, v]
newVertexValuesFracDim[g_, v1_, t_, q_, c_, perturbedDimension_] := 
 Table[Re[Phi[g, v1, it, t, q, c, perturbedDimension]], {it, 
   VertexList[g]}]
GG2020 = 
  GridGraph[{20, 20}, VertexShapeFunction -> "Circle", 
   VertexSize -> Large];
animation2DTableGG = 
  Table[Setamplitudes[GG2020, 
    newVertexValuesFracDim[GG2020, First[GraphCenter[GG2020]], t, 0.3,
      1, 2]];
   ColorByInternalamplitude[GG2020], {t, Table[i, {i, 0, 7, 0.5}]}];
ListAnimate[animation2DTableGG]

Photon 1

Photon 2

Photon 3

Photon 4

Photon 5

Photon 6

Photon 7

Animation

And I've got energy inside the atom, the photon comes in and excites the atom. It's sort of like playing the piano, the economics of how we can use the Laplacian Matrix for integer dimensions, discretize continuous solutions for fractional dimensions, and explore integer and fractional dimensional spaces, including the use of structures like the Sierpiński graph to represent fractional dimensions that propels us to look up at these strange fish, and then look down and call these animations by the same name, because we keep calling them by the same name, because the "original" ListAnimate2DTable doesn't even exist and when something doesn't even exist, the dimensional change..depending on the dimensional change (integer or fractional), the intensity of the wave can either amplify or dampen.

fPertD[g_, vertexname_, pertRadius_] := 
 Table[i -> Subscript[vertexname, i], {i, 
   VertexList[
    NeighborhoodGraph[g, First[GraphCenter[g]], pertRadius]]}]
introducePert[g_, pertRadius_, vertexname_] := 
 Graph[EdgeList[g] /. fPertD[g, vertexname, pertRadius], 
  ImageSize -> 700, VertexLabels -> None]
GG2020 = GridGraph[{20, 20}, VertexShapeFunction -> "Circle"];
g2 = introducePert[GG2020, 3, v];
perturbedGraph2020 = 
  Graph[g2, 
   VertexSize -> 
    Thread[VertexList[g2] -> 
      Table[If[IntegerQ[i], 0.6, 0.9], {i, VertexList[g2]}]], 
   ImageSize -> 400];
perturbedGraph2020GridForm = 
  Graph[perturbedGraph2020, 
   VertexCoordinates -> 
     VertexList[
      perturbedGraph2020] /. (Thread[
       VertexList[GG2020] -> (GG2020 // GraphEmbedding)] /. 
      fPertD[GG2020, v, 3])];
animation2DTableGGpertD = 
  Table[Setamplitudes[perturbedGraph2020GridForm, 
    newVertexValuesFracDim[perturbedGraph2020GridForm, 83, t, 0.3, 1, 
     1.585]];
   ColorByInternalamplitude[perturbedGraph2020GridForm], {t, 
    Table[i, {i, 0, 6.5, 0.5}]}];
ListAnimate[
 Rasterize[#, RasterSize -> 400] & /@ animation2DTableGGpertD]

Animation Perturbed

This amplification or dampening is a significant finding which has multiple connotations including as a collection, of the things that we want. The interaction between a Higgs field and a particle field, the Electron field is called Psi, wave behavior changes in spaces with dimensions less than, equal to, or greater than. The showcase of the power of computational methods in simulating complex physical phenomena is awesome, and everything links together to what I predicate on these conditions, the graph theory, differential equations, and topology with physical theories and that masquerades as a mass for theoretical exploration as a field.

TwoDGG = 
  GridGraph[{20, 20}, VertexSize -> 2, 
   VertexShapeFunction -> "Circle", ImageSize -> 400, 
   VertexLabels -> Automatic];
TableOfSierps[sierpx_, sierpDim_, firstDockingIndex_, 
  lastDockingIndex_] := 
 Table[CreateSierpCorner[sierpx, sierpDim, a, 
   ToString[Part[Alphabet[], a - firstDockingIndex + 1]] <> 
    ToString[firstDockingIndex]], {a, firstDockingIndex, 
   lastDockingIndex}]
t1 = TableOfSierps[3, 2, 1, 10];
t2 = TableOfSierps[3, 2, 91, 100];
finalChained = 
  Graph[GraphUnion[GridGraph[{10, 10}], t1[[5]], t2[[5]]], 
   ImageSize -> 400, VertexShapeFunction -> "Circle", 
   VertexSize -> 2.5];
Setamplitudes[finalChained, 
  ConstantArray[0, Length[VertexList[finalChained]]]];
ColorByInternalamplitude[finalChained];
EigenSpaceAdvance[spectrum_, coordinates_, 
   t_] := (Cos[1/10*t*spectrum["eigenvalues"]] + 
     Sin[1/10*t*spectrum["eigenvalues"]])*coordinates;
deltaGridGraph2DSierp = 
  SetDeltaFunction[finalChained, 
   First[GraphCenter[GridGraph[{10, 10}]]], 1];
ColorByInternalamplitude[deltaGridGraph2DSierp];
animation2DTableSierp = 
  Table[TimePropagate[deltaGridGraph2DSierp, t]; 
   ColorByInternalamplitude[deltaGridGraph2DSierp], {t, 
    Table[i, {i, 0, 30, 1}]}];
ListAnimate[
 Rasterize[#, RasterSize -> 400] & /@ animation2DTableSierp]

Animation 2D Table Sierp

So, let's see advanced optical systems and how they potentially impact fiber optics, laser technology, and quantum computing with regard to material science and how we can perform chemical engineering in front of a mirror, we can understand wave propagation in the sense of various laminated..dimensional spaces that inform the design of new materials with specific optical properties. The understanding that we need of topological stability, how do we need it? The particle interactions in Quantum Field Theory and the topology of a donut with a hole in it, because ha, the understanding that we have of space-time is like a torus.

simpleGridGraph = 
  GridGraph[{30, 30}, ImageSize -> 400, VertexSize -> 0.6, 
   VertexShapeFunction -> "Circle"];
Setamplitudes[simpleGridGraph, ConstantArray[0, 900]];
ColorByInternalamplitude[simpleGridGraph];
deltaGridGraphLocalPert = SetDeltaFunction[simpleGridGraph, 259, 1];
ColorByInternalamplitude[deltaGridGraphLocalPert];
TimePropagate[deltaGridGraphLocalPert, 0];
ColorByInternalamplitude[deltaGridGraphLocalPert];
animation2DTableLocalPert = 
  Table[TimePropagate[deltaGridGraphLocalPert, t]; 
   ColorByInternalamplitude[deltaGridGraphLocalPert], {t, 
    Table[i, {i, 0, 16, 0.5}]}];
ListAnimate[
 Rasterize[#, RasterSize -> 400] & /@ animation2DTableLocalPert]

Animation 2D Table Local Pert

And astrophysics' signal transmissions in complex interstellar mediums like jam just injected into the center of this..sphere like the geometry around massive cosmic bodies that we rip, blobs of dough that we study and we have to rip the dough, we can't just continuously deform it to go from the no hole to the hole hole situation, which bridges various mathematical concepts like graph theory, and the differential equations that allow us to perform partial navigation of topological spaces in nautical exploration of how fluid has a certain velocity, where we are not, we are discretizing space on a graph and applying different mathematical and computational techniques akin to some kind of skyrmion that you can't get rid of, that's kind of the thing. It was like discretizing a whole new space on a graph and we even got on a line and took a step up and a step down. Where do I get to when I flip a coin, I get all these wiggly curves that come up and down and they wiggle around and first you get 0. Then, you get the average distance about the square root of the number of steps. Then, the overall distribution is called the Gaussian distribution or normal distribution and the Bell curve shows up all over the place. And you get heads, heads, heads, and tails, tails, tails, and every random walk in one dimension eventually gets back to 0 again. And that's a phenomenon that I'm going to regret, let's say I'm ahead and I'm winning and I indirectly touch upon concepts like quantum superposition and parallelism. Gambler's ruin - eventually you're going to have enough tails that you get right back to 0 right again. It's not about you, it's about fair-weather three-dimensional origin return, in the sense of the long interim before we got back to the origin again, there's this specific optical property of static that, every once in a blue moon you get this interactive simulation that paves the way for more collaborative efforts in understanding the universe. If you could make something 2.5 dimensional, what would it be like? It's sort of the first time that we have a robust way of talking about fractional dimensions..and it doesn't quite work generically there so there may very well be something so yes, it is right that you could take a random walk on this graph, how many points do you get to by going a certain distance out? And that is closely related to the question of what's the probability that you come back on the random walk, if you had an equation for heat; the diffusion equation, start a very very large number of random walks, what is the density, what is the Gaussian distribution of the Bell curve, there are fractional dimensions in the return time of random walks that give you a "cloud" of probabilities of coming back to the origin.

POSTED BY: Dean Gladish

Great work and very exciting findings!! I am looking forward to see further developments of the project Simon!

Thanks Gianmarco! Was a great summer school and I was blessed to work with you!

POSTED BY: Simon Fischer
Posted 3 years ago

Photon propagation through Sierpinski graph was awesome! Another name for the 3D Sierpinski Tetrahedron is the Tetrix (https://en.wikipedia.org/wiki/Sierpi%C5%84ski_triangle)

POSTED BY: Chase Marangu

Thanks Chase! That's interesting, didn't know that - Will have a look, thank you :)

POSTED BY: Simon Fischer

enter image description here -- you have earned Featured Contributor Badge enter image description here Your exceptional post has been selected for our editorial column Staff Picks http://wolfr.am/StaffPicks and Your Profile is now distinguished by a Featured Contributor Badge and is displayed on the Featured Contributor Board. Thank you!

POSTED BY: EDITORIAL BOARD

Any comments / discussions are welcome:)

POSTED BY: Simon Fischer
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard