Note
Go to the end to download the full example code.
Fit an isolated-sphere scattering measurement#
Recover a sphere diameter from one dimensionless scattering-efficiency measurement. This uses the isolated-particle Mie model. It does not represent multiple scattering, near-field coupling, or positional correlations in dense particle systems.
The fitted diameter is approximately 180 nanometers within the stated bounds. The prediction is a scalar dimensionless efficiency. One noiseless channel with a fixed refractive index demonstrates parameter recovery; it does not establish uniqueness over a wider diameter range.
iteration 1 | objective 0.035303537 | step 0.1
iteration 2 | objective 0.0083962553 | step 0.1
iteration 3 | objective 0.00081984712 | step 0.1
iteration 4 | objective 0.00081984712 | step 0.05
iteration 5 | objective 0.00081984712 | step 0.025
iteration 6 | objective 1.2293524e-05 | step 0.025
iteration 7 | objective 1.2293524e-05 | step 0.0125
iteration 8 | objective 1.2293524e-05 | step 0.00625
iteration 9 | objective 1.2293524e-05 | step 0.00313
iteration 10 | objective 1.9310194e-07 | step 0.00313
iteration 11 | objective 1.9310194e-07 | step 0.00156
iteration 12 | objective 1.9310194e-07 | step 0.000781
iteration 13 | objective 1.9310194e-07 | step 0.000391
iteration 14 | objective 3.0152357e-09 | step 0.000391
iteration 15 | objective 3.0152357e-09 | step 0.000195
iteration 16 | objective 3.0152357e-09 | step 9.77e-05
iteration 17 | objective 3.0152357e-09 | step 4.88e-05
iteration 18 | objective 4.711693e-11 | step 4.88e-05
iteration 19 | objective 4.711693e-11 | step 2.44e-05
iteration 20 | objective 4.711693e-11 | step 1.22e-05
iteration 21 | objective 4.711693e-11 | step 6.1e-06
iteration 22 | objective 7.3619446e-13 | step 6.1e-06
iteration 23 | objective 7.3619446e-13 | step 3.05e-06
iteration 24 | objective 7.3619446e-13 | step 1.53e-06
iteration 25 | objective 7.3619446e-13 | step 7.63e-07
converged after 25 iterations | objective 7.3619446e-13
converged (52 model evaluations)
objective = 0.000000
from PyMieSim import (
Measure,
FitParameter, MeasuredData, PlaneWave, PolarizationState, Simulation, Sphere,
fit_parameters, ureg,
)
source = PlaneWave(
wavelength=532 * ureg.nanometer,
polarization=PolarizationState(angle=0 * ureg.degree),
amplitude=1 * ureg.volt / ureg.meter,
)
target_diameter = 180 * ureg.nanometer
target = Simulation(
scatterer=Sphere(diameter=target_diameter, material=1.59, medium=1.0),
source=source,
).get(Measure.QSCA)
def model(parameters):
sphere = Sphere(diameter=parameters["diameter"], material=1.59, medium=1.0)
return Simulation(scatterer=sphere, source=source).get(Measure.QSCA)
result = fit_parameters(
model=model,
observation=MeasuredData(values=target),
parameters=[
FitParameter(
name="diameter",
initial=130 * ureg.nanometer,
bounds=(80 * ureg.nanometer, 260 * ureg.nanometer),
)
],
max_iterations=250,
show_progress=True,
)
print(result.summary())
Total running time of the script: (0 minutes 0.013 seconds)