Faster-Is-Slower Demo#

This notebook probes a faster-is-slower bottleneck proxy with repeated runs across multiple seeds. It uses a dedicated scenario asset with 30 agents, a 0.75 m doorway, and a 3 m corridor.

Reference: Garcimartin A. et al., Experimental Evidence of the “Faster Is Slower” Effect, 10.1016/j.trpro.2014.09.085.

import logging
from datetime import datetime

# Silence jupedsim-scenarios' INFO/DEBUG output. See the howto
# "How do I inspect a scenario?" for the full list of levels.
logging.getLogger("jupedsim_scenarios").setLevel(logging.WARNING)

print(f"Executed on {datetime.now().strftime('%d.%m.%Y, %H:%M')}")

import matplotlib.pyplot as plt
import numpy as np

from jupedsim_scenarios import load_scenario, run_sweep
Executed on 21.07.2026, 09:37

1. Scenario Setup#

We load a dedicated faster-is-slower proxy scenario from scenario_files/faster-is-slower, then vary only the desired speed \(v_0\) through the scenario API.

scenario = load_scenario("scenario_files/faster-is-slower")
scenario.set_agent_params(distribution_id=0, number=30, radius=0.15, desired_speed=1.2, distribution_mode="by_number")
scenario.seed = 42
scenario.max_simulation_time = 1000

#v0_values = np.array([0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4])
v0_values = np.array([0.8, 1.2, 1.6, 1.8])
seeds = [40, 41, 42, 43, 44]

print(scenario.summary())
print(f"Seeds: {seeds}")
Scenario: /home/runner/work/jupedsim-scenarios/jupedsim-scenarios/docs/source/notebooks/cookbook/scenario_files/faster-is-slower
  Model:         CollisionFreeSpeedModel
  Seed:          42
  Max time:      1000s
  Exits:         1
  Distributions: 1
  Stages:        0
  Zones:         0
  Journeys:      1
  Agents:        ~30
  Journey elems: 2
  Route:         1 distribution, 0 checkpoint, 1 exit
  Sequence:      jps-distributions_0 -> jps-exits_0
    jps-distributions_0: 30 agents
Seeds: [40, 41, 42, 43, 44]

2. Multi-Seed Sweep#

Each desired-speed value is simulated across several seeds. The next cell stores all evacuation times so we can plot a mean curve with a 95% confidence interval.

%%capture
# Sweep v0 × seed via jupedsim_scenarios.run_sweep — the library owns the
# cartesian product, per-trial scenario isolation, and result tabulation.
# (Previously this cell hand-rolled a nested loop with .copy()/.cleanup()
# bookkeeping; run_sweep handles all of that and runs trials in parallel.)
sweep = run_sweep(
    scenario,
    axes={"v0": v0_values.tolist()},
    apply={
        "v0": lambda s, v: s.set_agent_params(
            distribution_id=0, desired_speed=float(v)
        ),
    },
    seeds=seeds,
    workers=4,
)
df = sweep.to_dataframe()
sweep.cleanup()
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 0.8}
INFO - Using default parameters: v0=0.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 0.8}
INFO - Using default parameters: v0=0.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 0.8}
INFO - Using default parameters: v0=0.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 0.8}
INFO - Using default parameters: v0=0.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 0.8}
INFO - Using default parameters: v0=0.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 0.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.2}
INFO - Using default parameters: v0=1.2, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.2}
INFO - Using default parameters: v0=1.2, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.2}
INFO - Using default parameters: v0=1.2, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.2}
INFO - Using default parameters: v0=1.2, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.2}
INFO - Using default parameters: v0=1.2, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.2, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.6}
INFO - Using default parameters: v0=1.6, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.6}
INFO - Using default parameters: v0=1.6, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.6}
INFO - Using default parameters: v0=1.6, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.6}
INFO - Using default parameters: v0=1.6, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.6}
INFO - Using default parameters: v0=1.6, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.6, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.8}
INFO - Using default parameters: v0=1.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.8}
INFO - Using default parameters: v0=1.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.8}
INFO - Using default parameters: v0=1.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.8}
INFO - Using default parameters: v0=1.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources
INFO - Using fallback logic: No journeys defined
INFO - Processing with parameters: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'radius_distribution': 'constant', 'v0_distribution': 'constant', 'desired_speed': 1.8}
INFO - Using default parameters: v0=1.8, radius=0.15, n_agents=30
INFO - Distribution jps-distributions_0: {'number': 30, 'radius': 0.15, 'v0': 1.8, 'distribution_mode': 'by_number', 'percentage': None, 'use_flow_spawning': False, 'flow_start_time': 0, 'flow_end_time': 10, 'strict_spawning': False, 'use_premovement': False, 'premovement_distribution': 'gamma', 'premovement_param_a': None, 'premovement_param_b': None, 'premovement_seed': None, 'radius_distribution': 'constant', 'radius_std': None, 'v0_distribution': 'constant', 'v0_std': None}
INFO - Added 30 agents using fallback logic (immediate), prepared 0 flow sources

3. Mean Evacuation Curve With Confidence Interval#

The shaded band is a 95% confidence interval around the sample mean, computed from the seed-to-seed variation for each \(v_0\).

# Aggregate the sweep dataframe — one row per (v0, seed) trial.
agg = (
    df.groupby("v0")["evacuation_time"]
    .agg(["mean", "std", "count"])
    .reindex(v0_values)
)
means = agg["mean"].to_numpy()
stds = agg["std"].to_numpy()
cis = 1.96 * stds / np.sqrt(agg["count"].to_numpy())

plt.figure(figsize=(9, 5.5))
plt.plot(
    v0_values,
    means,
    marker="o",
    color="#C44E52",
    linewidth=2.5,
    markersize=8,
    label="Mean evacuation time",
)
plt.fill_between(
    v0_values,
    means - cis,
    means + cis,
    color="#C44E52",
    alpha=0.18,
    label="95% confidence interval",
)

for x, y in zip(v0_values, means, strict=False):
    plt.text(x, y + 1.6, f"{y:.1f}", ha="center", color="#8B2F34", fontsize=10)

plt.xlabel("Desired speed $v_0$ [m/s]", fontsize=12)
plt.ylabel("Evacuation time [s]", fontsize=12)
plt.title("Faster-Is-Slower: Mean Evacuation Time vs. Desired Speed", fontsize=14, pad=12)
plt.grid(axis="y", linestyle="--", alpha=0.4)
ax = plt.gca()
ax.spines["top"].set_visible(False)
ax.spines["right"].set_visible(False)
plt.legend(frameon=False)
plt.tight_layout()
plt.show()

for v0 in v0_values:
    vals = df.loc[df["v0"] == v0, "evacuation_time"].to_numpy()
    print(f"v0={v0:.1f} m/s -> mean={vals.mean():.2f}s, std={vals.std(ddof=1):.2f}s, samples={np.round(vals, 2)}")
../../_images/dd5ba684009d13c6a2e50087be4b64c7f65e648322daffc4ab837736bd11123c.png
v0=0.8 m/s -> mean=49.66s, std=2.51s, samples=[53.67 49.06 49.45 49.43 46.7 ]
v0=1.2 m/s -> mean=39.71s, std=1.15s, samples=[39.06 39.31 40.48 38.44 41.28]
v0=1.6 m/s -> mean=227.73s, std=431.71s, samples=[  32.25 1000.     37.08   33.67   35.67]
v0=1.8 m/s -> mean=33.14s, std=0.67s, samples=[34.18 33.35 32.99 32.43 32.73]