Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.96 KB | None | 0 0
  1. // ConsoleApplication15.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <math.h>
  7.  
  8. using namespace std;
  9.  
  10. double Analiticfunc(double x) {
  11. return pow(x,2);
  12. }
  13.  
  14. double* x(int n, double h, double a) {
  15. double *x = new double[n];
  16. for (int i = 0; i <= n; i++)
  17. x[i] = a + i*h;
  18. return x;
  19. }
  20.  
  21. double RLeftrest(int n, double a, double b, double *y) {
  22. double I = 0, k;
  23. double h = (b - a) / h;
  24. for (int i = 0; i <= n - 1; i++)
  25. if (y != NULL) I += y[i];
  26. else I += Analiticfunc();
  27. k = I*h;
  28. return k;
  29. }
  30.  
  31. double Leftrest(int n, double *x, double *y) {
  32. double I = 0;
  33. double *h = new double[n];
  34. for (int i = 0; i <= n; i++)
  35. h[i] = x[i + 1] - x[i];
  36. for (int i = 0; i <= n - 1; i++)
  37. I += y[i] * h[i];
  38. return I;
  39. }
  40.  
  41. double RRightrest(int n, double *x, double *y) {
  42. double I = 0;
  43. double *h = new double[n];
  44. for (int i = 0; i <= n; i++)
  45. h[i] = x[i + 1] - x[i];
  46. for (int i = 1; i <= n; i++)
  47. I += y[i];
  48. return I *= h[0];
  49. }
  50.  
  51. double Rightrest(int n, double *x, double *y) {
  52. double I = 0;
  53. double *h = new double[n];
  54. for (int i = 0; i <= n; i++)
  55. h[i] = x[i + 1] - x[i];
  56. for (int i = 0; i <= n - 1; i++)
  57. I += y[i + 1] * h[i];
  58. return I;
  59. }
  60.  
  61. double RTrapeze(int n, double *x, double *y) {
  62. double I, z = 0;
  63. double *h = new double[n];
  64. for (int i = 0; i <= n; i++)
  65. h[i] = x[i + 1] - x[i];
  66. for (int i = 1; i <= n - 1; i++)
  67. z += y[i];
  68. I = h[0] * (y[0] + 2 * z + y[n]) / 2;
  69. return I;
  70. }
  71.  
  72. double Trapeze(int n, double *x, double *y) {
  73. double I, z = 0;
  74. double *h = new double[n];
  75. for (int i = 0; i <= n; i++)
  76. h[i] = x[i + 1] - x[i];
  77. for (int i = 1; i <= n - 1; i++)
  78. z += y[i] * (h[i - 1] + h[i]);
  79. I = (y[0] * h[0] + z + y[n] * h[n - 1]) / 2;
  80. return I;
  81. }
  82.  
  83. double RSimpsone(int n, double *x, double *y) {
  84. double I;
  85. double m = (double)(n / 2);
  86. double *h = new double[n];
  87. for (int i = 0; i <= n; i++)
  88. h[i] = x[i + 1] - x[i];
  89. double z = 0, s = 0;
  90. for (int i = 0; i <= m - 1; i++)
  91. z += y[2 * i + 1];
  92. for (int i = 1; i <= m - 1; i++)
  93. s += y[2 * i];
  94. I = (2 * h[0] / 6)*(y[0] + 4 * z + 2 * s + y[2 * (int)m]);
  95. return I;
  96. }
  97.  
  98. double Simpsone(int n, double *x, double *y) {
  99. double I = 0;
  100. int m = n / 2 - 1;
  101. double *h = new double[n];
  102. for (int i = 0; i <= n; i++)
  103. h[i] = x[i + 1] - x[i];
  104. for (int i = 0; i <= m; i++)
  105. I += ((h[2 * i + 1] + h[2 * i]) / (6 * h[2 * i + 1] * h[2 * i]))*(h[2 * i + 1] * (2 * h[2 * i] - h[2 * i + 1])*y[2 * i] + pow(h[2 * i + 1] + h[2 * i], 2)*y[2 * i + 1] + h[2 * i] * (2 * h[2 * i + 1] - h[2 * i])*y[2 * i + 2]);
  106. return I;
  107. }
  108.  
  109. void Rav(int n, int numb) {
  110. double a, b, h;
  111. int s;
  112. cout << "Введите границы отрезка: ";
  113. cin >> a >> b;
  114. h = (double)((b - a) / n);
  115. double *x = new double[n];
  116. for (int i = 0; i <= n; i++)
  117. x[i] = a + i*h;
  118. cout << endl << "Способ задания функции:" << endl << " 1 - табличная" << endl << " 2 - аналитическая ";
  119. cin >> s;
  120. switch (s) {
  121. case 1: {
  122. double *y = new double[n];
  123. cout << "Введите значения функции в узлах сетки: ";
  124. for (int i = 0; i <= n; i++) {
  125. cout << "y[" << i << "] ";
  126. cin >> y[i];
  127. }
  128. cout << endl << "Значение интеграла: ";
  129. switch (numb) {
  130. case 1: cout << RLeftrest(n, x, y);
  131. break;
  132. case 2: cout << RRightrest(n, x, y);
  133. break;
  134. case 3: cout << RTrapeze(n, x, y);
  135. break;
  136. case 4: cout << RSimpsone(n, x, y);
  137. break;
  138. }
  139. } break;
  140. case 2: {
  141. cout << endl << "Значение интеграла: ";
  142. switch (numb) {
  143. case 1: cout << RLeftrest(n, x, NULL);
  144. break;
  145. case 2: cout << RRightrest(n, x, NULL);
  146. break;
  147. case 3: cout << RTrapeze(n, x, NULL);
  148. break;
  149. case 4: cout << RSimpsone(n, x, NULL);
  150. break;
  151. }
  152. } break;
  153. }
  154. }
  155.  
  156. void neRav(int n, int numb) {
  157. double *x = new double[n];
  158. cout << "Введите узлы сетки: ";
  159. for (int i = 0; i <= n; i++) {
  160. cout << "x[" << i << "] ";
  161. cin >> x[i];
  162. }
  163. int s;
  164. cout << endl << "Способ задания функции:" << endl << " 1 - табличная" << endl << " 2 - аналитическая ";
  165. cin >> s;
  166. switch (s) {
  167. case 1: {
  168. double *y = new double[n];
  169. cout << "Введите значения функции в узлах сетки: ";
  170. for (int i = 0; i <= n; i++) {
  171. cout << "y[" << i << "] ";
  172. cin >> y[i];
  173. }
  174. cout << endl << "Значение интеграла: ";
  175. switch (numb) {
  176. case 1: cout << Leftrest(n, x, y);
  177. break;
  178. case 2: cout << Rightrest(n, x, y);
  179. break;
  180. case 3: cout << Trapeze(n, x, y);
  181. break;
  182. case 4: cout << Simpsone(n, x, y);
  183. break;
  184. }
  185. } break;
  186. case 2: {
  187. cout << endl << "Значение интеграла: ";
  188. switch (numb) {
  189. case 1: cout << Leftrest(n, x, Analiticfunc(n, x));
  190. break;
  191. case 2: cout << Rightrest(n, x, Analiticfunc(n, x));
  192. break;
  193. case 3: cout << Trapeze(n, x, Analiticfunc(n, x));
  194. break;
  195. case 4: cout << Simpsone(n, x, Analiticfunc(n, x));
  196. break;
  197. }
  198. } break;
  199. }
  200. }
  201.  
  202. void Dinamic(int n, int numb) {
  203. int k = 1, q = 2, n1;
  204. double e, I, I1, d;
  205. double a, b, h, h1;
  206. n1 = q*n;
  207. cout << "Введите границы отрезка: ";
  208. cin >> a >> b;
  209. h = (double)((b - a) / n);
  210. h1 = (double)((b - a) / n1);
  211. cout << endl << "Введите точность вычисления интеграла: ";
  212. cin >> e;
  213. switch (numb) {
  214. case 1: {
  215. I = RLeftrest(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
  216. I1 = RLeftrest(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
  217. } break;
  218. case 2: {
  219. I = RRightrest(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
  220. I1 = RRightrest(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
  221. } break;
  222. case 3: {
  223. I = RTrapeze(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
  224. I1 = RTrapeze(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
  225. } break;
  226. case 4: {
  227. I = RSimpsone(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
  228. I1 = RSimpsone(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
  229. } break;
  230. default: break;
  231. }
  232. for (; abs((I1 - I) / I1) > e;) {
  233. n = n1;
  234. n1 = n*q;
  235. h = (double)((b - a) / n);
  236. h1 = (double)((b - a) / n1);
  237. if (numb == 1) {
  238. I = RLeftrest(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
  239. I1 = RLeftrest(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
  240. }
  241. if (numb == 2) {
  242. I = RRightrest(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
  243. I1 = RRightrest(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
  244. }
  245. if (numb == 3) {
  246. I = RTrapeze(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
  247. I1 = RTrapeze(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
  248. }
  249. if (numb == 4) {
  250. I = RSimpsone(n, x(n, h, a), Analiticfunc(n, x(n, h, a)));
  251. I1 = RSimpsone(n1, x(n1, h1, a), Analiticfunc(n1, x(n1, h1, a)));
  252. }
  253. k++;
  254. }
  255. d = abs((I1 - I) / I1);
  256. cout << "Значение интеграла: " << I1 << endl;
  257. cout << "Количество итераций: " << k << endl;
  258. cout << "Достигнутая точность: " << d << endl;
  259. }
  260.  
  261. int main()
  262. {
  263. setlocale(LC_ALL, "ru");
  264. int numb;
  265. cout << "Выберите формулу интегрирования:" << endl << " 1 - левосторонний прямоугольник" << endl << " 2 - правосторонний прямоугольник" << endl << " 3 - трапеция" << endl << " 4 - формула Симпсона ";
  266. cin >> numb;
  267. int m, n;
  268. cout << "Количество интервалов интегрирования (для формулы Симпсона n должна быть кратна 2): ";
  269. cin >> n;
  270. cout << "Выберите тип сетки:" << endl << " 1 - равномерная" << endl << " 2 - неравномерная" << endl << " 3 - динамическая ";
  271. cin >> m;
  272. switch (m) {
  273. case 1: Rav(n, numb);
  274. break;
  275. case 2: neRav(n, numb);
  276. break;
  277. case 3: Dinamic(n, numb);
  278. break;
  279. }
  280. cout << endl;
  281. system("pause");
  282. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement