1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
use crateDerivatorMultiVariable;
use ComplexFloat;
///solves for the divegerence of a 3D vector field around a given point
///
/// assume a vector field, V
/// V is characterized in 3 dimensions: Vx, Vy and Vz
/// The divergence is then defined as dVx/dx + dVy/dy + dVz/dz
///
/// NOTE: Returns a Result<T, &'static str>
/// Possible &'static str are:
/// NumberOfStepsCannotBeZero -> if the derivative step size is zero
///
/// Example:
/// Assume we have a vector field (y, -x, 2*z)
/// ```
/// use multicalc::vector_field::divergence;
/// use multicalc::numerical_derivative::finite_difference::*;
///
/// //x-component
/// let vf_x = | args: &[f64; 3] | -> f64
/// {
/// return args[1];
/// };
///
/// //y-component
/// let vf_y = | args: &[f64; 3] | -> f64
/// {
/// return -args[0];
/// };
///
/// //z-component
/// let vf_z = | args: &[f64; 3] | -> f64
/// {
/// return 2.0*args[2];
/// };
///
/// let vector_field_matrix: [&dyn Fn(&[f64; 3]) -> f64; 3] = [&vf_x, &vf_y, &vf_z];
///
/// let point = [0.0, 1.0, 3.0]; //the point of interest
/// let derivator = MultiVariableSolver::default();
///
/// //divergence known to be 2.0
/// let val = divergence::get_3d(derivator, &vector_field_matrix, &point).unwrap();
/// assert!(f64::abs(val - 2.00) < 0.00001);
/// ```
///solves for the divegerence of a 2D vector field around a given point
///
/// assume a vector field, V
/// V is characterized in 3 dimensions: Vx and Vy
/// The divergence is then defined as dVx/dx + dVy/dy
///
/// NOTE: Returns a Result<T, &'static str>
/// Possible &'static str are:
/// NumberOfStepsCannotBeZero -> if the derivative step size is zero
///
/// Example:
/// Assume we have a vector field (y, -x)
/// ```
/// use multicalc::vector_field::divergence;
/// use multicalc::numerical_derivative::finite_difference::*;
///
/// //x-component
/// let vf_x = | args: &[f64; 2] | -> f64
/// {
/// return args[1];
/// };
///
/// //y-component
/// let vf_y = | args: &[f64; 2] | -> f64
/// {
/// return -args[0];
/// };
///
/// let vector_field_matrix: [&dyn Fn(&[f64; 2]) -> f64; 2] = [&vf_x, &vf_y];
///
/// let point = [0.0, 1.0]; //the point of interest
/// let derivator = MultiVariableSolver::default();
///
/// //divergence known to be 0.0
/// let val = divergence::get_2d(derivator, &vector_field_matrix, &point).unwrap();
/// assert!(f64::abs(val - 0.00) < 0.00001);
/// ```