Advertisement
Guest User

Untitled

a guest
May 27th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.23 KB | None | 0 0
  1. #include <iostream>
  2. #include<cmath>
  3. #include<iomanip>
  4. #include<windows.h>
  5. #include<stdio.h>
  6. #include<fstream>
  7.  
  8.  
  9. using namespace std;
  10.  
  11. double funPME(double yk1, double yk, double dt, double tk)
  12. {
  13. return (yk1 - yk) / dt + (10 * tk * tk + 20) / (tk * tk + 1) * (yk1 - 1);
  14. }
  15.  
  16. double funPMT(double yk1, double yk, double dt, double tk)
  17. {
  18. return ((yk1 - yk) / dt) - (-1 * (((10 * tk * tk + 20) / (tk * tk + 1)) * (yk - 1)) - (10 * (tk + dt) * (tk + dt) + 20) / ((tk + dt) * (tk + dt) + 1) * (yk1 - 1)) / 2;
  19. }
  20.  
  21. double fun(double tk, double yk)
  22. {
  23. return -1 * ((10 * tk * tk + 20) / (tk * tk + 1) * (yk - 1));
  24. }
  25.  
  26. double CorrecrValue(double tk)
  27. {
  28. return 1 - exp( -10 * (tk + atan(tk)));
  29. }
  30.  
  31. double bisekcja(double a, double b, double tolerance, double yk, double dt, double tk, int ops = 2)
  32. {
  33. double tmp, znak[2] = {0, 0}, f[2], ftmp, x, fx;
  34. int i = 0;
  35.  
  36. //printf("\nMetoda Bisekcji.\n");
  37.  
  38. f[0] = funPME(a, yk, dt, tk);
  39. f[1] = funPME(b, yk, dt, tk);
  40.  
  41. x = (a + b) / 2; //przyblizenie pierwiastka
  42. tmp = (fabs(b - a)) / 2; //estymator bledu
  43. fx = funPME(x, yk, dt, tk); //wartosc funkcji w punkcie podzialu
  44.  
  45. if (f[0] < 0) znak[0] = -1;
  46. else if (f[0] > 0) znak[0] = 1;
  47.  
  48. if (f[1] < 0) znak[1] = -1;
  49. else if (f[1] > 0) znak[1] = 1;
  50.  
  51. if (znak[0] != znak[1])
  52. {
  53.  
  54. switch(ops)
  55. {
  56. case 0:
  57. {
  58. cout << "Kryterium estymatora bledu\n";
  59.  
  60. // while (fabs(tmp) > est)
  61. {
  62. tmp = ( b - a) / 2; //estymator bledu
  63. ftmp = funPME(tmp, yk, dt, tk);
  64. x = (a + b) / 2; //kolejne przyblizenia
  65. fx = funPME(x, yk, dt, tk);
  66. if (fx > 0)
  67. {
  68. if (f[0] < 0) b = x;
  69. else if (f[1] < 0) a = x;
  70. }
  71.  
  72. else if (fx < 0)
  73. {
  74. if (f[0] > 0) b = x;
  75. else if (f[1] > 0) a = x;
  76. }
  77. cout<<"x"<<i++<<" = "<<x;
  78. cout<<"\t estymator: "<<fabs(tmp)<<endl;
  79.  
  80.  
  81. }
  82. }break;
  83.  
  84. case 1:
  85. {
  86. cout<<"Kryterium ograniczenia iteracji\n";
  87.  
  88. //while (i++ < n)
  89. {
  90.  
  91. x = (a + b) / 2;
  92. fx = funPME(x, yk, dt, tk);
  93.  
  94. if (fx > 0)
  95. {
  96. if (f[0] < 0) b = x;
  97. else if (f[1] < 0) a = x;
  98. }
  99.  
  100. else if (fx < 0)
  101. {
  102. if (f[0] > 0) b = x;
  103. else if (f[1] > 0) a = x;
  104. }
  105. cout<<"x"<<i<<" = "<<x<<endl;
  106.  
  107. }
  108. }break;
  109.  
  110. case 2:
  111. {
  112. //cout << "Kryterium wiarygodnosci przyblizenia pierwiastka\n";
  113.  
  114. while (fabs(funPME(x, yk, dt, tk)) > tolerance)
  115. {
  116.  
  117. x = (a + b) / 2;
  118. fx = funPME(x, yk, dt, tk);
  119.  
  120. if (fx > 0)
  121. {
  122. if (f[0] < 0) b = x;
  123. else if (f[1] < 0) a = x;
  124. }
  125.  
  126. else if (fx < 0)
  127. {
  128. if (f[0] > 0) b = x;
  129. else if (f[1] > 0) a = x;
  130. }
  131. //cout<<"x"<<i++<<" = "<<x;
  132. //cout<<"\tResiduum rownania: "<<fabs(funPME(x, yk, dt, tk))<<endl;
  133.  
  134. }
  135. }break;
  136.  
  137. default:
  138. {
  139. printf("Bledny numer, program zostanie zakonczony\n");
  140. exit(0);
  141. }break;
  142. }
  143. }
  144. return x;
  145. }
  146.  
  147. double bisekcja2(double a, double b, double tolerance, double yk, double dt, double tk, int ops = 2)
  148. {
  149. double tmp, znak[2] = {0, 0}, f[2], ftmp, x, fx;
  150. int i = 0;
  151. ops = 2;
  152.  
  153. //printf("\nMetoda Bisekcji.\n");
  154.  
  155. f[0] = funPMT(a, yk, dt, tk);
  156. f[1] = funPMT(b, yk, dt, tk);
  157.  
  158. x = (a + b) / 2; //przyblizenie pierwiastka
  159. tmp = (fabs(b - a)) / 2; //estymator bledu
  160. fx = funPMT(x, yk, dt, tk); //wartosc funkcji w punkcie podzialu
  161.  
  162. if (f[0] < 0) znak[0] = -1;
  163. else if (f[0] > 0) znak[0] = 1;
  164.  
  165. if (f[1] < 0) znak[1] = -1;
  166. else if (f[1] > 0) znak[1] = 1;
  167.  
  168.  
  169. if (znak[0] != znak[1])
  170. {
  171.  
  172. switch(ops)
  173. {
  174. case 0:
  175. {
  176. cout << "Kryterium estymatora bledu\n";
  177.  
  178. // while (fabs(tmp) > est)
  179. {
  180. tmp = ( b - a) / 2; //estymator bledu
  181. ftmp = funPME(tmp, yk, dt, tk);
  182. x = (a + b) / 2; //kolejne przyblizenia
  183. fx = funPME(x, yk, dt, tk);
  184. if (fx > 0)
  185. {
  186. if (f[0] < 0) b = x;
  187. else if (f[1] < 0) a = x;
  188. }
  189.  
  190. else if (fx < 0)
  191. {
  192. if (f[0] > 0) b = x;
  193. else if (f[1] > 0) a = x;
  194. }
  195. cout<<"x"<<i++<<" = "<<x;
  196. cout<<"\t estymator: "<<fabs(tmp)<<endl;
  197.  
  198.  
  199. }
  200. }break;
  201.  
  202. case 1:
  203. {
  204. cout<<"Kryterium ograniczenia iteracji\n";
  205.  
  206. //while (i++ < n)
  207. {
  208.  
  209. x = (a + b) / 2;
  210. fx = funPME(x, yk, dt, tk);
  211.  
  212. if (fx > 0)
  213. {
  214. if (f[0] < 0) b = x;
  215. else if (f[1] < 0) a = x;
  216. }
  217.  
  218. else if (fx < 0)
  219. {
  220. if (f[0] > 0) b = x;
  221. else if (f[1] > 0) a = x;
  222. }
  223. cout<<"x"<<i<<" = "<<x<<endl;
  224.  
  225. }
  226. }break;
  227.  
  228. case 2:
  229. {
  230. //cout << "Kryterium wiarygodnosci przyblizenia pierwiastka\n";
  231. while (fabs(funPMT(x, yk, dt, tk)) > tolerance)
  232. {
  233.  
  234. x = (a + b) / 2;
  235. fx = funPMT(x, yk, dt, tk);
  236.  
  237. if (fx > 0)
  238. {
  239. if (f[0] < 0) b = x;
  240. else if (f[1] < 0) a = x;
  241. }
  242.  
  243. else if (fx < 0)
  244. {
  245. if (f[0] > 0) b = x;
  246. else if (f[1] > 0) a = x;
  247. }
  248. //cout<<"x"<<i++<<" = "<<x;
  249. //cout<<"\tResiduum rownania: "<<fabs(funPME(x, yk, dt, tk))<<endl;
  250.  
  251. }
  252. }break;
  253.  
  254. default:
  255. {
  256. printf("Bledny numer, program zostanie zakonczony\n");
  257. exit(0);
  258. }break;
  259. }
  260. }
  261. return x;
  262. }
  263.  
  264.  
  265. void BME(double yk, double dt)
  266. {
  267. fstream file, file2;
  268.  
  269. file.open("BME_Stabilna.txt");
  270. file2.open("BME_blad.txt");
  271.  
  272. file << "t\tyk\ty(t)\n";
  273. file2 << "log10|t|\t\tlog10|blad|\n";
  274.  
  275. double tk = 0.0 + dt, yk1 = 0;
  276. int i = 0;
  277.  
  278. while (i++ < 100)
  279. {
  280. yk1 = yk + fun(tk, yk) * dt;
  281. yk = yk1;
  282. tk += dt;
  283. cout << "przyblizenie nr "<< i << " = " << yk1 << endl;
  284. cout << "Dokladna wartosc w wezle = " << CorrecrValue(tk) << endl;
  285. cout << "Wezel przyblizenia tk = " << tk << endl;
  286. cout << "Blad przyblizenia = " << fabs(CorrecrValue(tk) - yk) << endl;
  287. cout << endl;
  288.  
  289. file << tk << "\t" << CorrecrValue(tk) << endl;//"\t" << CorrecrValue(tk) << endl;
  290. file2 << log10(tk) << "\t\t" << log10(fabs(CorrecrValue(tk) - yk)) << endl;
  291. }
  292.  
  293. file.close();
  294. file2.close();
  295. }
  296.  
  297. void PME(double yk, double dt)
  298. {
  299. double tk = 0.0 + dt, yk1 = 1;
  300. int i = 0;
  301. fstream file, file2;
  302.  
  303. file.open("PME.txt");
  304. file2.open("PME_blad.txt");
  305. file2 << "log10|t|\t\tlog10|blad|\n";
  306.  
  307. file << "t\ty(t)\t\tyt\n";
  308.  
  309.  
  310. for (i = 0; i < 100; i++)
  311. {
  312. yk1 = bisekcja(-189.0, 231.0, 1e-12, yk, dt, tk);
  313. cout << "Przyblizenie nr " << i + 1 << " Wynosi: " << yk1 << endl;
  314. cout << "Dokladna wartosc w wezle = " << CorrecrValue(tk) << endl;
  315. cout << "Blad przyblizenia = " << fabs(CorrecrValue(tk) - yk1) << endl;
  316. cout << "Residuum rownania nieliniowego wynosi = " << fabs(funPME(yk1, yk, dt, tk)) << endl;
  317. cout << "Wezel: " << tk << endl << endl;
  318.  
  319. file << setw(6) << tk << "\t" << CorrecrValue(tk) << endl;
  320. file2 << log10(tk) << "\t\t" << log10(fabs(CorrecrValue(tk) - yk)) << endl;
  321.  
  322. yk = yk1;
  323. tk += dt;
  324.  
  325.  
  326. }
  327.  
  328. file.close();
  329. file2.close();
  330. }
  331.  
  332. void PMT(double yk, double dt)
  333. {
  334. double tk = 0.0 + dt, yk1 = 1;
  335. int i = 0;
  336. fstream file, file2;
  337.  
  338. file.open("PMT.txt");
  339. file2.open("PMT_blad.txt");
  340.  
  341. file << "t\ty(t)\t\tyt\n";
  342. file2 << "log10|t|\t\tlog10|blad|\n";
  343.  
  344. for (i = 0; i < 100; i++)
  345. {
  346. yk1 = bisekcja2(-137.0, 230.0, 1e-12, yk, dt, tk);
  347. cout << "Przyblizenie nr " << i + 1 << " Wynosi: " << yk1 << endl;
  348. cout << "Dokladna wartosc w wezle = " << CorrecrValue(tk) << endl;
  349. cout << "Blad przyblizenia = " << fabs(CorrecrValue(tk) - yk1) << endl;
  350. cout << "Residuum rownania nieliniowego wynosi = " << fabs(funPMT(yk1, yk, dt, tk)) << endl;
  351. cout << "Wezel: " << CorrecrValue(tk) << endl << endl;
  352.  
  353. file << setw(6) << tk << "\t" << yk1 << endl;
  354. file2 << log10(tk) << "\t\t" << log10(fabs(CorrecrValue(tk) - yk)) << endl;
  355.  
  356. yk = yk1;
  357. tk += dt;
  358.  
  359.  
  360. }
  361. file.close();
  362. file2.close();
  363. }
  364.  
  365. int main()
  366. {
  367. double y = 0.0, dt = 0.0001;
  368.  
  369. cout << "Bezposrednia Metoda Eulera: \n";
  370. BME(y, dt);
  371.  
  372. cout << "Posrednia Metoda Eulera: \n";
  373. PME(y, dt);
  374.  
  375. cout << "Posrednia Metoda Trapezow: \n";
  376. PMT(y, dt);
  377.  
  378.  
  379. return 0;
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement