Advertisement
Guest User

Untitled

a guest
May 26th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.35 KB | None | 0 0
  1. #include <math.h>
  2. #include <Windows.h>
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7. const int N = 3 , MAX_SIZE=200;
  8. double q[N][N], r[N][N], m[N][N],h[N],tmp[N][N],tmpr[N][N],tmpq[N][N], sum,x[MAX_SIZE],y[MAX_SIZE],f[N],b[N],sol[N];
  9. int n;
  10.  
  11. double Function(double x) {
  12. return x;
  13. }
  14.  
  15. void dupeR() {
  16. for (int i = 0; i < N; i++)
  17. for (int j = 0; j < N; j++)
  18. tmpr[i][j] = r[i][j];
  19. }
  20. void dupeQ(){
  21. for (int i = 0; i < N; i++)
  22. for (int j = 0; j < N; j++)
  23. tmpq[i][j] = q[i][j];
  24. }
  25.  
  26. double norm(double vec[],int size,int from) {
  27. double s = 0;
  28. for (int i = from; i < size; i++) {
  29. s += vec[i] * vec[i];
  30. }
  31. return sqrt(s);
  32. }
  33.  
  34. double basis(double x, int deg) {
  35. return pow(x, deg);
  36. }
  37.  
  38. double resF(double x){
  39. double sum = 0;
  40. for (int i = 0 ; i < N ; i++) sum+= basis(x,i)*sol[i];
  41. return sum;
  42. }
  43.  
  44. void graph() {
  45. float p;
  46. HDC hDC = GetDC(GetConsoleWindow());
  47. HPEN Pen = CreatePen(PS_SOLID, 2, RGB(255, 255, 255));
  48. SelectObject(hDC, Pen);
  49. MoveToEx(hDC, 0, 200, NULL);
  50. LineTo(hDC, 500, 200);
  51. MoveToEx(hDC, 300, 0, NULL);
  52. LineTo(hDC, 300, 470);
  53. for (p = -8.0f; p <= 6.0f; p += 0.001f) // O(300,200) - center
  54. {
  55. MoveToEx(hDC, 70 * p + 300, -70 * resF(p) + 200, NULL);//10 - scale
  56. LineTo(hDC, 70 * p + 300, -70 * resF(p) + 200);
  57. }
  58. }
  59.  
  60. void graphTrue() {
  61. float p;
  62. HDC hDC = GetDC(GetConsoleWindow());
  63. HPEN Pen = CreatePen(PS_SOLID, 2, RGB(0, 255, 0));
  64. SelectObject(hDC, Pen);
  65. for (p = -8.0f; p <= 6.0f; p += 0.001f) // O(300,200) - center
  66. {
  67. MoveToEx(hDC, 70 * p + 300, -70 * Function(p) + 200, NULL);//10 - scale
  68. LineTo(hDC, 70 * p + 300, -70 * Function(p) + 200);
  69. }
  70. }
  71.  
  72. void QR() {
  73.  
  74. for (int t = 0; t < N-1; t++) {
  75. for (int i = 0; i < N; i++)
  76. for (int j = 0; j < N; j++)
  77. if (i == j) {
  78. tmp[i][j] = 1;
  79. }
  80. else {
  81. tmp[i][j] = 0;
  82. }
  83. for (int i = 0; i < N; i++) if (i != 0) sum += m[i][1] * m[i][1];
  84. if (sum != 0) {
  85. for (int i = 0; i < N; i++) if (i < t) h[i] = 1; else h[i] = r[i][t];
  86. h[t] = h[t] + norm(h, N,t);
  87. double normh = norm(h, N,t);
  88. for (int i = t; i < N; i++) h[i] = h[i] / normh;
  89. for (int i = t; i < N; i++)
  90. for (int j = t; j < N; j++)
  91. {
  92. tmp[i][j] += -2 * h[i] * h[j];
  93. }
  94.  
  95. cout << endl;
  96. cout << "R:";
  97. for (int i = 0; i < N; i++) {
  98. cout << endl;
  99. for (int j = 0; j < N; j++) {
  100. cout << tmp[i][j];
  101. cout << " ";
  102. }
  103. }
  104.  
  105. dupeR();
  106. for (int i = 0; i < N; i++)
  107. for (int j = 0; j < N; j++) {
  108. r[i][j] = 0;
  109. for (int k = 0; k < N; k++) {
  110. r[i][j] += tmp[i][k] * tmpr[k][j];
  111. }
  112. }
  113.  
  114. cout << "Q:";
  115. cout << endl;
  116.  
  117. for (int i = 0; i < N; i++) {
  118. cout << endl;
  119. for (int j = 0; j < N; j++) {
  120. cout << r[i][j];
  121. cout << " ";
  122. }
  123. }
  124.  
  125.  
  126. dupeQ();
  127. for (int i = 0; i < N; i++)
  128. for (int j = 0; j < N; j++) {
  129. q[i][j] = 0;
  130. for (int k = 0; k < N; k++) {
  131. q[i][j] += tmp[i][k] * tmpq[k][j];
  132. }
  133. }
  134.  
  135.  
  136.  
  137. }
  138.  
  139. }
  140.  
  141.  
  142.  
  143.  
  144. /*
  145. Транспонирование Q и вычисление A = QR
  146. dupeQ();
  147. for (int i = 0; i < N; i++)
  148. for (int j = 0; j < N; j++)
  149. q[i][j] = tmpq[j][i];
  150.  
  151.  
  152. for (int i = 0; i < N; i++)
  153. for (int j = 0; j < N; j++) {
  154. tmp[i][j] = 0;
  155. for (int k = 0; k < N; k++) {
  156. tmp[i][j] += q[i][k] * r[k][j];
  157. }
  158. }
  159.  
  160. cout << "QR:";
  161. cout << endl;
  162.  
  163. for (int i = 0; i < N; i++) {
  164. cout << endl;
  165. for (int j = 0; j < N; j++) {
  166. cout << tmp[i][j];
  167. cout << " ";
  168. }
  169. }
  170. */
  171.  
  172. }
  173.  
  174.  
  175. void birds() {
  176. float p;
  177. HDC hDC = GetDC(GetConsoleWindow());
  178. HPEN Pen = CreatePen(PS_SOLID, 2, RGB(0, 200, 200));
  179. SelectObject(hDC, Pen);
  180.  
  181. for (int i=0 ; i <= n ; i++)
  182. {
  183. MoveToEx(hDC, 70 * x[i] + 300, -70 * y[i] + 200, NULL);//10 - scale
  184. LineTo(hDC, 70 * x[i] +304, -70 * y[i] + 200);
  185. MoveToEx(hDC, 70 * x[i] + 302, -72 * y[i] + 200, NULL);//10 - scale
  186. LineTo(hDC, 70 * x[i] + 302, -68 * y[i] + 200);
  187. }
  188. }
  189. int main() {
  190.  
  191. //cin >> n; // Количество точек < MAX_SIZE
  192. //cin >> a;
  193. //cin >> b;
  194. /*for (int i = 0; i < n; i++) {
  195. cin >> x[i];
  196. cin >> y[i];
  197. }*/
  198. n = 20;
  199. for (int i = 0; i < n; i++) {
  200. x[i] = 0.25*i;
  201. y[i] = Function(x[i]) + pow(-1.0,i)*0.01*(rand()%50) ;
  202. }
  203.  
  204. for (int i = 0; i < N; i++) {
  205. sum = 0;
  206. for (int j = 0; j < n; j++) sum += y[j] * basis(x[j], i);
  207. f[i] = sum;
  208. }
  209.  
  210. for (int i = 0; i < N;i++)
  211. for (int j = 0; j < N; j++)
  212. {
  213. sum = 0;
  214. for (int k = 0; k < n; k++) sum += basis(x[k], i)*basis(x[k], j);
  215. m[i][j] = sum;
  216. }
  217.  
  218. for (int i= 0; i<N ; i++)
  219. for (int j = 0; j < N; j++)
  220. if (i == j) {
  221. q[i][j] = 1;
  222. r[i][j] = m[i][j];
  223. }
  224. else {
  225. q[i][j] = 0;
  226. r[i][j] = m[i][j];
  227. }
  228. QR();
  229.  
  230. for (int i = 0; i < N; i++)
  231. {
  232. sum = 0;
  233. for (int k = 0; k < N; k++) sum += q[i][k]*f[k];
  234. b[i] = sum;
  235. }
  236. cout << endl;
  237. cout << "coef:";
  238.  
  239. for (int i = N-1; i >=0; i--)
  240. {
  241. sum = b[i];
  242. for (int k = i+1; k < N; k++) sum += -sol[k]*r[i][k] ;
  243. sol[i] = sum/r[i][i];
  244.  
  245. }
  246.  
  247. for (int i = 0; i < N; i++) {
  248. cout << sol[i];
  249. cout << ' ';
  250. }
  251.  
  252. graph();
  253. graphTrue();
  254. birds();
  255. cin >> m[0][0];
  256. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement