← All work

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.

Plot of position over time: an initial friction guess overshoots synthetic observations, while the recovered coefficient of 0.25 matches them.
Illustrative reconstruction using synthetic, noise-free data. Created for this portfolio; not original lab code, video, or research results.
# 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