Undergraduate Research Assistant
Oden Institute / GeoElements Lab
Learning physical parameters from video.
- Role
- Undergraduate Research Assistant
- When
- Oct 2025 – Mar 2026
At the GeoElements Lab, I built a differentiable physics engine in Python and JAX. It used observed motion to estimate physical parameters such as friction.
An illustrative example
Watch the motion. Estimate the friction.
A sliding object slows down. Adjust the friction in a simple model until its path matches the observations. JAX calculates how the error changes with friction, so each update moves the estimate closer.

# Synthetic observations; known initial speed
observed = position(0.25)
def loss(mu):
return jnp.mean((position(mu) - observed)**2)
mu = jnp.array(0.08)
for _ in range(100):
mu = mu - 0.1 * jax.grad(loss)(mu)This small example assumes known initial speed and motion before the object stops. Real video fitting also has measurement noise and more complex physics.
Download the complete Python example ↓From video to simulation
I built a physics engine whose parameters could be adjusted using gradients. Video data provided the observations used to recover values such as friction coefficients.
Fitting the model
I built the optimization and training pipeline to compare simulated motion with real-world observations and update the parameters.
Checking the results
I added automated checks for numerical instability and silent failures, so a completed run could be distinguished from a valid result.
The University of Texas at Austin. Hook ’em.
Tools & methods
Python · JAX · Differentiable simulation · Gradient optimization