Programming wave dispersion equation

44 visualizaciones (últimos 30 días)
GIULIA
GIULIA el 13 de Oct. de 2025 a las 10:43
Comentada: GIULIA el 16 de Oct. de 2025 a las 13:41
Hi everyone,
I am quite new to MATLAB and asking for some help to programme the wave dispersion equation.
ω^2= gktanh(kh)
where
𝑔 is gravity (9.81), ℎ is water depth, and 𝑘 is the wavenumber.
I would like to programme this function using an iterative process, and use it whenever I need to solve it for finding wavelength L, wave period T (2pi/omega)
Could someone please guide me in the process to create it and help further understand the mechanisms of iteration in MATLAB?
Thanks a lot!
  3 comentarios
GIULIA
GIULIA el 13 de Oct. de 2025 a las 11:01
Yes, solve the equation for k.
And then hopefully understand the process so that I can re-arrange to solve for L and T :)
Sam Chak
Sam Chak el 13 de Oct. de 2025 a las 11:57
If the wave number and the angular frequency ,
then
.
This is an implicit equation because the wavelength λ cannot be defined as a direct function of the other variables.
Try using the solve() command from the Symbolic Math Toolbox, as demonstrated here, before resorting to a numerical approach to solve the problem iteratively.

Iniciar sesión para comentar.

Respuesta aceptada

Torsten
Torsten el 13 de Oct. de 2025 a las 12:40
Editada: Torsten el 13 de Oct. de 2025 a las 12:43
Code taken from
% Parameters
T = 10;
h = 0.2;
g = 9.81;
tolerance = 1e-6;
% Initial guess for L
L0 = T^2/g;
% Fixed point iteration to compute L
Lsol = calculateWavelength(g, h, T, tolerance, L0);
% Plot curve
f = @(L) L - g * T^2 / (2 * pi) * tanh(2 * pi * h ./ L);
L = 1:0.1:20;
hold on
plot(L,f(L))
plot(Lsol,f(Lsol),'o')
hold off
grid on
function L = calculateWavelength(g, h, T, tolerance, L0)
% Iterate until the tolerance is met
while (1)
L = g * T^2 / (2 * pi) * tanh(2 * pi * h / L0);
if (abs(L - L0) < tolerance)
break;
end
L0 = L;
end
end
  2 comentarios
GIULIA
GIULIA el 13 de Oct. de 2025 a las 16:50
Thanks Torsten!
If i'd have to re-arrange to find T (knowing k and h) would it then be:
f = @(T) 2*pi / sqrt(g*k*tanh(k*h))
tolerance = 1e-6;
function T = calculatePeriod(g, h, tolerance, T0)
% Iterate until the tolerance is met
while (1)
T = (2 * pi) / sqrt(g * k * tanh (k*h));
if (abs(T - T0) < tolerance)
break;
end
T0 = T;
end
end
My questions in that case are:
1) What would I use as initial guess for T (T0)?
2) Can I always use 1e-6 as tolerance?
Torsten
Torsten el 13 de Oct. de 2025 a las 20:05
You can explicitly solve for T:
T = sqrt( 2*pi*L/g * coth(2*pi*h/L) )

Iniciar sesión para comentar.

Más respuestas (1)

Sam Chak
Sam Chak el 13 de Oct. de 2025 a las 15:44
An approach that directly use the solve() function.
syms lambda positive
% parameters
T = 10;
h = 0.2;
g = 9.81;
% wave dispersion equation
eq = lambda - g*T^2/(2*pi)*tanh(2*pi*h/lambda) == 0
eq = 
sol = solve(eq, lambda)
Warning: Unable to solve symbolically. Returning a numeric solution using vpasolve.
sol = 
13.988348869027691633555641776592
  3 comentarios
Sam Chak
Sam Chak el 14 de Oct. de 2025 a las 7:17
Can you perform algebraic operations to rearrange the lambda (λ) equation to isolate the variable T on the left-hand side? This will allow you to verify whether you arrive at the same result as @Torsten in this comment.
GIULIA
GIULIA el 16 de Oct. de 2025 a las 13:41
Right, thank you!

Iniciar sesión para comentar.

Categorías

Más información sobre Partial Differential Equation Toolbox en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by