Keep every explanation and worked example on the page. Nothing moves or plays by itself, and the larger instruments load only when you ask.
Brownian motion · Learning from a finite sample
From wanderingto a number.
An equation predicts how particles spread. Turn the question around: what can a finite set of displacements tell you about its hidden parameters, and what must you know independently?
The inverse problem
What can wandering reveal?
Static worked example
Predict before the numbers
With four times as many displacement measurements, the interval for D becomes about four times narrower, about two times narrower, or unchanged?
The result appears when you choose, say you have one in mind, or skip.
These positions were generated with a hidden molecular number. First ask what the observations identify. Then declare the missing information, estimate the number, and test what a confidence interval does across hypothetical repeats.
These comparison buttons use accepted settings, not draft edits. “Use declared generator conditions” supplies the known setup of this synthetic exercise; it is not a real independent measurement.
The CSV contains every selected position and displacement in SI units with generator metadata. It contains synthetic data, not observations of a real suspension. Opening a shared link starts no worker.
One synthetic path, observed at the accepted spacing. Solid: x; dashed: y when selected. Connecting lines join observations; they do not claim a resolved microscopic trajectory.
Static worked example. No calculation has been started in this browser.
Accepted seed 1905; 50 non-overlapping displacements; 2 coordinates; spacing 1 s. Known zero drift · unbiased. Assumed T = 293.15 K, η = 1 mPa s; independent radius not declared.
What the data identify
Accepted estimate and conditional diffusion uncertainty
Estimated D (μm²/s)
0.88271
95% diffusion interval (μm²/s)
0.68131 – 1.1893
Degrees of freedom
100
Compatible radius × number (m/mol)
1.4649 × 10¹⁷
A family before a single number
At the assumed temperature and viscosity, the estimated diffusion scale constrains a product: radius times molecular number. A larger radius and a smaller number can fit exactly the same point estimate.
Each point on the solid curve gives the same diffusion estimate at the stated temperature and viscosity. This is a compatible family, not a confidence region and not a second measurement of the radius.Read all compatible pairs
Radius–number family for this accepted estimate
Radius (μm)
N (10²³ mol⁻¹)
0.1
14.649
0.10778
13.592
0.11616
12.611
0.12519
11.701
0.13493
10.857
0.14542
10.073
0.15673
9.3465
0.16892
8.6721
0.18206
8.0463
0.19621
7.4657
0.21147
6.927
0.22792
6.4272
0.24565
5.9634
0.26475
5.5331
0.28534
5.1339
0.30753
4.7634
0.33145
4.4197
0.35722
4.1008
0.385
3.8049
0.41494
3.5303
0.44721
3.2756
0.48199
3.0392
0.51948
2.8199
0.55988
2.6165
0.60342
2.4277
0.65034
2.2525
0.70092
2.0899
0.75543
1.9391
0.81418
1.7992
0.8775
1.6694
0.94574
1.5489
1.0193
1.4372
1.0986
1.3335
1.184
1.2372
1.2761
1.148
1.3753
1.0651
1.4823
0.98828
1.5975
0.91696
1.7218
0.8508
1.8557
0.78941
2
0.73244
This checks the inference method on data made with a hidden number. It is not evidence that molecules exist.
Condition on the missing information
Conditional on exact input values; target 95%
Recovered N (10²³ mol⁻¹)
The data constrain a radius–number product, not radius and molecular number separately. Declare an independent radius to condition the estimate.
Selected interval (10²³ mol⁻¹)
The data constrain a radius–number product, not radius and molecular number separately. Declare an independent radius to condition the estimate.
This is recovery of a synthetic generating parameter, not a measurement of the modern Avogadro constant. The inverted bounds exchange endpoints. A finite confidence interval is not a posterior probability assigned to this one fixed parameter.
Estimator bias and small-sample limits
The known-zero-drift estimate uses every coordinate without subtracting a fitted mean. Fitting a separate drift in each coordinate consumes degrees of freedom. The centered maximum-likelihood estimate divides by the original sample count; the unbiased version uses one fewer. Both use the same correctly rescaled confidence interval.
Expected ratios under the ideal model with correct input values
Mean estimated D / true D
1
Mean recovered N / true N
1.0204
Variance of recovered N / true N
0.021692
An unbiased diffusion estimate does not have an unbiased reciprocal. With too few degrees of freedom, the reciprocal’s mean or variance does not exist even though a particular trial can produce a finite estimate. With one displacement and fitted drift, spread is underdetermined.
The hidden answer is a learning device, not a secret: the generated browser data can be inspected.
Inspect the accepted observations
All selected synthetic positions and increments; μm and seconds
Time
x (μm)
y (μm)
Δx (μm)
Δy (μm)
0
0
0
1
−2.3879
−0.70732
−2.3879
−0.70732
2
−1.6243
−1.074
0.76359
−0.36669
3
−2.4113
1.5563
−0.78703
2.6303
4
−0.77454
2.9297
1.6368
1.3734
5
1.855
4.3588
2.6295
1.4292
6
0.69695
4.734
−1.158
0.3752
7
−0.73954
4.6997
−1.4365
−0.034373
8
2.1201
4.3145
2.8597
−0.38513
9
0.9444
4.4184
−1.1757
0.10385
10
0.55087
5.964
−0.39354
1.5456
11
0.63602
7.9094
0.085157
1.9454
12
0.92416
6.3823
0.28814
−1.5271
13
2.3756
7.0766
1.4515
0.69424
14
2.6346
7.3812
0.259
0.30462
15
2.7068
7.8937
0.072121
0.51253
16
1.645
7.0356
−1.0618
−0.85806
17
1.5049
7.7346
−0.14009
0.69891
18
0.0087504
7.6172
−1.4962
−0.11731
19
1.6866
6.2646
1.6779
−1.3527
20
0.63912
6.1636
−1.0475
−0.10093
21
−0.66502
5.5842
−1.3041
−0.57943
22
−2.9134
6.1162
−2.2484
0.532
23
−2.4872
5.7131
0.42622
−0.40314
24
−2.5599
7.2136
−0.072652
1.5005
25
−1.9364
6.5418
0.62345
−0.67176
26
−3.3813
6.6304
−1.4449
0.088609
27
−2.3324
5.5809
1.0489
−1.0495
28
−2.0459
2.9556
0.28654
−2.6253
29
−3.5629
3.7742
−1.517
0.81859
30
−0.16484
3.1575
3.3981
−0.61668
31
−1.4519
3.1915
−1.2871
0.033954
32
−2.0679
1.4143
−0.61602
−1.7772
33
−2.5149
1.6097
−0.44696
0.19549
34
−1.6831
4.7881
0.83176
3.1783
35
−0.53307
3.8034
1.1501
−0.98462
36
−1.6468
5.9611
−1.1138
2.1577
37
−1.2531
4.4418
0.39373
−1.5193
38
−2.2336
5.296
−0.9805
0.85426
39
−1.7445
7.0582
0.48911
1.7621
40
−1.4824
7.3332
0.26211
0.275
41
0.97731
6.624
2.4597
−0.70916
42
2.6769
7.0439
1.6996
0.41987
43
0.47083
5.5085
−2.2061
−1.5354
44
0.418
4.7481
−0.05283
−0.76038
45
0.91945
2.1981
0.50145
−2.55
46
3.8279
0.85528
2.9085
−1.3428
47
3.348
−0.76496
−0.47992
−1.6202
48
2.4238
−0.74306
−0.9242
0.021895
49
0.59245
−1.1868
−1.8314
−0.44372
50
0.019898
0.25574
−0.57255
1.4425
What does coverage mean?
Repeat the observation procedure on other hypothetical paths with the same generating parameter. Each interval moves; the parameter does not. Change an inference assumption while keeping those paths to see how a wrong radius can spoil molecular-number coverage even when diffusion intervals behave well.
Uses the accepted settings. No seed search, discarded failures or redraws to reach the target fraction. In combined-input mode this view is unavailable: no repeated input-measurement procedure has been specified. After a form edit, run coverage explicitly again.
Diffusivity procedure
Run the hypothetical experiments explicitly to inspect interval coverage.
Molecular-number procedure
Run the hypothetical experiments explicitly to inspect interval coverage.
Same scientific action without the plot
Choose the observation set, estimator, and interval kind from the lists. Type the displacement count M and the inference temperature, viscosity, and radius. Read the table of estimated D and its interval, then N and its interval with the wording above, the inverse-bias note, and the identifiability family. The plots are a view of that same accepted snapshot.
Not modeled: localization error, blur, correlated or irregularly timed increments, and censoring (see the camera laboratory and kitchen mode); non-Gaussian increments; time-varying drift; polydispersity within one track set; wall effects; uncertainty in C without declared coverages; uncertainty in the gas constant itself.
Accepted calculation identity and limits
Computed by the host reference evaluator inference.bm07, for the scenario scenario-bm07-hidden-number.
Primary recording draws: 16385. Work for this request: 16385 draws, including 0 for hypothetical experiments. Retained primary recording: 65552 bytes. Reused worker recording: no.
Source identity: source:sha256:d7c143066043c23f1cba39a975b3928834a1275abe090374b8853e99570ecfc5. This host preview has no historical data importer or camera-noise fit. Browser arithmetic is not a claim of strict cross-engine WASM replay.
Watching a small sphere wander tells you how fast it spreads. If you also know the temperature, how thick the liquid is and how big the sphere is, the spreading tells you how many molecules make up a mole, and the lab shows how sure a limited number of observations can make you.
Section 5 ends by turning its formula around: N = (t/λx2)(RT/(3πkP)), so a measured mean square displacement, with the temperature, the viscosity and the radius, gives the number of molecules in a gram-molecule. The instrument does this with synthetic data from a generator whose number is hidden, 3.03 × 1023, deliberately not today's value, so the exercise tests the method and not the world. From 50 steps of 1 s in two directions, 100 squared steps, it estimates D = 8.83 × 10−13 m2/s, with a 95 percent interval from 6.81 to 11.89 × 10−13. Displacements alone fix only the product of radius and number, a·N = 1.46 × 1017 m/mol. Given the radius, 0.5 μm, the estimate is N = 2.93 × 1023, with an interval from 2.17 to 3.80 × 1023 that contains the hidden value. With today's defined constants the same inversion is only a consistency check, because NA is now fixed by definition.
Start from what each step tells you. Along one axis a sphere's step Δ over a time τ has mean square 2Dτ, so D can be estimated as the average of Δ2/(2τ). The instrument records 50 steps of τ = 1 s in two directions, 100 squared steps in all, and their average divided by 2 gives D̂ = 8.83 × 10−13 m2/s. Because each step is a Gaussian draw, 100 D̂/D follows a chi-square law with 100 degrees of freedom, whose middle 95 percent runs from 74.2 to 129.6. So D lies between 100 D̂/129.6 = 6.81 × 10−13 and 100 D̂/74.2 = 11.89 × 10−13 m2/s; the generator's own D, 8.55 × 10−13, is inside. Now invert. Einstein's D = (RT/N)/(6πηa) gives a·N = RT/(6πηD̂). With R = 8.314 J/(mol K), T = 293.15 K and η = 0.001 Pa s, RT = 2437 J/mol and 6πηD̂ = 6 × 3.1416 × 0.001 × 8.83 × 10−13 = 1.664 × 10−14, so a·N = 2437/(1.664 × 10−14) = 1.465 × 1017 m/mol. A sphere twice as large with half as many molecules per mole wanders in exactly the same way, so the data cannot tell them apart. Give the radius, a = 0.5 × 10−6 m, and N = 1.465 × 1017/(0.5 × 10−6) = 2.93 × 1023. Because N goes as 1/D, the interval turns over: the largest D gives the smallest N, so N lies between 2.17 and 3.80 × 1023. Inverting also biases the estimate, since the average of 1/D̂ exceeds 1/D by the factor 100/98 = 1.020.
Modern qualifications
Einstein's printed form is N = (t/λx2)(RT/(3πkP)), with k the viscosity and P the radius, and he closed by hoping a researcher would soon decide the question. Perrin did, in 1908 and 1909, following grains of gamboge and mastic whose radius he measured separately, and found N near 7 × 1023. The chi-square interval, the turned-over interval for N and the bias factor are modern statistics that Einstein did not give. Since 2019 NA = 6.022 140 76 × 1023 mol−1 exactly and kB is fixed too, so an inversion with today's constants recovers its own inputs: it checks the method and does not count molecules.
Show the code
The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
estimateIncrements · src/physics/reference/inference.ts · this site’s source, as built · sha256:71f7841c5ec492581374173df9d328a3e208b2d1abb9cce82f455ea92f23389e
This function computes the listed outputs when it runs.
In words
It sums the squared displacements and divides by twice the interval and by a count, which is the whole of the estimate. What differs between the three estimators is the count and whether the mean is subtracted first: the known-zero-drift estimator subtracts nothing and divides by the full number of coordinates; the drift-centered one subtracts the sample mean and loses one degree of freedom for it; the maximum-likelihood one centres as well but divides by the uncentred count. On the same eight displacements at half-second spacing those give 2.8125, 3.0536 and 2.6719 times 10^-12 m^2/s.
Implementation
exportfunctionestimateIncrements(increments:Float64Array,dt:number,d:number,estimatorId:EstimatorId,):Assessment<Estimate>{if(!(incrementsinstanceofFloat64Array)||![1,2,3].includes(d)||increments.length%d||increments.length>10000||!positive(dt)||!["independent-increment-known-zero-drift","drift-centered","maximum-likelihood-centered",].includes(estimatorId))returninvalid("Use finite equally timed increments, 1–3 coordinates, and a registered estimator (at most 10000 coordinates).",);constM=increments.length/d,centered=estimatorId!=="independent-increment-known-zero-drift";if(M<(centered?2:1))returnnoValue("underdetermined",centered?"A second independent increment, or a known drift, is needed to separate drift from spread.":"No admitted increments are available.",);letscale=0;for(constxofincrements){if(!Number.isFinite(x))returninvalid("Every displacement must be finite.");scale=Math.max(scale,Math.abs(x));}constmeans=newFloat64Array(d),drift=newFloat64Array(d);if(scale>0)for(leti=0;i<M;i++)for(letc=0;c<d;c++){constmeanC=means[c]??0;constinc=increments[i*d+c]??0;means[c]=meanC+(inc/scale-meanC)/(i+1);}letsum=0,compensation=0;if(scale>0)for(leti=0;i<M;i++)for(letc=0;c<d;c++){constinc=increments[i*d+c]??0;constmeanC=means[c]??0;constx=inc/scale-(centered?meanC:0);constterm=x*x-compensation,next=sum+term;compensation=next-sum-term;sum=next;}constobservationInterval=dt,q=d*(centered?M-1:M),normalization=estimatorId==="maximum-likelihood-centered"?d*M:q;constsumSquares=sum*scale*scale,unbiasedDHat=sumSquares/(2*observationInterval)/q,dHat=sumSquares/(2*observationInterval)/normalization;for(letc=0;c<d;c++)drift[c]=((means[c]??0)*scale)/dt;if(![sumSquares,unbiasedDHat,dHat,...drift].every(Number.isFinite)||(sum>0&&(sumSquares===0||dHat===0||unbiasedDHat===0)))returninvalid("The displacement scale exceeds this binary64 calculation's representable range.",);return{kind:"accepted",data:Object.freeze({dHat,unbiasedDHat,M,d,q,sumSquares,normalization,biasFactor:q/normalization,drift,estimatorId,}),};}
The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
inverseBias · src/physics/reference/inference.ts · this site’s source, as built · sha256:95caaf88d552be626b5d3c6b1371ef33c5b2934361ab493bafacdffa0cd0e058
This function computes the listed outputs when it runs.
In words
A molecular number is recovered by DIVIDING by the diffusivity, and the reciprocal of a noisy estimate is not the reciprocal of the truth. For a chi-square estimate on q degrees of freedom the mean of the reciprocal is larger by normalization over (q - 2), and its variance is twice the normalization squared over (q - 2) squared times (q - 4). At q = 5 those are 1.667 and 5.556; at q = 10 with a normalization of 12, 1.5 and 0.75.
Implementation
exportfunctioninverseBias(q:number,normalization=q,):Assessment<Readonly<{meanFactor:number;varianceFactor:number|null}>>{if(!positive(q)||!positive(normalization))returninvalid("Positive degrees of freedom and normalization are required.");if(q<=2)returnnoValue("not-applicable","The inverse estimate has no finite expectation with two or fewer degrees of freedom.",);return{kind:"accepted",data:{meanFactor:normalization/(q-2),varianceFactor:q>4?(2*normalization**2)/((q-2)**2*(q-4)):null,},};}
The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
invertToMolecularNumber · src/physics/reference/inference.ts · this site’s source, as built · sha256:efce210ad84842a38f67ae1f5e8c952a02d58d7797d326bed27772f99bcf9b72
This function computes the listed outputs when it runs.
In words
N = R T / (6 pi eta a D), which is the Stokes-Einstein relation read backwards, with the interval carried through by dividing the ENDS in the opposite order, so the upper diffusivity gives the lower number. On a modern set at 290.15 K, 1.35 mPa s, half a micron and a diffusivity of 3.1 times 10^-13 m^2/s it returns 6.116 times 10^23, which is 1.0156 times the defined Avogadro constant, and the Boltzmann constant implied by the same inputs, 1.3594 times 10^-23 J/K.
Implementation
exportfunctioninvertToMolecularNumber(input:Conditions&{dHat:number;interval:StatisticalInterval;synthetic:boolean},set:ConstantSet,):Assessment<Readonly<{estimate:number;interval:StatisticalInterval;constantSetId:string;semanticKind:NumberMeaning;consistencyRatio:number|null;estimatedBoltzmannConstant:number|null;consistencyRatioInterval:StatisticalInterval|null;estimatedBoltzmannConstantInterval:StatisticalInterval|null;}>>{constconditions=checkConditions(input);if(conditions.kind!=="accepted")returnconditions;constg=gas(set,input.synthetic);if(g.kind!=="accepted")returng;if(input.dHat===0||input.interval.lower===0)returnnoValue("underdetermined","No positive diffusion scale was resolved; a finite molecular number cannot be recovered by division by zero.",);if(!positive(input.dHat)||!positive(input.interval.lower)||!positive(input.interval.upper)||input.interval.lower>input.interval.upper)returninvalid("A positive diffusion estimate and ordered interval are required.");// Live-term identifiers for show-the-code: diffusionCoefficient, avogadroNumberEstimate,// particleRadius, viscosity, temperature, molarGasConstant. Never a modern exact k_B here.consttemperature=input.T,viscosity=input.eta,particleRadius=input.a,molarGasConstant=g.data.R,diffusionCoefficient=input.dHat;constC=(molarGasConstant*temperature)/(6*Math.PI*viscosity*particleRadius);constavogadroNumberEstimate=C/diffusionCoefficient;constestimate=avogadroNumberEstimate;constlower=C/input.interval.upper,upper=C/input.interval.lower;constmodern=g.data.semanticKind==="consistency-check";constavogadro=modern?constantValue(set,"avogadroConstant").value:1;constconsistencyRatio=modern?estimate/avogadro:null;constestimatedBoltzmannConstant=modern?(6*Math.PI*input.eta*input.a*input.dHat)/input.T:null;constconsistencyRatioInterval=modern?Object.freeze({...input.interval,lower:lower/avogadro,upper:upper/avogadro,}):null;constestimatedBoltzmannConstantInterval=modern?Object.freeze({...input.interval,lower:(6*Math.PI*input.eta*input.a*input.interval.lower)/input.T,upper:(6*Math.PI*input.eta*input.a*input.interval.upper)/input.T,}):null;constmodernMetrics=modern&&consistencyRatio!==null&&estimatedBoltzmannConstant!==null&&consistencyRatioInterval!==null&&estimatedBoltzmannConstantInterval!==null?[consistencyRatio,estimatedBoltzmannConstant,consistencyRatioInterval.lower,consistencyRatioInterval.upper,estimatedBoltzmannConstantInterval.lower,estimatedBoltzmannConstantInterval.upper,]:[];if(![estimate,lower,upper,...modernMetrics].every(positive))returninvalid("The inverse result cannot be represented at this numerical scale.");return{kind:"accepted",data:Object.freeze({estimate,interval:Object.freeze({...input.interval,lower,upper}),constantSetId:set.id,semanticKind:g.data.semanticKind,consistencyRatio,estimatedBoltzmannConstant,consistencyRatioInterval,estimatedBoltzmannConstantInterval,}),};}
The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
combinedMolecularNumberInterval · src/physics/reference/inference.ts · this site’s source, as built · sha256:3335f9e6c633a8147da58f7335e269c0996e3fa0b9b6b6cf2b59aab0f5ec0321
This function computes the listed outputs when it runs.
In words
It takes a declared interval for any of the three conditions, pairs the endpoints in the direction that widens the answer, and returns the result with its coverage reduced by the sum of the input error rates. The pairing is where the care is: the lower molecular number uses the lowest temperature against the highest viscosity, radius and diffusivity, and the upper one the reverse, because N rises with T and falls with each of the other three.
Implementation
/** Conservative union-bound procedure. Marginal input intervals do NOT need
* statistical independence. Calibration is held exact in this BM-07 slice. */exportfunctioncombinedMolecularNumberInterval(input:Conditions&{estimate:Estimate;alphaD:number;inputs:Partial<Record<"T"|"eta"|"a",DeclaredInterval>>;synthetic:boolean;},set:ConstantSet,):Assessment<StatisticalInterval>{constconditions=checkConditions(input);if(conditions.kind!=="accepted")returnconditions;constg=gas(set,input.synthetic);if(g.kind!=="accepted")returng;letalpha=input.alphaD;constranges:Record<"T"|"eta"|"a",readonly[number,number]>={T:[input.T,input.T],eta:[input.eta,input.eta],a:[input.a,input.a],};if(Object.keys(input.inputs).some((k)=>!["T","eta","a"].includes(k)))returninvalid("Only temperature, viscosity and radius intervals are admitted by this procedure.",);for(constkof["T","eta","a"]asconst){constv=input.inputs[k];if(v===undefined)continue;if(!v||!Number.isFinite(v.coverage)||v.coverage<=0||v.coverage>1)returnnoValue("not-applicable",`The ${k} input interval has no valid declared coverage.`);if(!positive(v.lower)||!positive(v.upper)||v.lower>input[k]||v.upper<input[k])returninvalid(`The positive ${k} interval must contain its stated point input.`);alpha+=1-v.coverage;ranges[k]=[v.lower,v.upper];}if(!positive(input.alphaD)||input.alphaD>=1||!positive(1-alpha))returnnoValue("not-applicable","The declared input error rates leave no positive simultaneous coverage guarantee.",);constinterval=estimatorInterval(input.estimate,input.alphaD);if(interval.kind!=="accepted")returninterval;if(interval.data.lower===0)returnnoValue("underdetermined","A positive diffusion scale is required before inversion.");constlower=(g.data.R*ranges.T[0])/(6*Math.PI*ranges.eta[1]*ranges.a[1]*interval.data.upper);constupper=(g.data.R*ranges.T[1])/(6*Math.PI*ranges.eta[0]*ranges.a[0]*interval.data.lower);if(![lower,upper].every(positive))returninvalid("The combined interval cannot be represented.");return{kind:"accepted",data:Object.freeze({...interval.data,lower,upper,coverage:1-alpha,coverageKind:"conservative",estimatorId:`${input.estimate.estimatorId}; Bonferroni with declared input intervals`,}),};}
The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
identifiabilityFamily · src/physics/reference/inference.ts · this site’s source, as built · sha256:4d25196f7d987b1e967488ce3f9fcb932a4041addbefd7b5ced130539a9c2829
This function computes the listed outputs when it runs.
In words
A diffusivity fixes R T / (6 pi eta D), and that is a product of a radius and a molecular number. Give the radius and the number follows; give the number and the radius follows; measure the displacements alone and neither is determined. The function returns 41 radii spaced evenly in the logarithm across the range asked for, with the molecular number that goes with each. Over two decades of radius the numbers run over two decades too, from 3.058 times 10^24 down to 3.058 times 10^22.
Implementation
exportfunctionidentifiabilityFamily(input:{D:number;T:number;eta:number;radiusRange:readonly[number,number];synthetic:boolean;},set:ConstantSet,):Assessment<Readonly<{product:number;radii:Float64Array;numbers:Float64Array;semanticKind:NumberMeaning;constantSetId:string;}>>{constg=gas(set,input.synthetic);if(g.kind!=="accepted")returng;if(input.D===0)returnnoValue("underdetermined","A positive diffusion scale is needed to draw the compatible family.",);if(![input.D,input.T,input.eta,...input.radiusRange].every(positive)||input.radiusRange[0]>=input.radiusRange[1])returninvalid("Use positive conditions and an increasing radius range.");constproduct=(g.data.R*input.T)/(6*Math.PI*input.eta*input.D);constradii=Float64Array.from({length:41},(_,i)=>Math.exp(Math.log(input.radiusRange[0])*(1-i/40)+(Math.log(input.radiusRange[1])*i)/40,),);constnumbers=Float64Array.from(radii,(a)=>product/a);if(![product,...numbers].every(positive))returninvalid("The compatible family cannot be represented.");return{kind:"accepted",data:{product,radii,numbers,semanticKind:g.data.semanticKind,constantSetId:set.id},};}
Each placement has separate settings and worker ownership. The same seed initially reproduces the same synthetic data; choose a different seed for an independent trial.
Open the inverse argument
The same positions, different questions
For independent, equally spaced Gaussian increments in d coordinates with known zero drift, average their squared lengths and divide by twice the number of coordinates and the time interval. The result estimates the diffusion coefficient.
D=2dMΔt1i=1∑M∥Δri∥2,q=dM
When drift is fitted from the same observations, subtract the mean increment in each coordinate. The unbiased spread estimate uses M − 1 in place of M and q = d(M − 1). The centered maximum-likelihood estimate instead divides by M and must be rescaled before applying the same interval procedure.
An interval for a procedure
Under this ideal model, q times the unbiased diffusion estimate divided by the true diffusivity follows a chi-square distribution. Its quantiles provide the following conditional interval. More independent observations generally tighten uncertainty; changing the assumptions changes what the interval means.
[χq,1−α/22qDunbiased,χq,α/22qDunbiased]
At 95% coverage, the procedure covers the fixed true value in 95% of repetitions under its assumptions. That is not a 95% posterior probability for one parameter in one realized interval. The repeated-trial plots retain the misses as well as the successes.
With temperature and viscosity given, displacements identify the product Na. They cannot separately identify N and the radius a. Declaring a radius permits a conditional inversion, but deriving that radius from the same data using an assumed N would merely return the assumption.
Inversion also reverses the interval’s endpoints. It does not preserve unbiasedness: for the known-zero-drift estimate, the mean recovered-to-true number ratio is q/(q − 2) when q is greater than two. A point estimate can be finite even when that repeated-estimate mean does not exist.
Do not hide input uncertainty
The conditional interval treats the stated inputs as exact. The combined procedure uses the declared temperature, viscosity and radius intervals and adds their error probabilities with the diffusion interval’s error probability. This union-bound guarantee is conservative and does not require their statistical independence. It remains conditional on exact calibration, timing and the chosen gas constant in this preview.
Worked interval (readable without JavaScript)
d = 2, M = 50, q = 100, D̂ = 0.42944 μm²/s, 95% chi-square interval. Not a molecular count.
Quantity
Value
Diffusion interval
[0.331457, 0.578589] μm²/s
Modern-SI inversion (consistency check)
N̂ = 6.02213 × 10²³ mol⁻¹
Inverse-bias factor at q = 100
q/(q − 2) = 1.020408; an unbiased D̂ is not unbiased after inversion
A synthetic recovery is not a new molecular count
This exercise draws a hidden number and generates data from it using a chosen gas constant. Recovering that number tests inference under the model; it does not measure a real suspension. With modern SI constants, the Avogadro constant is defined, so an observational inversion would be a consistency check rather than an independent determination. Historical observations and independent gas-constant measurements are not supplied here. This instrument uses ideal positions; the separate camera laboratory adds an explicitly later measurement model.
The laboratory recovered the molecular number, so the count has been confirmed here.
The displacements were generated from a number the laboratory already had. Recovering it checks the inference, not the world. § 5 asks for a measurement, and the paper closes by leaving that to somebody else.