Advertisement
Guest User

Untitled

a guest
Nov 14th, 2019
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.27 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4. #include <math.h>
  5. #include <cmath>
  6. #include <iostream>
  7. #include <Windows.h>
  8. #include <fstream>
  9.  
  10. #define centreY 300
  11. #define centreX 500
  12. #define maxPow 17
  13. #define exp 2.7182818284590452353602874713527
  14.  
  15. using namespace std;
  16.  
  17.  
  18. HDC hDC = GetDC(GetConsoleWindow());
  19. HPEN Pen = CreatePen(PS_SOLID, 1, RGB(200, 80, 80));
  20. HPEN Pen1 = CreatePen(PS_SOLID, 1, RGB(200, 150, 80));
  21. HPEN Pen2 = CreatePen(PS_SOLID, 1, RGB(200, 200, 80));
  22. HPEN Pen3 = CreatePen(PS_SOLID, 1, RGB(80, 200, 80));
  23. HPEN Pen4 = CreatePen(PS_SOLID, 1, RGB(80, 200, 200));
  24. HPEN Pen5 = CreatePen(PS_SOLID, 1, RGB(80, 80, 200));
  25. HPEN Pen6 = CreatePen(PS_SOLID, 1, RGB(200, 80, 200));
  26. HPEN PenCoord = CreatePen(PS_SOLID, 1, RGB(255, 255, 255));
  27.  
  28.  
  29.  
  30. long double a = 0, b = 5;
  31. long double* y;
  32. long double* yy;
  33. long double* x;
  34. long double* h;
  35.  
  36.  
  37. long double locEps, absEps, rungEps;
  38.  
  39. long double coefgor = 100;
  40. long double coefver = 30;
  41. long double step;
  42. long double pz;
  43.  
  44.  
  45.  
  46. void drawHor(long double x, long double y) {
  47. MoveToEx(hDC, x + 5, y, NULL);
  48. LineTo(hDC, x - 5, y);
  49. }
  50.  
  51. void drawVer(long double x, long double y) {
  52. MoveToEx(hDC, x, y + 5, NULL);
  53. LineTo(hDC, x, y - 5);
  54. }
  55.  
  56. long double function(long double x) {
  57. return (sin(x * x) + 3);
  58. }
  59. long double functionDer(long double x, long double y) {
  60. return (2 * x * cos(x * x) + k * (y - function(x)));
  61. }
  62.  
  63. long double maxim(long double first, long double second) {
  64. if (first >= second) return (first);
  65. else return second;
  66. }
  67. long double countlocEps(long double x, long double y) {
  68. locEps = abs(abs(function(x)) - abs(y)) / maxim(abs(function(x)), abs(y));
  69. return locEps;
  70. }
  71. long double countabsEps(long double x, long double y) {
  72. absEps = abs(function(x) - y);
  73. return absEps;
  74. }
  75. long double countRungEps(long double y, long double ycopy) {
  76. rungEps = ((pow(2, 2)) / (pow(2, 2) - 1)) * (y - ycopy);
  77. return rungEps;
  78. }
  79. long double countExact(long double x, long double nu1, long double nu2, int coord) {
  80. long double exact;
  81. if (coord == 0) exact = 0.5 * (nu1 + nu2) * pow(exp, ((-995) * x)) + 0.5 * (nu1 - nu2) * pow(exp, ((-5) * x));
  82. else exact = 0.5 * (nu1 + nu2) * pow(exp, ((-995) * x)) - 0.5 * (nu1 - nu2) * pow(exp, ((-5) * x));
  83. return exact;
  84. }
  85.  
  86. void drawOrigin(int n, long double nu) {
  87. SelectObject(hDC, Pen2);
  88. step = (b - a) / (n - 1);
  89. MoveToEx(hDC, centreX + coefgor * (a), centreY - coefver * nu, NULL);
  90. for (int i = 0; i < n; i++) {
  91. x[i] = a + step * i;
  92. }
  93.  
  94. for (int i = 1; i < n; i++) {
  95.  
  96. LineTo(hDC, centreX + coefgor * x[i], centreY - coefver * function(x[i]));
  97.  
  98. }
  99. }
  100.  
  101. long double euler(long double* x, long double nu1, long double nu2, int n) {
  102. SelectObject(hDC, Pen);
  103. long double maxAbsEps = 0, maxLocEps = 0, maxLocEpsOld = 0;
  104. long double maxEps = 0, maxOldEps = 0, RungEps = 0;
  105. long double delta;
  106. y = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
  107. yy = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
  108. y[0] = nu1;
  109. yy[0] = nu2;
  110. step = (b - a) / (n - 1);
  111. for (int j = 0; j < maxPow; j++) {
  112.  
  113.  
  114. if (j != 0) step = step / 2;
  115. for (int i = 0; i < (n - 1) * pow(2, j) + 1; i++) {
  116. x[i] = a + step * i;
  117. }
  118. MoveToEx(hDC, centreX + coefgor * (a), centreY - coefver * countExact(x[0],nu1,nu2,1), NULL);
  119.  
  120. for (int i = 1; i < (n - 1) * pow(2, j) + 1; i++) {
  121.  
  122. y[i] = (step * (-500) + 1) * y[i - 1] - 495* step * yy[i - 1];
  123. yy[i] = (-495) * step * y[i - 1] + ((-500) * step + 1) * yy[i - 1];
  124. LineTo(hDC, centreX + coefgor * x[i], centreY - coefver * countExact(x[i], nu1, nu2, 1));
  125. /*printf("i= %i", i);
  126. printf(" locEps= %.15f", countlocEps(x[i], y[i]));
  127. printf(" absEps=%.15f", countabsEps(x[i], y[i]));*/
  128.  
  129. if (maxLocEps < abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)))) maxLocEps = abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)));
  130.  
  131.  
  132. }
  133.  
  134. /*printf(" RungEps=%.15f ", RungEps);
  135. printf("\n");*/
  136. if (j != 0) {
  137. pz = (log((maxLocEpsOld) / (maxLocEps))) / log(2);
  138. printf("pZ=%.15f ", pz);
  139. }
  140. printf(" maxLocEps=%.15f", maxLocEps);
  141. /*if (j != 0) {
  142. delta = abs(maxOldEps - maxEps);
  143. printf(" delta=%.15f ", delta);
  144. printf(" h=%.15f ", step);
  145. }*/
  146. maxLocEpsOld = maxLocEps;
  147. maxOldEps = maxEps;
  148. maxAbsEps = 0;
  149. maxLocEps = 0;
  150. maxEps = 0;
  151. RungEps = 0;
  152. printf("\n");
  153.  
  154.  
  155. }
  156. return (0);
  157. }
  158. long double eulerNot(long double* x, long double nu1, long double nu2, int n) {
  159. SelectObject(hDC, Pen);
  160. long double maxAbsEps = 0, maxLocEps = 0, maxLocEpsOld = 0;
  161. long double maxEps = 0, maxOldEps = 0, RungEps = 0;
  162. long double delta1, delta2, c1, c2, c3, c4;
  163. y = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
  164. yy = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
  165. y[0] = nu1;
  166. yy[0] = nu2;
  167. step = (b - a) / (n - 1);
  168. for (int j = 0; j < maxPow; j++) {
  169.  
  170.  
  171. if (j != 0) step = step / 2;
  172. for (int i = 0; i < (n - 1) * pow(2, j) + 1; i++) {
  173. x[i] = a + step * i;
  174. }
  175. MoveToEx(hDC, centreX + coefgor * (a), centreY - coefver * countExact(x[0], nu1, nu2, 1), NULL);
  176.  
  177. delta2 = 1/(4975 * step * step + 1000 * step + 1);
  178.  
  179. c3 = 1 + 500 * step;
  180. c4 = (-495) * step;
  181. for (int i = 1; i < (n - 1) * pow(2, j) + 1; i++) {
  182.  
  183. y[i] = delta2 * (c3 * y[i - 1] + c4 * yy[i - 1]);
  184. yy[i] = delta2 * (c4 * y[i - 1] + c3 * yy[i - 1]);
  185.  
  186. LineTo(hDC, centreX + coefgor * x[i], centreY - coefver * countExact(x[i], nu1, nu2, 1));
  187. /*printf("i= %i", i);
  188. printf(" locEps= %.15f", countlocEps(x[i], y[i]));
  189. printf(" absEps=%.15f", countabsEps(x[i], y[i]));*/
  190.  
  191. if (maxLocEps < abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)))) maxLocEps = abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)));
  192.  
  193.  
  194. }
  195.  
  196. /*printf(" RungEps=%.15f ", RungEps);
  197. printf("\n");*/
  198. if (j != 0) {
  199. pz = (log((maxLocEpsOld) / (maxLocEps))) / log(2);
  200. printf("pZ=%.15f ", pz);
  201. }
  202. printf(" maxLocEps=%.15f", maxLocEps);
  203. /*if (j != 0) {
  204. delta = abs(maxOldEps - maxEps);
  205. printf(" delta=%.15f ", delta);
  206. printf(" h=%.15f ", step);
  207. }*/
  208. maxLocEpsOld = maxLocEps;
  209. maxOldEps = maxEps;
  210. maxAbsEps = 0;
  211. maxLocEps = 0;
  212. maxEps = 0;
  213. RungEps = 0;
  214. printf("\n");
  215.  
  216.  
  217. }
  218. return (0);
  219. }
  220. long double gear(long double* x, long double nu1, long double nu2, int n) {
  221. SelectObject(hDC, Pen);
  222. long double maxAbsEps = 0, maxLocEps = 0, maxLocEpsOld = 0, maxLoc1Eps = 0, maxLoc2Eps = 0;
  223. long double maxEps = 0, maxOldEps = 0, RungEps = 0;
  224. long double delta1,delta2,c1,c2,c3,c4;
  225. y = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
  226. yy = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
  227. y[0] = nu1;
  228. yy[0] = nu2;
  229. step = (b - a) / (n - 1);
  230.  
  231. for (int j = 0; j < maxPow; j++) {
  232.  
  233.  
  234. if (j != 0) step = step / 2;
  235. for (int i = 0; i < (n - 1) * pow(2, j) + 1; i++) {
  236. x[i] = a + step * i;
  237. }
  238. MoveToEx(hDC, centreX + coefgor * (a), centreY - coefver * y[0], NULL);
  239. delta1 = 1/(716400 * step * step + 300000 * step + 625);
  240. delta2 = 1/(4975 * step * step + 1000 * step + 1);
  241. c1 = 25 + 12 * 500 * step;
  242. c2 = (-12) * 495 * step;
  243. c3 = 1 + 500 * step;
  244. c4= (-495) * step;
  245. for (int i = 1; i < (n - 1) * pow(2, j) + 1; i++) {
  246.  
  247. if (i <= 3) {
  248. y[i] = delta2*(c3*y[i-1]+c4*yy[i-1]);
  249. yy[i] = delta2*(c4* y[i - 1] + c3 * yy[i - 1]);
  250.  
  251. }
  252.  
  253. else if (i > 3) {
  254.  
  255. y[i] = delta1*(48*(c1*y[i-1]+c2*yy[i-1])-36*(c1 * y[i - 2] + c2 * yy[i - 2])+16* (c1 * y[i - 3] + c2 * yy[i - 3])-3*(c1 * y[i - 4] + c2 * yy[i - 4]));
  256. yy[i] = delta1 * (48 * (c2 * y[i - 1] + c1 * yy[i - 1]) - 36 * (c2 * y[i - 2] + c1 * yy[i - 2]) + 16 * (c2* y[i - 3] + c1 * yy[i - 3]) - 3 * (c2 * y[i - 4] + c1 * yy[i - 4]));
  257. }
  258. LineTo(hDC, centreX + coefgor * x[i], centreY - coefver * y[i]);
  259. /*printf("i= %i", i);
  260. printf(" locEps= %.15f", countlocEps(x[i], y[i]));
  261. printf(" absEps=%.15f", countabsEps(x[i], y[i]));*/
  262.  
  263. if (maxLocEps < abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)))) maxLocEps = abs(abs(y[i]) - abs(countExact(x[i], nu1, nu2, 0))) + abs(abs(yy[i]) - abs(countExact(x[i], nu1, nu2, 1)));
  264. if (maxLoc1Eps < abs(delta1 * (48 * (c1 * y[i - 1]) - 36 * (c1 * y[i - 2] ) + 16 * (c1 * y[i - 3] ) - 3 * (c1 * y[i - 4] )))) maxLoc1Eps = abs(delta1 * (48 * (c1 * y[i - 1]) - 36 * (c1 * y[i - 2]) + 16 * (c1 * y[i - 3]) - 3 * (c1 * y[i - 4])));
  265. if (maxLoc2Eps < abs(delta1 * (48 * (c2 * yy[i - 1]) - 36 * ( c2 * yy[i - 2]) + 16 * (c2 * yy[i - 3]) - 3 * (c2 * yy[i - 4])))) maxLoc2Eps = abs(delta1 * (48 * (c2 * yy[i - 1]) - 36 * (c2 * yy[i - 2]) + 16 * (c2 * yy[i - 3]) - 3 * (c2 * yy[i - 4])));
  266. }
  267.  
  268. /*printf(" RungEps=%.15f ", RungEps);
  269. printf("\n");*/
  270. if (j != 0) {
  271. pz = (log((maxLocEpsOld) / (maxLocEps))) / log(2);
  272. printf("pZ=%.15f ", pz);
  273. }
  274. //printf(" maxLocEps=%.15f", maxLocEps);
  275. printf(" maxLoc1Eps=%.15f", maxLoc1Eps);
  276. printf(" maxLoc2Eps=%.15f", maxLoc2Eps);
  277. /*if (j != 0) {
  278. delta = abs(maxOldEps - maxEps);
  279. printf(" delta=%.15f ", delta);
  280. printf(" h=%.15f ", step);
  281. }*/
  282. maxLocEpsOld = maxLocEps;
  283. maxOldEps = maxEps;
  284. maxAbsEps = 0;
  285. maxLocEps = 0;
  286. maxLoc1Eps = 0;
  287. maxLoc2Eps = 0;
  288. maxEps = 0;
  289. RungEps = 0;
  290. printf("\n");
  291.  
  292.  
  293. }
  294. return (0);
  295. }
  296.  
  297.  
  298.  
  299. void Coord()
  300. {
  301.  
  302. SelectObject(hDC, PenCoord);
  303. MoveToEx(hDC, centreX - coefgor * 50, centreY, NULL);
  304. LineTo(hDC, centreX + coefgor * 100, centreY);
  305. MoveToEx(hDC, centreX, centreY - coefver * 50, NULL);
  306. LineTo(hDC, centreX, centreY + coefver * 1000);
  307.  
  308. SetBkMode(hDC, TRANSPARENT);
  309. SetTextColor(hDC, RGB(255, 255, 255));
  310.  
  311. //TextOut(hDC, centreX - 4, centreY + 2, textright, ARRAYSIZE(textright));
  312.  
  313. MoveToEx(hDC, centreX, centreY, NULL);
  314. for (int t = 0; t < 20; t++) {
  315.  
  316. drawVer(centreX + coefgor * (t), centreY);
  317. {if (t == 0) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "0", 1);
  318. if (t == 1) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "1", 1);
  319. if (t == 2) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "2", 1);
  320. if (t == 3) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "3", 1);
  321. if (t == 4) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "4", 1);
  322. if (t == 5) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "5", 1);
  323. if (t == 6) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "6", 1);
  324. if (t == 7) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "7", 1);
  325. if (t == 8) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "8", 1);
  326. if (t == 9) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "9", 1);
  327. if (t == 10) TextOut(hDC, centreX - 4 + coefgor * (t), centreY + 4, "10", 2); }
  328. }
  329. MoveToEx(hDC, centreX, centreY, NULL);
  330. for (int t = 0; t < 10; t++) {
  331. drawHor(centreX, centreY + coefver * (t));
  332. }
  333. MoveToEx(hDC, centreX, centreY, NULL);
  334. for (int l = 0; l < 20; l++) {
  335. drawVer(centreX - coefgor * (l), centreY);
  336. }
  337. MoveToEx(hDC, centreX, centreY, NULL);
  338. for (int t = 0; t < 10; t++) {
  339. drawHor(centreX, centreY - coefver * (t));
  340. {if (t == 1) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "1", 1);
  341. if (t == 2) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "2", 1);
  342. if (t == 3) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "3", 1);
  343. if (t == 4) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "4", 1);
  344. if (t == 5) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "5", 1);
  345. if (t == 6) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "6", 1);
  346. if (t == 7) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "7", 1);
  347. if (t == 8) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "8", 1);
  348. if (t == 9) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "9", 1);
  349. if (t == 10) TextOut(hDC, centreX + 4, centreY - coefver * (t)-8, "10", 2); }
  350. }
  351.  
  352. }
  353.  
  354. void main() {
  355.  
  356.  
  357. int n;
  358.  
  359. printf("N: ");
  360. scanf_s("%i", &n);
  361.  
  362. long double nu1 = 0;
  363. long double nu2 = 1;
  364.  
  365.  
  366. x = (long double*)malloc(sizeof(long double) * (n * pow(2, maxPow)));
  367.  
  368.  
  369.  
  370. Coord();
  371.  
  372. //euler(x, nu1, nu2, n);
  373. //eulerNot(x, nu1, nu2, n);
  374. gear(x, nu1,nu2, n);
  375.  
  376. //drawOrigin(50, nu);
  377.  
  378. _getch();
  379. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement