experiments/laser_and_mirrors.py

Tue, 06 Oct 2026 00:47:42 -0500

author
Tuomo Valkonen <tuomov@iki.fi>
date
Tue, 06 Oct 2026 00:47:42 -0500
changeset 15
7c63af7c9acd
parent 12
a0d61ac3719e
permissions
-rw-r--r--

README updates

#
# Laser and mirrors convection-diffusion experiment with known diffusivity and convectivity
#
import laser_and_mirrors_aux
import numpy as np
from laser_and_mirrors_aux import generic_setup, reg_params
from measures import DiscreteMeasure_2_f64
from pointsource_pde import Problem, RegTerm
from pointsource_pde.compose import (
    ComposeFnWithOperator,
    InjectSecond,
)

# Give name to the problem
name = "laser_and_mirrors"

# Override algorithm settings
algorithm_overrides = laser_and_mirrors_aux.algorithm_overrides


# Setup the problem
def setup(
    prefix,
    alpha=reg_params["alpha"],
    c_noise=reg_params["c_noise"],
    k_noise=reg_params["k_noise"],
    noise=reg_params["noise"],
    seed=reg_params["seed"],
    sim_oversample=reg_params["sim_oversample"],
    sim_oversample_time=reg_params["sim_oversample_time"],
):
    rng = np.random.default_rng(seed=seed)

    dat, auxtrue, aux0, _μ_bound, μ_true, plot_factory, pde = generic_setup(
        prefix,
        rng=rng,
        c_noise=c_noise,
        k_noise=k_noise,
        noise=noise,
        sim_oversample=sim_oversample,
        sim_oversample_time=sim_oversample_time,
    )

    reg = RegTerm.NonnegRadon(alpha)

    μ0 = DiscreteMeasure_2_f64([])

    dat_simple = ComposeFnWithOperator(dat, InjectSecond(auxtrue))
    dat_simple.curvature_bound_components = lambda: (None, None, None)
    dat_simple.override_lipschitz = 1.0

    print("Initial data term value:", dat_simple.apply(μ0))
    print("Data term value at true μ:", dat_simple.apply(μ_true))

    return Problem(
        dat_simple,
        reg,
        None,
        None,
        μ0,
        plot_factory=plot_factory,
        domain=pde.domain_dims,
    )

mercurial