Inline 4 Engines: Balance and Vibrations
TL;DR
Getting right the slider-crank mechanism (2D) via MBSD to later form a 3D ICE I4 Vibration Simulation
Intro
This channel has awsome videos explaining engine balance
But i wanted to make my own.
Enough Theory for Balance
In other words: whats the minimum physics context for an LLM to do this right?
+++ some references below
Complete mathematical equations for the slider-crank mechanism used in engine balance simulation.
- Coordinate System & Geometry
1.1 Coordinate System Definition
2D Cartesian system:
- Origin: At crank pivot (crankshaft axis)
- X-axis: Horizontal, pointing toward the slider (piston) at $\theta = 0°$
- Y-axis: Vertical, perpendicular to X (right-hand rule)
- Rotation: Crank rotates counterclockwise (positive $\theta$ direction)
Units (all equations use SI base + mm for length):
- Length: mm
- Mass: kg
- Force: N (= kg⋅mm/s²)
- Torque: N⋅mm
- Angular velocity: rad/s
- Time: s
1.2 Mechanism Definition
Parameters:
- $r$ = crank radius (L_crank) [mm]
- $L$ = connecting rod length (L_rod) [mm]
- $\theta$ = crank angle from X-axis [rad]
- $\varphi$ = connecting rod angle from X-axis [rad]
- $x$ = slider position along X-axis [mm]
Constraint equations:
$$r \cos(\theta) + L \cos(\varphi) = x \quad \text{…(1.1)}$$
$$r \sin(\theta) + L \sin(\varphi) = 0 \quad \text{…(1.2)}$$
- Kinematics
2.1 Slider Position
From constraint (1.2): $\sin(\varphi) = -\frac{r \sin(\theta)}{L}$
Therefore: $\cos(\varphi) = \sqrt{1 - \sin^2(\varphi)} = \frac{\sqrt{L^2 - r^2 \sin^2(\theta)}}{L}$
Slider position:
$$x(\theta) = r \cos(\theta) + \sqrt{L^2 - r^2 \sin^2(\theta)}$$
Standard form with $\lambda = r/L$:
$$x(\theta) = r\left[\cos(\theta) + \sqrt{1 - \lambda^2 \sin^2(\theta)}\right]$$
Physical range:
- Minimum: $x_{\min} = L - r$ (when $\theta = \pi$)
- Maximum: $x_{\max} = L + r$ (when $\theta = 0$)
- Stroke: $S = x_{\max} - x_{\min} = 2r$
2.2 Slider Velocity
Using the chain rule: $v_x = \frac{dx}{dt} = \frac{dx}{d\theta} \cdot \omega$
Slider velocity:
$$v_x(\theta) = \omega r \sin(\theta) \frac{\sqrt{L^2 - r^2 \sin^2(\theta)} + r \cos(\theta)}{\sqrt{L^2 - r^2 \sin^2(\theta)}}$$
Compact form:
$$v_x = \frac{r \omega \sin(\theta)}{[1 - (r/L)^2 \sin^2(\theta)]^{1/2}} \times \left[1 + \frac{(r/L) \cos(\theta)}{\sqrt{1 - (r/L)^2 \sin^2(\theta)}}\right]$$
2.3 Slider Acceleration
Acceleration formula:
$$a_x(\theta) = r \omega^2 \left[\cos(\theta) + \frac{(r/L) \cos(2\theta)}{\sqrt{1 - (r/L)^2 \sin^2(\theta)}}\right]$$
Alternative expanded form:
$$a_x = r \omega^2 \cos(\theta) + \frac{r^2 \omega^2 \cos(2\theta)}{\sqrt{L^2 - r^2 \sin^2(\theta)}}$$
Physical interpretation:
- First term: primary acceleration (2× fundamental frequency)
- Second term: secondary acceleration component (4× fundamental frequency)
2.4 Connecting Rod Angle
From constraint (1.2):
$$\varphi(\theta) = -\arcsin\left(\lambda \sin(\theta)\right) \quad \text{where} \quad \lambda = \frac{r}{L}$$
2.5 Rod Angular Velocity
$$\omega_{\text{rod}}(\theta) = -\frac{\omega r \cos(\theta)}{\sqrt{L^2 - r^2 \sin^2(\theta)}} = -\frac{\omega r \cos(\theta)}{L \cos(\varphi)}$$
2.6 Rod Angular Acceleration
$$\alpha_{\text{rod}} = \frac{d\omega_{\text{rod}}}{dt} = \frac{d^2\varphi}{dt^2}$$
- Dynamics & Forces
3.1 Assumptions
- Rigid bodies: No deformation; all masses are point masses or have defined inertias
- No friction: Ideal pins/bearings
- Constant angular velocity: Crankshaft rotates at constant $\omega$
- Massless constraints: Slider pin and crank pin have negligible mass
- 2D planar motion: All motion in X–Y plane; no Z-axis components
- No combustion forces: Initial phase uses external motor to drive crank
3.2 Component Masses & Inertias
Crank:
- Mass: $m_{\text{crank}}$ [kg]
- Moment of inertia about pivot: $I_{\text{crank}}$ [kg⋅mm²]
- Center of mass location: $R_{\text{cg,crank}}$ [mm]
Connecting Rod:
- Mass: $m_{\text{rod}}$ [kg]
- Length: $L$ [mm]
- Moment of inertia about center of mass: $I_{\text{rod,cm}}$ [kg⋅mm²]
Slider (piston):
- Mass: $m_{\text{slider}}$ [kg]
3.3 Inertial Forces on Slider
$$F_{\text{inertia}} = m_{\text{slider}} \cdot a_x(\theta) = m_{\text{slider}} \cdot r \omega^2 \left[\cos(\theta) + \frac{(r/L) \cos(2\theta)}{\sqrt{1 - (r/L)^2 \sin^2(\theta)}}\right]$$
3.4 Force in Connecting Rod
Rod internal force (for massless rod):
$$F_{\text{rod,axial}} = \frac{m_{\text{slider}} \cdot a_x}{\cos(\varphi)}$$
3.5 Crank Pin Force
Components:
$$F_{\text{rod,x}} = F_{\text{rod}} \cos(\varphi)$$
$$F_{\text{rod,y}} = F_{\text{rod}} \sin(\varphi)$$
Magnitude:
$$|F_{\text{rod}}| = \sqrt{F_{\text{rod,x}}^2 + F_{\text{rod,y}}^2}$$
3.6 Torque on Crankshaft
Torque from slider inertial force:
$$\tau_{\text{slider}} = F_{\text{rod}} \cdot r \sin(\theta - \varphi) = \frac{m_{\text{slider}} a_x \cdot r \sin(\theta - \varphi)}{\cos(\varphi)}$$
Simplified (massless rod, constant $\omega$):
$$\tau(\theta) = m_{\text{slider}} r \omega^2 \left[\cos(\theta) + \frac{(r/L) \cos(2\theta)}{\sqrt{1 - (r/L)^2 \sin^2(\theta)}}\right] \sin(\theta - \varphi(\theta))$$
3.7 Ground Reaction Force on Slider
Force balance on slider:
$$m_{\text{slider}} a_x = F_{\text{rod}} \cos(\varphi) - F_{\text{ground,x}}$$
Components:
$$F_{\text{ground,x}} = F_{\text{rod}} \cos(\varphi) - m_{\text{slider}} a_x$$
$$F_{\text{ground,y}} = -F_{\text{rod}} \sin(\varphi)$$
Magnitude:
$$|F_{\text{ground}}| = \sqrt{F_{\text{ground,x}}^2 + F_{\text{ground,y}}^2}$$
- Reaction Forces at Bearings
4.1 Crank Bearing Force
The crank bearing must support:
- The reaction force from the rod
- The centrifugal force of the crank mass
- Weight of crank (if vertical support needed)
Acceleration of crank center-of-mass:
Position of crank CG: $x_{\text{cg}} = R_{\text{cg}} \cos(\theta)$, $y_{\text{cg}} = R_{\text{cg}} \sin(\theta)$
Acceleration: $$a_{\text{cg,x}} = -R_{\text{cg}} \omega^2 \cos(\theta)$$ $$a_{\text{cg,y}} = -R_{\text{cg}} \omega^2 \sin(\theta)$$
Bearing reaction force:
$$\vec{F}{\text{bearing}} = \vec{F}{\text{rod}} + m_{\text{crank}} \vec{a}_{\text{cg}}$$
$$F_{\text{bearing,x}} = F_{\text{rod,x}} - m_{\text{crank}} R_{\text{cg}} \omega^2 \cos(\theta)$$
$$F_{\text{bearing,y}} = F_{\text{rod,y}} - m_{\text{crank}} R_{\text{cg}} \omega^2 \sin(\theta)$$
4.2 Multi-Cylinder: Total Bearing Force
For an engine with multiple cylinders at angles $\theta_1, \theta_2, \ldots, \theta_N$:
$$F_{\text{total,x}}(\theta) = \sum_i \left[F_{\text{rod,i}} \cos(\varphi_i) - m_{\text{crank}} R_{\text{cg}} \omega^2 \cos(\theta_i)\right]$$
$$F_{\text{total,y}}(\theta) = \sum_i \left[F_{\text{rod,i}} \sin(\varphi_i) - m_{\text{crank}} R_{\text{cg}} \omega^2 \sin(\theta_i)\right]$$
Magnitude:
$$|F_{\text{bearing,total}}| = \sqrt{F_{\text{total,x}}^2 + F_{\text{total,y}}^2}$$
- Vibration Analysis
5.1 Harmonic Decomposition (FFT)
The bearing reaction force can be decomposed into harmonics:
$$F_{\text{bearing}}(t) = F_0 + \sum_{n=1}^{\infty} \left[F_n \cos(n \omega t + \phi_n)\right]$$
Harmonic amplitude extraction:
$$F_n = \frac{1}{\pi} \int_0^{2\pi} F_{\text{bearing}}(\theta) \cos(n \theta) , d\theta$$
- Primary imbalance (1st order): $n = 1$, frequency = $1 \times \text{RPM}$
- Secondary imbalance (2nd order): $n = 2$, frequency = $2 \times \text{RPM}$
- Tertiary imbalance (3rd order): $n = 3$, frequency = $3 \times \text{RPM}$
5.2 Frequency Response
For each harmonic, the vibration amplitude depends on resonance:
$$\text{Vibration amplitude} \propto \frac{F_n}{|k - n^2 \omega^2 m + j n \omega c|}$$
where:
- $k$ = stiffness [N/mm]
- $m$ = mass [kg]
- $c$ = damping [N·s/mm]
- $j$ = imaginary unit
- Special Cases & Simplifications
6.1 Infinite Rod Approximation ($L \to \infty$)
When rod length is much larger than crank ($L » r$), the rod angle $\varphi \approx 0$:
$$x(\theta) \approx r \cos(\theta) + L$$
$$v_x(\theta) \approx -r \omega \sin(\theta)$$
$$a_x(\theta) \approx -r \omega^2 \cos(\theta) \quad \text{(simple harmonic)}$$
6.2 Four-Stroke Cycle with Gas Pressure
If we include combustion/pressure forces:
$$F_{\text{gas}}(\theta) = p(\theta) \cdot A_{\text{piston}} \quad [\text{N}]$$
where $p(\theta)$ is the gas pressure curve and $A_{\text{piston}}$ is the piston area.
Total force on slider:
$$F_{\text{total}} = F_{\text{inertia}} + F_{\text{gas}} - F_{\text{ground}}$$
Wait…arent you gonna extend the MBSD 2D simulator already to 3D for this?
Nop, im not.
This is going to be equation based.
No point reference coordinates this time :)
Engine Balance
Balance…what is it?
Vibrations?
FFT?
Forces?
I just wanted to create my engine balance simulations as proof:
#git clone https://github.com/JAlcocerT/mbsd
cd ./mbsdYou might do this without a mbsd framework like the one ive built.
Just…make the magic of the model and equation happen.
You got x4 slider-cranks connected to a common axis
Yes, this one is based on remotion :)
So you can model it as one axis that receives variable forces (the reaction ones that makes the crank stay in position) over time as it rotates
cd ./mbsd/2D-Dynamics
make run-slider-crank-no-gravityOr you can start from the beginning.
Inline 4
After all of this modelling: how about visualizing?
For this post, i want to test how good the current LLMs are without much context:
#git init && git add . && git commit -m "Initial commit: Starting engine balance repo" && gh repo create engine-balance --private --source=. --remote=origin --push
git clone https://github.com/JAlcocerT/engine-balance
#claudeWill it be able to generate a proper physics engine
with an output data model that can be re-used for remotion animations?
oh and also…
being able to say in the future which of the engine configuration is best for the balance
with…proper why’s?
i want to create a way to simulate in python a slider-crank, being able to animate it and to have in any given point the position, speed, aceleration and forces (including the reaction forces between the bars).
The later goal will be to take few of this slider cranks and make simulation of engine balance at the axis for few configurations, like I4, I6, V8 etc
can we create a brd.md to define all of this?thats sounds good, with the export data we would be able to animate it later on with other frameworks like remotionJS, blender etc?- BRD.md: “What & Why” (requirements, architecture, scope)
- equations.md: “The Physics” (math model, coordinate system, all equations)
- dev-phases.md: “The Code” (concrete tasks, references, examples, testing)
before starting, can you define a Out of Scope section? Also, for starters we can make the tests with matplotlib, I will let you know later own which ultimamte presentation layer I want, as the output will go mostlikely to youtubeHere is where you noticed those P1 estimations of 2-3 weeks still.
When its…20-30 minutes already:
then create a dev-phases.md where you can reference from brd and equations.md what we are doing, the uv python environment is ready for youmake explore #from the p3.1With this we can understand the expected engine balance in a table:

