gadmaj.org/portfolio

Gad Major

*currently work in progress

gadmaj.org · email · github · linkedin

contents

about

Me and my friend Joshua Sohn in Tuolumne Meadows starting our Yosemite backpacking trip.
Me (right) and my friend Joshua Sohn (left) in Tuolumne Meadows starting our Yosemite backpacking trip June 25'

I am a mathematics student at New York University building software for robotics, numerical methods, and Unix-based engineering workflows. This page is structured like a short technical document so I can show the work clearly and attach figures, screenshots, and diagrams as the projects are documented.

I am currently redesigning this page, so the content is a work in progress. I will be adding more projects, writing more about the work, and improving the formatting over the next few weeks.

projects

Newton's method on \(C^2\) surface functions

Stack. MATLAB

This started as a question on my numerical analysis homework, but then it quickly became a tangent project for me while I further explored MATLAB's capiablities. The general setup is an open set \(U \subseteq \mathbb{R}^2\), a twice differentiable function \(f : U \to \mathbb{R}\), and an initial point \(x_0 \in U\). From there we can build the orbit \(\{x_k\}_{k \in \mathbb{N}}\) and graph how the iterates move across the surface.

for \(f \in C^2(U)\), the Newton method applied to this function at step \(k\) is \[ x_{k+1} = x_k - \bigl(\nabla^2 f(x_k)\bigr)^{-1}\nabla f(x_k), \] whenever \(\nabla^2 f(x_k)\) is invertible. in the code, the iterate set is the sequence \(\{x_k\}_{k \in \mathbb{N}} \subseteq U\).
for a general \(f : U \to \mathbb{R}\) with \(U \subseteq \mathbb{R}^2\), \[ \nabla f(x,y) = \begin{bmatrix} \frac{\partial f}{\partial x}(x,y) \\ \frac{\partial f}{\partial y}(x,y) \end{bmatrix}, \qquad \nabla^2 f(x,y) = \begin{bmatrix} \frac{\partial^2 f}{\partial x^2}(x,y) & \frac{\partial^2 f}{\partial x \partial y}(x,y) \\ \frac{\partial^2 f}{\partial y \partial x}(x,y) & \frac{\partial^2 f}{\partial y^2}(x,y) \end{bmatrix}. \]

Now if we have a function that is twice differentiable, and we can evaluate \(f\), \(\nabla f\), and \(\nabla^2 f\), then we can generate the Newton path, compare it against another update rule, and render the trajectory directly on the graph of the function. Rosenbrock is just the best test case because the valley geometry makes the behavior easy to see.

  • Derived \(\nabla f\) and \(\nabla^2 f\) for the rosenbrock example and implemented both directly in MATLAB.
  • Treated the iterates as a sequence \(\{x_k\}_{k \in \mathbb{N}}\) and recorded the full orbit, not just the endpoint.
  • Implemented the Newton step with a linear solve instead of explicitly forming \(\bigl(\nabla^2 f(x_k)\bigr)^{-1}\).
  • Compared second-order Newton updates with fixed-step gradient descent on the same function and exported both trajectories as 3d models.
  • Extended the plotting/export code so large Newton excursions still enlarge the plotted domain instead of clipping off the path.

for the rosenbrock test surface \[ f(x,y) = (1-x)^2 + 100(y-x^2)^2, \] the derivatives become \[ \nabla f(x,y) = \begin{bmatrix} 2(x-1) - 400x(y-x^2) \\ 200(y-x^2) \end{bmatrix}, \qquad \nabla^2 f(x,y) = \begin{bmatrix} 2 - 400y + 1200x^2 & -400x \\ -400x & 200 \end{bmatrix}. \]

