torch.special.modified_bessel_i1
function modified_bessel_i1<S extends Shape>(input: Tensor<S, 'float32'>, options?: SpecialUnaryOptions<S>): Tensor<S, 'float32'>Computes the modified Bessel function of the first kind of order 1.
The modified Bessel function I₁(x) is the order-1 solution to the modified Bessel differential equation, complementary to I₀(x). Like I₀, I₁ grows exponentially for large x, but with different asymptotic behavior. I₁ vanishes at the origin (I₁(0) = 0) and exhibits first-order angular dependence in cylindrical coordinates. Essential for:
- Signal processing: Kaiser window β parameter and filter design (I₁/I₀ ratio controls window characteristics)
- Probability theory: Rayleigh and Rice distributions (appears in envelope detection formulas)
- Heat conduction: first-order azimuthal solutions and multipole expansions in cylindrical problems
- Waveguides: TE and TM mode analysis with angular variation (azimuthal dependence)
- Antenna arrays: radiation patterns and coupling between elements
- Quantum mechanics: angular momentum eigenfunctions in cylindrical potential
- Electrical engineering: skin depth and current distribution in cylindrical conductors
Relationship to I₀: The fundamental relationship I₀'(x) = I₁(x) connects order-0 and order-1. This derivative relationship is crucial for solving differential equations and computing recurrence relations.
Exponential Growth: Like I₀, I₁ grows exponentially (I₁(x) ~ exp(x)/√(2πx) for large x). Use i1e() for scaled version when x is large to prevent overflow.
\begin{aligned} \\text{I}_1(x) = \\sum_{m=0}^\\infty \\frac{(x/2)^{2m+1}}{m!(m+1)!} \\quad \\text{(series expansion)} \\ \\text{Derivative relation: } \\frac{d}{dx} \\text{I}_0(x) = \\text{I}_1(x) \\ \\text{Asymptotic (large } |x|): \\text{I}_1(x) \\approx \\frac{\\exp(|x|)}{\\sqrt{2\\pi|x|}} \\ \\text{Recurrence: } \\text{I}_{n-1}(x) - \\text{I}_{n+1}(x) = \\frac{2n}{x} \\text{I}_n(x) \\ \\text{Integral form: } \\text{I}_1(x) = \\frac{1}{\\pi} \\int_0^\\pi \\exp(x\\cos\\theta) \\cos\\theta d\\theta \end{aligned}- Odd function: I₁(-x) = -I₁(x) (anti-symmetry about y-axis, unlike I₀)
- Zero at origin: I₁(0) = 0 (vanishes unlike I₀(0) = 1)
- Exponential growth: I₁(x) ~ exp(x)/√(2πx) for large x (overflow risk!)
- Derivative: I₀'(x) = I₁(x) (fundamental connection to I₀)
- First-order behavior: Angular dependence in cylindrical coords (ℓ=1 equivalent)
- Recurrence: Iₙ₋₁ - Iₙ₊₁ = (2n/x)Iₙ (efficient sequential computation)
- Kaiser window: I₁/I₀ ratio controls window spectral characteristics
- Numerical overflow: I₁(x) grows as exp(x); overflow for x ~20 in float32
- Large x: Use i1e() (exp-scaled) for numerical stability when x is large
- Odd function: I₁(-x) = -I₁(x); sign changes with input sign
Parameters
inputTensor<S, 'float32'>- Input tensor with real values (any x ∈ ℝ). Can be scalar or Tensor
optionsSpecialUnaryOptions<S>optional- Optional output tensor
Returns
Tensor<S, 'float32'>– Tensor with I₁(x) valuesExamples
// Basic evaluation: I₁ is odd function with exponential growth
const x = torch.tensor([-2, -1, 0, 1, 2, 5]);
const i1 = torch.special.modified_bessel_i1(x);
// I₁(-x) = -I₁(x) (odd function, unlike I₀)
// I₁(0) = 0 (vanishes at origin)
// I₁(5) ≈ 24.3 (exponential growth)
// Kaiser window β parameter optimization
const ripple_dB = 60; // Desired stopband ripple (dB)
const transition_width = 0.1; // Normalized transition width
// Kaiser formula: β = 0.1102*(ripple_dB - 8.7) for ripple_dB > 50
const beta = 0.1102 * (ripple_dB - 8.7); // ≈ 5.65
const alpha = torch.special.modified_bessel_i0(beta);
const i1_contrib = torch.special.modified_bessel_i1(beta);
// α and β control Kaiser window's frequency-domain properties
// Rayleigh fading channel: envelope detection
const received_power = torch.tensor([0.5, 1.0, 2.0, 3.0]); // Signal power
const r_vec = torch.linspace(0, 5, 100); // Envelope amplitude
const i1_vals = torch.special.modified_bessel_i1(r_vec);
// Rayleigh PDF: p(r) = r * exp(-r²/2), but envelope detection uses I₀ and I₁
// Derivative verification: I₁ = dI₀/dx
const x_test = torch.linspace(0.1, 5, 50);
const i0_vals = torch.special.modified_bessel_i0(x_test);
const i1_vals_direct = torch.special.modified_bessel_i1(x_test);
// Finite difference approximation: (I₀(x+Δ) - I₀(x-Δ))/(2Δ) ≈ I₁(x)
// Angular dependence in cylindrical coordinates
const r = torch.linspace(0.1, 5, 100); // Radial distance
const theta = 2 * Math.PI / 4; // Angular position (azimuth)
const i1_r = torch.special.modified_bessel_i1(r);
// Azimuthal-dependent solution: u(r,θ) ∝ I₁(r) * sin(θ) [for ℓ=1 mode]See Also
- PyTorch torch.special.modified_bessel_i1()
- torch.special.modified_bessel_i0 - Order-0 (related by derivative I₀'=I₁)
- torch.special.modified_bessel_k1 - Second kind K₁ (decaying, not growing)
- torch.special.i1e - Exponentially scaled I₁ (prevents overflow)