And with this one, the force locus of the I4:
. .venv/bin/activate && pytest tests/test_balance.py::TestForceAnimation -v
It’s a 3D curve showing how the magnitude and direction of the total bearing force evolves from 0° to 360° of crank rotation.
I also made couple more tinkering with the p3.3
make decompose # Output: output/i4_harmonics/, output/i6_harmonics/
make rpm-sweep # Output: output/i4_rpm/, output/i6_rpm/What it is: 3D trajectory of bearing force over one crank cycle
The 3D space: X (Fx) × Y (Fy) × Z (crank angle), color-coded by progression
Engine comparisons:
- I4: Large tilted bowtie (secondary-heavy, needs balancer shafts)
- I6: Thin vertical line near origin (nearly perfect balance)
- I3/I5: Symmetric stars (excellent primary balance)
- V8: Moderate bowtie (good compromise)
- V12: Smallest locus (pinnacle of smoothness)
How to interpret: Shape = balance quality, size = imbalance magnitude, pattern = harmonic content
Why it matters: Makes abstract force numbers visceral — seeing I4’s force vector wildly swing vs I6’s barely moving is instant physics understanding
Generation methods: make explore, make animate-forces, or Python script
Physical explanation: Why I4 needs balancer shafts, why I6 is perfect despite having 6 cylinders
About Engine Balance
The best video I found about engine balance:
Then provide a summary and pros and cons of the balance of each engine type discussed
The video titled “ENGINE BALANCE: Inline 6 vs. V6 vs. VR6 vs. Flat / Boxer 6” compares the balance, packaging, strengths, and weaknesses of four common six-cylinder engine layouts: the inline-six, V6, VR6, and flat-six/boxer-six.
Each configuration represents a specific engineering trade-off between smoothness, size, and mechanical complexity.
- Inline-6 (I6)
The inline-six is widely regarded as the smoothest and simplest of the group.
- Characteristics: Excellent inherent balance and an even firing interval. Runs smoothly without needing heavy balancing aids.
- Design: Mechanically straightforward, typically using only one cylinder head.
- Drawbacks: Difficult to fit in tight engine bays (especially transverse layouts) due to its significant length.
- Pros: Simple design, excellent balance, smooth operation.
- Cons: Long overall length makes packaging difficult.
- V6
Developed largely to solve the packaging limitations of the inline-six.
- Characteristics: Splitting cylinders into two banks makes it much shorter and versatile for various engine bays.
- Design: More complex; typically requires two cylinder heads and duplicated components (cams, manifolds).
- Drawbacks: Lacks the natural balance of an I6; smoothness depends on bank angle (e.g., 60° vs 90°) and balancing shafts.
- Pros: Compact, easy to package, fits transverse layouts.
- Cons: Less inherently balanced, higher mechanical complexity.
- VR6
A narrow-angle hybrid design that blends I6 and V6 characteristics.
- Characteristics: A “staggered” six-cylinder that is narrower than a V6 and shorter than an I6.
- Design: Uses a single cylinder head despite the two banks, which simplifies the package compared to a traditional V.
- Drawbacks: A packaging compromise; involves uneven port geometry and more engineering complexity than a straight-six.
- Pros: Extremely compact, efficient packaging.
- Cons: Not as naturally balanced as an I6, complex internal geometry.
- Flat-6 / Boxer-6
A horizontally opposed layout known for high-performance applications.
- Characteristics: Exceptionally smooth with a very low center of gravity and a short, stiff crankshaft.
- Design: Pairs of pistons move in opposite directions, canceling out vibrations (in a true Boxer).
- Drawbacks: The engine is very wide, which can interfere with suspension components or frame rails.
- Pros: Excellent balance, low center of gravity, responsive performance.
- Cons: High manufacturing cost, wide layout, complex packaging.
| Layout | Primary Strength | Primary Weakness | Best For |
|---|---|---|---|
| Inline-6 | Perfect Balance | Total Length | RWD Luxury & Sport |
| V6 | Packaging | Complexity | FWD & Universal Use |
| VR6 | Compactness | Port Complexity | Small Engine Bays |
| Flat-6 | Low Center of Gravity | Total Width | High-Performance Sport |
Conclusion: Rather than there being one universally “best” design, each configuration is chosen based on what engineers value most for a specific vehicle platform.
Primary Balance
This is the obvious one.
The pistons are moving in between and stop at the top/bottom.
Secondary Balance
Blame it to the boogie Archimedes.
Some time ago I recorded this unexpected video in a restaurant:
Who said Remotion?
And the thing goes from this RemotionJS experience
if someone would like to take the script you have prepared to make a V8 engine video using the python scripts that are having perfectly defined the slider-cranks and the angles and so on, what should it know?
create a hand over for the next agent to take advantage of all our work at a summary-for-remotion.md#git clone https://github.com/JAlcocerT/engine-balance
#claude #/skills if someone would like to take the script you have prepared to make a V8 engine video using the python scripts that are having perfectly defined the slider-cranks and the angles and so on, what should it know?
create a hand over for the next agent to take advantage of all our work at a summary-for-remotion.md lets write these choices at a summary-remotion-choices.md
i want a 3D realistic engine model were we can see the pistons moving according to the data
generated by python. for now, lets create a single static video (i guess we can add
diferent remotion scripts later on). The data generation part is done in python, read the
summary-for-remotion and see the makefile to know how. Id like a modern polished UI.
1920x1080 and 30fps is fine. No forces with augmented reality for now.#npx create-video@latest
#npx skills add remotion-dev/skills
#npx skills list
cd ./engine-balance/remotion-v8-video
npm install
npm run devConclusions
When you are happy enough, render that composition:
npx remotion render V8CrankMechanism v8-test.mp4waste of tokens
.mp4:)
Or in other words: nah, AI is a joke
Someone told me that she sees the difference when I talk with passion
Versus when I talk for the money
If you want to convince her that there is no such gap:
FAQ
Cars for Track Days?
Some say that the BMW z4 e86 is underated.
You have ~2007 units for ~10k$ as shown here
Im well aware that some people do cool stuff on the tracks with their bmw (BMW e86).
Fast Fourier Transform?
The good old FFT…
References
Engine Balance Theory:
- Norton, R.L. “Design of Machinery” 5th ed., Chapter 14 (Engine Balance)
- Heywood, J.B. “Internal Combustion Engine Fundamentals”, Chapter 3 (Kinematics & Dynamics)
- SAE J670e “Engine Sound Quality”
FFT & Harmonic Analysis:
- Welch, P.D. “The use of fast Fourier transform for estimation of power spectra” (IEEE Trans. Audio Electroacoustics, 1967)
- NumPy FFT documentation: https://numpy.org/doc/stable/reference/fft.html
This Project:
- BRD.md § 4.3 — Balance Analysis Requirements
- equations.md § 3-4 — Kinematics & Dynamics Equations
- dev-phases.md § 2.2 — Phase 2.2 Specification
