HarmonicBalance.jl is a Julia package for solving periodic differential equations using the method of harmonic balance.
To install HarmonicBalance.jl, you can use the github repo or the Julia package manager,
using Pkg
Pkg.add("HarmonicBalance")
For a detailed description of the package and examples, see the documentation.
This repo contains a collection of example notebooks.
Let's find the steady states of a driven Duffing oscillator with nonlinear damping, its equation of motion is:
using HarmonicBalance
@variables α ω ω0 F η t x(t) # declare constant variables and a function x(t)
diff_eq = DifferentialEquation(d(x,t,2) + ω0^2*x + α*x^3 + η*d(x,t)*x^2 ~ F*cos(ω*t), x)
add_harmonic!(diff_eq, x, ω) # specify the ansatz x = u(T) cos(ωt) + v(T) sin(ωt)
# implement ansatz to get harmonic equations
harmonic_eq = get_harmonic_equations(diff_eq)
# solve for a range of ω
result = get_steady_states(harmonic_eq, ω => range(0.9, 1.2, 100), (α => 1., ω0 => 1.0, F => 0.01, η => 0.1))
A steady state result for 100 parameter points
Solution branches: 3
of which real: 3
of which stable: 2
Classes: stable, physical, Hopf, binary_labels
plot(result, "sqrt(u1^2 + v1^2)")
If you use HarmonicBalance.jl in your project, we kindly ask you to cite this paper, namely:
HarmonicBalance.jl: A Julia suite for nonlinear dynamics using harmonic balance Jan Košata, Javier del Pino, Toni L. Heugel, Oded Zilberberg SciPost Phys. Codebases 6 (2022)
- JosephsonCircuits.jl: Performs the frequency domain behaviour with a similar Harmonic Balance method for nonlinear circuits containing Josephson junctions, capacitors, inductors, mutual inductors, and resistors.
- Manlab: A similar package in Matlab also using continuation methods and using the Harmonic Balance method for periodic orbits.