If \(x^\ast\) is a nondegenerate critical point of \(f\), meaning \(\nabla f(x^\ast)=0\) and \(\det(\nabla^2 f(x^\ast)) \neq 0\), then Newton's method is locally a second-order method near \(x^\ast\). that is the mathematical reason it can look so aggressive and still converge very quickly once it gets into the right neighborhood.
Method Initial guess Observed behavior
Newton \(x_0 = (-1.9, 2.2)\) converged to \((1,1)\) in 5 steps, but only after a big excursion through \((0.94056, -7.126)\).
Newton \(x_0 = (0.5, 1.8)\) converged to \((1,1)\) in 4 steps with a much shorter path.
gradient descent
\(\eta = 10^{-3}\)
\(x_0 = (0.5, 1.8)\) did not converge within 98 steps and stalled near \((1.1343, 1.2872)\).
gradient descent
\(\eta = 10^{-3}\)
\(x_0 = (-1.9, 2.2)\) did not converge within 98 steps and stalled near \((-1.3976, 1.9608)\).

The main thing I liked here is that the surfaces functions help visualize the behavior of the algorithms in a way that really match the theory. Newton's method is not “smooth” in the visual sense; it can jump hard because it is reading curvature information from the Hessian. gradient descent is easier to follow step by step, but with \(\eta = 10^{-3}\) it stayed slow and local on the same surface. this made the project feel less like an isolated homework problem and more like a small numerical lab for comparing update rules on the same set \(U \subseteq \mathbb{R}^2\).

Newton method from x_0 = (-1.9, 2.2), including the large off-screen excursion before convergence.
Newton method from x_0 = (0.5, 1.8), showing the much shorter path to the minimizer.
Gradient descent from x_0 = (-1.9, 2.2) showing slow progress along the valley.
Gradient descent from x_0 = (0.5, 1.8) with the same step size, illustrating the non-converged trajectory from the homework.

NYU Robotics Design Team / NASA Lunabotics

Stack. ROS 2, Python, C++, Linux, Docker, Gazebo, OpenCV

My RDT work breaks into two closely related subprojects: rover-side autonomy/localization and operator-side control/simulation. I treat them separately because they exercise different engineering muscles, but they live in the same systems context.

Autonomy and Localization

This is the strongest engineering work I have right now. The project lives inside a team rover stack and includes autonomy, localization, perception, launchability, Linux systems work, and the integration work that makes the whole thing usable instead of just impressive on paper.

  • Worked in a multi-package ROS 2 workspace spanning autonomy, localization, command handling, and interfaces.
  • Contributed to camera and AprilTag-related localization workflows.
  • Built a headless Ubuntu 24.04 image for the Jetson Orin Nano and tuned the footprint to cut bloat, latency, and swap overhead.
  • Integrated a Docker-based ROS 2 wrapper so rover-side software was more controlled and reproducible.
  • Helped tighten rover-to-ground-control traffic and packet flow.

Ground Control, Manual Command Bridging, and Gazebo Simulation

This is the side of the work that makes the rover easier to test and easier to drive. It is less glamorous than autonomy, but it is closer to what real systems work feels like: command paths, simulation setup, launch files, and debugging how pieces talk to each other.

Bronco Space / Project BILL-EE

Stack. ROS 2, Python, C++, Linux, Docker

This project let me work closer to the controls and robotics-mechanics side of things. It is another example of how I like work where math actually has to become behavior in a physical system.

  • Implemented inverse-kinematic systems for a robotic arm and used them to improve efficiency.
  • Worked with proportional-integral-derivative control ideas inside a ROS 2 workflow.
Project BILL-EE, a robotic arm built by Bronco Space for satellite servicing and debris removal.
Photo of me and Sam Ly (Lead Software Eng. '24) transporting the rover to our testing site

teaching & mentoring

*currently work in progress

Crescenta Valley High School Tech Team

Dates. Aug 2021 - Jun 2024

National Technical Honor Society

Dates. Aug 2021 - Dec 2024

FIRST Lego League Mentoring

Dates. Aug 2022 - Dec 2023

Castilleja School

Dates. May 2025 - Sep 2025

M.S. 131, Sun Yat Sen Middle School

Dates. Feb 2026 - Current

gadmaj.org