-
-
Notifications
You must be signed in to change notification settings - Fork 50.5k
feat: add numerical laplace transform #14602
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from all commits
abcbec3
fca04e3
92e3835
f65afeb
4a5c496
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,66 @@ | ||
| """ | ||
| This module provides a numerical implementation of the Laplace Transform. | ||
|
|
||
| https://en.wikipedia.org/wiki/Laplace_transform | ||
|
|
||
| """ | ||
|
|
||
| import numpy as np | ||
|
|
||
|
|
||
| def laplace_transform( | ||
| function_values: np.ndarray, s_value: float, delta_t: float | ||
| ) -> float: | ||
|
Tushar-R-Tyagi marked this conversation as resolved.
|
||
| """ | ||
| Calculate the numerical Laplace Transform of a function given its values over time. | ||
|
|
||
| This implementation supports only real-valued, non-negative Laplace | ||
| parameters ``s``. | ||
|
|
||
| Args: | ||
| function_values: A numpy array of the function values f(t). | ||
| s_value: The real-valued Laplace parameter ``s``. Must be non-negative. | ||
| delta_t: The time step between samples. | ||
|
|
||
| Returns: | ||
| The approximate real-valued value of the Laplace transform at s_value. | ||
|
|
||
| Example: For f(t) = 1, the Laplace transform L{1} = 1/s. | ||
| If s = 2, L{1} should be 0.5. | ||
|
|
||
| >>> t = np.linspace(0, 50, 10000) | ||
| >>> f_t = np.ones_like(t) # f(t) = 1 | ||
| >>> res = laplace_transform(f_t, s_value=2.0, delta_t=50/10000) | ||
| >>> abs(res - 0.5) < 1e-3 | ||
|
Tushar-R-Tyagi marked this conversation as resolved.
|
||
| True | ||
|
|
||
| Example: For f(t) = e^(-t), the Laplace transform L{e^-t} = 1/(s+1). | ||
| If s = 1, L{e^-t} should be 0.5. | ||
|
|
||
| >>> t = np.linspace(0, 50, 10000) | ||
| >>> f_t = np.exp(-t) | ||
| >>> res = laplace_transform(f_t, s_value=1.0, delta_t=50/10000) | ||
| >>> abs(res - 0.5) < 1e-3 | ||
|
Tushar-R-Tyagi marked this conversation as resolved.
|
||
| True | ||
| """ | ||
| if delta_t <= 0: | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good input validation — catching non-positive delta_t early prevents if s_value < 0: |
||
| raise ValueError("delta_t must be a positive value.") | ||
| if function_values.size == 0: | ||
| raise ValueError("function_values array cannot be empty.") | ||
|
|
||
| # Time vector corresponding to the function values | ||
| time_vector = np.arange(len(function_values)) * delta_t | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Using np.arange(len(function_values)) * delta_t works correctly but time_vector = np.linspace(0, (len(function_values) - 1) * delta_t, This makes the time vector construction more readable and explicit. |
||
|
|
||
| # The integrand: f(t) * e^(-s*t) | ||
| integrand = function_values * np.exp(-s_value * time_vector) | ||
|
|
||
| # Numerical integration using the trapezoidal rule | ||
| result = np.trapezoid(integrand, dx=delta_t) | ||
|
|
||
| return float(result) | ||
|
|
||
|
|
||
| if __name__ == "__main__": | ||
| import doctest | ||
|
|
||
| doctest.testmod() | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The module docstring is minimal — just one line and a Wikipedia link.
Consider expanding it to match the quality of the function docstring:
"""
Laplace Transform — Numerical Implementation.
Computes the numerical Laplace Transform using the trapezoidal
integration rule. Supports real-valued, non-negative Laplace
parameters only.
Reference: https://en.wikipedia.org/wiki/Laplace_transform
"""