Advertisement
Guest User

Untitled

a guest
Mar 18th, 2019
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.88 KB | None | 0 0
  1. pub fn rk4_nd(f: Vec<impl Fn(f64, Vec<f64>) -> f64>, n: u32, alpha: Vec<f64>, a: f64, b: f64) -> Vec<(f64, Vec<f64>)> {
  2. let m = f.len();
  3.  
  4. // Step 1 in Burden
  5. let h = (b - a) / (n as f64);
  6. let mut t = a;
  7.  
  8. // Step 2 in Burden
  9. let mut w = alpha.clone();
  10.  
  11. // Step 3 in Burden
  12. let mut output = vec![];
  13. output.push((t, w.clone()));
  14.  
  15. // Step 4 in Burden
  16. for _ in 0..n {
  17. // Step 5 in Burden
  18. let mut k1 = vec![];
  19. for j in 0..m {
  20. k1.push(h * f[j](t, w.clone()));
  21. }
  22.  
  23. // Step 6 in Burden
  24. let mut k2 = vec![];
  25. let temp: Vec<f64> = k1.clone().iter().zip(&w).map(|(k, w)| w + k / 2.0).collect();
  26. for j in 0..m {
  27. k2.push(h * f[j](t + h / 2.0, temp.clone()));
  28. }
  29.  
  30. // Step 7 in Burden
  31. let mut k3 = vec![];
  32. let temp: Vec<f64> = k2.clone().iter().zip(&w).map(|(k, w)| w + k / 2.0).collect();
  33. for j in 0..m {
  34. k3.push(h * f[j](t + h / 2.0, temp.clone()));
  35. }
  36.  
  37. // Step 8 in Burden
  38. let mut k4 = vec![];
  39. let temp: Vec<f64> = k3.clone().iter().zip(&w).map(|(k, w)| w + k).collect();
  40. for j in 0..m {
  41. k4.push(h * f[j](t + h, temp.clone()));
  42. }
  43.  
  44. // Step 9 in Burden
  45. for j in 0..m {
  46. w[j] += (k1[j] + 2.0 * k2[j] + 2.0 * k3[j] + k4[j]) / 6.0;
  47. }
  48.  
  49. // Step 10 in Burden
  50. t += h;
  51.  
  52. // Step 11 in Burden
  53. output.push((t, w.clone()));
  54. }
  55. output
  56. }
  57.  
  58. fn f1(t: f64, w: Vec<f64>) -> f64 { -4.0 * w[0] + 3.0 * w[1] + 6.0 }
  59. fn f2(t: f64, w: Vec<f64>) -> f64 { -2.4 * w[0] + 1.6 * w[1] + 3.6 }
  60.  
  61. fn main() {
  62. // Burden, Illustration, pg. 331.
  63. let mut f = vec![];
  64. f.push(f1);
  65. f.push(f2);
  66. let n = 10;
  67. let a = 0.0;
  68. let b = 1.0;
  69. let alpha = vec![0.0, 0.0];
  70.  
  71. let result = rk4_nd(f, n, alpha, a, b);
  72. println!("{:?}", result);
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement