pub fn besselk_seq<T: BesselFloat>(
nu: T,
z: Complex<T>,
n: usize,
scaling: Scaling,
) -> Result<BesselResult<T>, Error>Expand description
Compute Kν+j(z) for j = 0, 1, …, n−1 in a single call.
Returns a BesselResult containing n values and an Accuracy:
Accuracy::Normal— no significant precision lossAccuracy::Reduced— more than half of significant digits may be lost (|z| or |ν| very large)
The scaling parameter selects Scaling::Unscaled or Scaling::Exponential;
see crate-level docs for details.
Supports negative ν via the same reflection formula as besselk.
§Example
use complex_bessel::*;
use num_complex::Complex;
let z = Complex::new(1.0_f64, 0.0);
// K_0(z), K_1(z), K_2(z) in one call
let result = besselk_seq(0.0, z, 3, Scaling::Unscaled).unwrap();
assert_eq!(result.values.len(), 3);
assert!((result.values[0].re - 0.4211).abs() < 1e-3); // K_0(1) ≈ 0.4211§Errors
Error::InvalidInputif n < 1, or if z = 0.Error::Overflowif |z| is too small or too large for a finite result.Error::TotalPrecisionLossif |z| or |ν| is too large for any significant digits (roughly > 10⁹ for f64).Error::ConvergenceFailureif an internal series or recurrence does not converge (rare).
Examples found in repository?
examples/basic.rs (line 47)
4fn main() {
5 let z = Complex::new(1.0_f64, 2.0);
6
7 // -- Single-value Bessel functions --
8 println!("=== Single-value functions (f64) ===");
9 let j = besselj(0.5, z).unwrap();
10 println!("J_0.5({z}) = {j}");
11
12 let y = bessely(1.0, z).unwrap();
13 println!("Y_1({z}) = {y}");
14
15 let i = besseli(0.0, z).unwrap();
16 println!("I_0({z}) = {i}");
17
18 let k = besselk(1.0, z).unwrap();
19 println!("K_1({z}) = {k}");
20
21 let h1 = hankel1(0.0, z).unwrap();
22 println!("H^(1)_0({z}) = {h1}");
23
24 let h2 = hankel2(0.0, z).unwrap();
25 println!("H^(2)_0({z}) = {h2}");
26
27 // -- Negative order --
28 println!("\n=== Negative order ===");
29 let j_neg = besselj(-0.5, z).unwrap();
30 println!("J_-0.5({z}) = {j_neg}");
31
32 let k_neg = besselk(-3.0, z).unwrap();
33 let k_pos = besselk(3.0, z).unwrap();
34 println!("K_-3({z}) = {k_neg}");
35 println!("K_3({z}) = {k_pos} (should be equal)");
36
37 // -- Scaled computation --
38 println!("\n=== Scaled functions ===");
39 let k_sc = besselk_scaled(1.0, z).unwrap();
40 println!("exp(z)*K_1({z}) = {k_sc}");
41
42 let j_sc = besselj_scaled(0.5, z).unwrap();
43 println!("exp(-|Im(z)|)*J_0.5({z}) = {j_sc}");
44
45 // -- Sequence computation --
46 println!("\n=== Sequence: K_0, K_1, K_2 ===");
47 let seq = besselk_seq(0.0, z, 3, Scaling::Unscaled).unwrap();
48 for (j, val) in seq.values.iter().enumerate() {
49 println!(" K_{j}({z}) = {val}");
50 }
51
52 println!(" underflow_count: {}", seq.underflow_count);
53 println!(" status: {:?}", seq.status);
54
55 // -- Airy functions --
56 println!("\n=== Airy functions ===");
57 let ai = airy(z).unwrap();
58 println!("Ai({z}) = {ai}");
59
60 let ai_prime = airyprime(z).unwrap();
61 println!("Ai'({z}) = {ai_prime}");
62
63 let bi = biry(z).unwrap();
64 println!("Bi({z}) = {bi}");
65
66 // -- f32 support --
67 println!("\n=== f32 support ===");
68 let z32 = Complex::new(1.0_f32, 2.0);
69 let j32 = besselj(0.5, z32).unwrap();
70 println!("J_0.5({z32}) = {j32} (f32)");
71}