Advertisement
Guest User

Untitled

a guest
Mar 3rd, 2021
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. import math
  2.  
  3.  
  4. type Dual = tuple[val: float64, dot: float64]
  5.  
  6.  
  7. proc `+`(x, y: Dual): Dual {. noSideEffect .} =
  8. (x.val + y.val, x.dot + y.dot)
  9.  
  10. proc `+`(x: Dual, y: float64): Dual {. noSideEffect .} =
  11. (x.val + y, x.dot)
  12.  
  13. proc `+`(x: float64, y: Dual): Dual {. noSideEffect .} =
  14. (x + y.val, y.dot)
  15.  
  16.  
  17. proc `-`(x, y: Dual): Dual {. noSideEffect .} =
  18. (x.val - y.val, x.dot - y.dot)
  19.  
  20. proc `-`(x: Dual, y: float64): Dual {. noSideEffect .} =
  21. (x.val - y, x.dot)
  22.  
  23. proc `-`(x: float64, y: Dual): Dual {. noSideEffect .} =
  24. (x - y.val, - y.dot)
  25.  
  26.  
  27. proc `*`(x, y: Dual): Dual {. noSideEffect .} =
  28. (x.val * y.val, y.val * y.dot + x.dot * y.val)
  29.  
  30. proc `*`(x: Dual, y: float64): Dual {. noSideEffect .} =
  31. (x.val * y, x.dot * y)
  32.  
  33. proc `*`(x: float64, y: Dual): Dual {. noSideEffect .} =
  34. (x * y.val, x * y.dot)
  35.  
  36.  
  37. proc `/`(x, y: Dual): Dual {. noSideEffect .} =
  38. (x.val / y.val, (x.dot * y.val - x.val * y.dot) / (y.val * y.val))
  39.  
  40. proc `/`(x: Dual, y: float64): Dual {. noSideEffect .} =
  41. (x.val / y, x.dot / y)
  42.  
  43. proc `/`(x: float64, y: Dual): Dual {. noSideEffect .} =
  44. (x / y.val, - y.dot * x / (y.val * y.val))
  45.  
  46.  
  47. proc `sin`(x: Dual): Dual {. noSideEffect .} =
  48. (sin(x.val), x.dot * cos(x.val))
  49.  
  50. proc `cos`(x: Dual): Dual {. noSideEffect .} =
  51. (cos(x.val), x.dot * - sin(x.val))
  52.  
  53.  
  54. proc update_q(h: float64) =
  55. echo "UQ"
  56.  
  57. proc update_p(h: float64) =
  58. echo "UP"
  59.  
  60. proc plot(h: float64) =
  61. echo "UP"
  62.  
  63. proc solve(uq: proc(h: float64), up: proc(h: float64), output: proc(h: float64)) =
  64. let steps: int64 = 10000
  65. let h: float64 = 0.01
  66. for step in 1..steps:
  67. uq(h)
  68. up(h)
  69. output(step * h)
  70.  
  71.  
  72. let a_f = 4.5;
  73.  
  74. let a: Dual = (val: 1.0, dot: 1.0)
  75.  
  76. let b: Dual = (val: 2.0, dot: 0.0)
  77.  
  78. var c = a + a_f
  79.  
  80. var d = a_f - a
  81.  
  82. var e = a + b
  83.  
  84. var f = a * b
  85.  
  86. var g = b / a
  87.  
  88. echo "Hello, World!"
  89.  
  90. echo c
  91.  
  92. echo d
  93.  
  94. echo e
  95.  
  96. echo f
  97.  
  98. echo g
  99.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement