Advertisement
Guest User

Untitled

a guest
Dec 11th, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.54 KB | None | 0 0
  1. #include <iostream>
  2. using std::cout;
  3. using std::endl;
  4.  
  5. #include <opencv2/opencv.hpp>
  6. #include "opencv_lib.hpp"
  7.  
  8. #include <cstdint>
  9. #include <cstdbool>
  10. #include "Eigen/Dense"
  11.  
  12. typedef double scalar_t;
  13. typedef Eigen::VectorXd vector_t;
  14. typedef const Eigen::Ref<const vector_t> vector_in_t;
  15. typedef Eigen::Ref<vector_t> vector_io_t;
  16.  
  17. class RungeKuttaGill
  18. {
  19. public:
  20. explicit RungeKuttaGill() : m_init(false) {}
  21. virtual ~RungeKuttaGill() {}
  22. void init(void);
  23. void step(scalar_t dt);
  24. virtual void print(void);
  25.  
  26. protected:
  27. virtual vector_t init_y(void) = 0;
  28. virtual void calc_f(vector_io_t f, vector_in_t y) = 0;
  29.  
  30. protected:
  31. vector_t m_y;
  32.  
  33. private:
  34. scalar_t m_coef[7];
  35.  
  36. bool m_init;
  37.  
  38. vector_t m_f;
  39. vector_t m_k[4];
  40. };
  41.  
  42. void RungeKuttaGill::init(void)
  43. {
  44. scalar_t sqrt2 = sqrt(2.0);
  45. m_coef[0] = 0.5;
  46. m_coef[1] = 0.5 * (-1.0 + sqrt2);
  47. m_coef[2] = 1.0 - 0.5 * sqrt2;
  48. m_coef[3] = 0.5 * sqrt2;
  49. m_coef[4] = 1.0 + 0.5 * sqrt2;
  50. m_coef[5] = 2.0 - sqrt2;
  51. m_coef[6] = 2.0 + sqrt2;
  52.  
  53. m_y = init_y();
  54.  
  55. uint32_t dim = m_y.size();
  56. m_f = vector_t(dim);
  57. for (uint32_t i = 0; i < 4; i++) {
  58. m_k[i] = vector_t(dim);
  59. }
  60. }
  61.  
  62. void RungeKuttaGill::step(scalar_t dt)
  63. {
  64. calc_f(m_k[0], m_y);
  65. m_k[0] *= dt;
  66. calc_f(m_k[1], m_y + m_coef[0] * m_k[0]);
  67. m_k[1] *= dt;
  68. calc_f(m_k[2], m_y + m_coef[1] * m_k[0] + m_coef[2] * m_k[1]);
  69. m_k[2] *= dt;
  70. calc_f(m_k[3], m_y - m_coef[3] * m_k[1] + m_coef[4] * m_k[2]);
  71. m_k[3] *= dt;
  72.  
  73. m_y = m_y + (1.0 / 6.0) * (m_k[0] + m_coef[5] * m_k[1] + m_coef[6] * m_k[2] + m_k[3]);
  74. }
  75.  
  76. void RungeKuttaGill::print(void)
  77. {
  78. cout << " " << m_y.transpose() << endl;
  79. }
  80.  
  81. //
  82.  
  83. class MassPoint : public RungeKuttaGill
  84. {
  85. public:
  86. explicit MassPoint() {}
  87. virtual ~MassPoint() {}
  88. protected:
  89. virtual vector_t init_y(void);
  90. virtual void calc_f(vector_io_t f, vector_in_t y);
  91. };
  92.  
  93. vector_t MassPoint::init_y(void)
  94. {
  95. vector_t y = vector_t::Zero(3);
  96. y(1) = 1.0;
  97. return y;
  98. }
  99.  
  100. void MassPoint::calc_f(vector_io_t f, vector_in_t y)
  101. {
  102. const scalar_t k = 1;
  103. const scalar_t m = 1;
  104. // t, x, dx/dt
  105. f(0) = 1; // d/dt(t)
  106. f(1) = y(2); // d/dt(x)
  107. f(2) = -(k / m) * y(1); // d/dt(dx/dt)
  108. }
  109.  
  110. //
  111.  
  112. class Lorenz : public RungeKuttaGill
  113. {
  114. public:
  115. explicit Lorenz() {}
  116. virtual ~Lorenz() {}
  117. virtual void Lorenz::print(void);
  118. protected:
  119. virtual vector_t init_y(void);
  120. virtual void calc_f(vector_io_t f, vector_in_t y);
  121. };
  122.  
  123. vector_t Lorenz::init_y(void)
  124. {
  125. vector_t y = vector_t::Zero(4);
  126. y(1) = 1.0;
  127. return y;
  128. }
  129.  
  130. void Lorenz::calc_f(vector_io_t f, vector_in_t y)
  131. {
  132. const scalar_t p = 10;
  133. const scalar_t r = 28;
  134. const scalar_t b = 8.0/3.0;
  135. // t, x, y, z
  136. f(0) = 1;
  137. f(1) = -p * y(1) + p * y(2);
  138. f(2) = -y(1) * y(3) + r * y(1) - y(2);
  139. f(3) = y(1) * y(2) - b * y(3);
  140. }
  141.  
  142. //
  143.  
  144. #define SIZE (320)
  145. const char winName[] = "window";
  146. cv::Mat img;
  147. bool p = false;
  148. int px, py;
  149.  
  150. void Lorenz::print(void)
  151. {
  152. scalar_t sc = 6.0;
  153. int x = SIZE/2 + m_y(1) * sc;
  154. int y = SIZE - m_y(3) * sc;
  155. int c = 128 - m_y(2) * 10;
  156. if (p) {
  157. cv::line(img, cv::Point(px, py), cv::Point(x, y), cv::Scalar(255, 255 - c, c));
  158. cv::imshow(winName, img);
  159. //cv::waitKey(1);
  160. }
  161. p = true;
  162. px = x;
  163. py = y;
  164. }
  165.  
  166.  
  167. int main(int argc, char **argv)
  168. {
  169. //MassPoint sim;
  170. Lorenz sim;
  171. img = cv::Mat::zeros(SIZE, SIZE, CV_8UC3);
  172.  
  173. sim.init();
  174. sim.print();
  175. cv::namedWindow(winName);
  176. cv::VideoWriter vOut;
  177. vOut.open("o.avi", CV_FOURCC_DEFAULT, 29.97, img.size());
  178.  
  179. for (int k = 0; k < 128; k++) {
  180. for (int j = 0; j < 64; j++) {
  181. for (int i = 0; i < 16; i++) {
  182. sim.step(1.0 / 1024.0);
  183. //sim.print();
  184. }
  185. sim.print();
  186. }
  187. cv::waitKey(1);
  188. vOut << img;
  189. //cv::imwrite("png/" + std::to_string(k + 100) + ".png", img);
  190. }
  191. cv::waitKey(-1);
  192.  
  193. return 0;
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement