Advertisement
Guest User

Untitled

a guest
Dec 14th, 2018
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.62 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include "stdafx.h"
  3. #include "iostream"
  4. #include "complex"
  5. #include "math.h"
  6.  
  7. int k = 0;
  8. using namespace std;
  9. const double epsi = 0.00005;
  10. const int degree = 5;
  11. int iteration = 0;
  12. int counting = 0;
  13. complex<double> root[degree];
  14. complex<double> first_kf[degree + 1] = { complex<double>(0, 1), complex<double>(14, 0), complex<double>(1, 0), complex<double>(18, 0), complex<double>(12, 0), complex<double>(6, 0)};
  15. complex<double> kf[degree + 1] = { complex<double>(0, 1), complex<double>(14, 0), complex<double>(1, 0), complex<double>(18, 0), complex<double>(12, 0), complex<double>(6, 0) };
  16. complex<double> kfDx[degree + 1];// = { complex<double>(14, 0), complex<double>(2, 0), complex<double>(54 , 0), complex<double>(48, 0), complex<double>(30, 0), complex<double>(78, 0), complex<double>(112, 0), complex<double>(24, 0), complex<double>(9, 0) };
  17.  
  18. complex<double> f(complex<double> x, complex<double> kf[degree + 1])
  19. {
  20. complex<double> ans = 0;
  21. for (int i = 0; i < degree + 1; i++) {
  22. ans = ans + kf[i] * pow(x, i);
  23. }
  24. return ans;
  25. }
  26.  
  27. double maximum(complex<double> kf[degree + 1]) {
  28. double max = abs(kf[0].real());
  29. for (int i = 0; i < degree + 1; i++) {
  30. if (abs(kf[i].real()) > max) max = abs(kf[i].real());
  31. }
  32. return max;
  33. }
  34.  
  35. double maximum_degree(complex<double> kf[degree + 1]) {
  36. int i = degree;
  37. while(kf[i] == complex<double>(0,0))
  38. {
  39. i--;
  40. }
  41. return abs(kf[i].real());
  42. }
  43.  
  44. complex<double> grad(complex<double> z, complex<double> kf[degree + 1], complex<double> kfDx[degree + 1]) {
  45. complex<double> Pz = f(z,kf);
  46. complex<double> Pzconj = conj(Pz);
  47. complex<double> PzDx = f(z,kfDx);
  48. complex<double> gr = Pzconj * PzDx;
  49. return (conj(gr));
  50. }
  51.  
  52. void new_kfDx(complex<double> kf[degree + 1]) {
  53. for (int j = 0; j < degree; j++) {
  54. kfDx[j] = kf[j+1] * double(j+1);
  55. }
  56. }
  57.  
  58. double lip(complex<double> kf[degree + 1]) {
  59. double L;
  60. double xx = 1 + maximum_degree(kf) / maximum(kf);
  61. new_kfDx(kf);
  62. L = pow(f(complex<double>(xx, 0), kfDx).real(), 2);
  63. new_kfDx(kfDx);
  64. L = (round(L + f(complex<double>(xx, 0), kf).real() * f(complex<double>(xx, 0), kfDx).real()));
  65. return L;
  66. }
  67.  
  68. void Gorner(complex<double> x, complex<double> kf[degree + 1]) {
  69. for (int i = degree - 1; i >= 0; i--) {
  70. kf[i] = kf[i] + x * kf[i + 1];
  71. }
  72. for (int i = 0; i < degree; i++) {
  73. kf[i] = kf[i + 1];
  74. }
  75. kf[degree] = 0;
  76. }
  77.  
  78. complex<double> SpuskCoorinat_2(complex<double> mins, complex<double> kf[degree + 1]) { // покоординатный спуск
  79. int iter = 0;
  80. double h = 1;
  81. complex<double> x, x1;
  82. FILE *ps;
  83. ps = fopen("D:\\optimization\\KS.txt", "at"); //Дописывает информацию к концу текстового файла.
  84. do
  85. {
  86. do
  87. {
  88. x1 = mins;
  89. x = mins + complex<double>(h, 0);
  90. if (abs(f(mins, kf)) > abs(f(x, kf))) {
  91. mins = mins + complex<double>(h, 0);
  92. iter++;
  93. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(mins, kf).real(), f(mins, kf).imag(), mins.real(), mins.imag());// записываем в файл промежуточные значения
  94. }
  95. else {
  96. x = mins - complex<double>(h, 0);
  97.  
  98. if (abs(f(mins, kf)) > abs(f(x, kf))) {
  99. mins = mins - complex<double>(h, 0);
  100. iter++;
  101. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(mins, kf).real(), f(mins, kf).imag(), mins.real(), mins.imag());// записываем в файл промежуточные значения
  102. }
  103. }
  104. } while (x1 != mins);
  105. do
  106. {
  107. x1 = mins;
  108. x = mins + complex<double>(0, h);
  109.  
  110. if (abs(f(mins, kf)) > abs(f(x, kf))) {
  111. mins = mins + complex<double>(0, h);
  112. iter++;
  113. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(mins, kf).real(), f(mins, kf).imag(), mins.real(), mins.imag());// записываем в файл промежуточные значения
  114. }
  115. else {
  116. x = mins - complex<double>(0, h);
  117. if (abs(f(mins, kf)) > abs(f(x, kf))) {
  118. mins = mins - complex<double>(0, h);
  119. iter++;
  120. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(mins, kf).real(), f(mins, kf).imag(), mins.real(), mins.imag());// записываем в файл промежуточные значения
  121. }
  122. }
  123. } while (x1 != mins);
  124. h /= 10;
  125. } while (abs(f(mins, kf)) > epsi);
  126.  
  127. iteration = iteration + iter;
  128. fprintf(ps, "-----------------------------------------------------------------------\n");
  129. fclose(ps);
  130. return mins;
  131. }
  132.  
  133. complex<double> Gradient_Drop_Step(complex<double> z, complex<double> kf[degree + 1]) {
  134. FILE *ps;
  135. ps = fopen("D:\\optimization\\GDS.txt", "at"); //Дописывает информацию к концу текстового файла.
  136. new_kfDx(kf);
  137. int iter = 0;
  138. int count = 0;
  139. complex<double> x1;
  140. complex<double> x = z;
  141. double a = 0.1;
  142. complex<double> gr;
  143. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(x, kf).real(), f(x, kf).imag(), x.real(), x.imag(), grad(x, kf, kfDx).real(), grad(x, kf, kfDx).imag());// записываем в файл промежуточные значения
  144. do {
  145. gr = grad(x, kf, kfDx);
  146. x1 = x - a * gr;
  147. count = count + 6;
  148. if (abs(f(x1,kf)) - abs(f(x,kf)) > -a * epsi*abs(pow(gr, 2))) {
  149. a = a * 0.1;
  150. }
  151. else {
  152. x = x1;
  153. iter++;
  154. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(x1, kf).real(), f(x1, kf).imag(), x1.real(), x1.imag(), grad(x1, kf, kfDx).real(), grad(x1, kf, kfDx).imag());// записываем в файл промежуточные значения
  155. }
  156. } while (abs(grad(x1,kf,kfDx)) > epsi);
  157. iteration = iteration + iter;
  158. counting = counting + count;
  159. fprintf(ps, "-----------------------------------------------------------------------------------------------\n");
  160. fclose(ps);
  161. return x1;
  162. }
  163.  
  164. complex<double> Gradient_Const_Step(complex<double> z, complex<double> kf[degree + 1]) {
  165. FILE *ps;
  166. ps = fopen("D:\\optimization\\GCS.txt", "at"); //Дописывает информацию к концу текстового файла.
  167. complex<double> x1;
  168. complex<double> x = z;
  169. int iter = 0;
  170. double L = lip(kf);
  171. //cout << L << endl;
  172. new_kfDx(kf);
  173. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(x, kf).real(), f(x, kf).imag(), x.real(), x.imag(), grad(x, kf, kfDx).real(), grad(x, kf, kfDx).imag());// записываем в файл промежуточные значения
  174. double a = (1-epsi)/L;
  175. do {
  176. x1 = x - a * grad(x, kf, kfDx);
  177. x = x1;
  178. iter++;
  179. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(x, kf).real(), f(x, kf).imag(), x.real(), x.imag(), grad(x, kf, kfDx).real(), grad(x, kf, kfDx).imag());// записываем в файл промежуточные значения
  180. } while (abs(grad(x1, kf, kfDx)) > epsi);
  181. iteration = iteration + iter;
  182. fprintf(ps, "-----------------------------------------------------------------------------------------------\n");
  183. fclose(ps);
  184. return x1;
  185. }
  186.  
  187. complex<double> Gradient_Set_Step(complex<double> z, complex<double> kf[degree + 1]) {
  188. FILE *ps;
  189. ps = fopen("D:\\optimization\\GSS.txt", "at"); //Дописывает информацию к концу текстового файла.
  190. new_kfDx(kf);
  191. int iter = 0;
  192. complex<double> x1;
  193. complex<double> x = z;
  194. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(x, kf).real(), f(x, kf).imag(), x.real(), x.imag(), grad(x, kf, kfDx).real(), grad(x, kf, kfDx).imag());// записываем в файл промежуточные значения
  195. double k = 10000;
  196. do {
  197. x1 = x - (1/k) * grad(x, kf, kfDx);
  198. x = x1;
  199. k++;
  200. iter++;
  201. fprintf(ps, "%4d | (%6.10f, %6.10f) | (%6.10f, %6.10f) | (%6.10f, %6.10f) |\n", iter, f(x, kf).real(), f(x, kf).imag(), x.real(), x.imag(), grad(x, kf, kfDx).real(), grad(x, kf, kfDx).imag());// записываем в файл промежуточные значения
  202. } while (abs(grad(x1, kf, kfDx)) > epsi);
  203. iteration = iteration + iter;
  204. fprintf(ps, "-----------------------------------------------------------------------------------------------\n");
  205. fclose(ps);
  206. return x1;
  207. }
  208.  
  209. void Poisk_korney_KS(complex<double> kf[degree + 1]) {
  210. FILE *ps;
  211. ps = fopen("D:\\optimization\\KS.txt", "w");//создаем текстовый файл в //который будут записываться выходные данные
  212. fprintf(ps, "Координатный спуск\n");
  213. fprintf(ps, "------------------------------\n");
  214. fprintf(ps, " Итер | Y | x |\n"); //«шапка» таблицы
  215. fprintf(ps, "------------------------------\n");
  216. complex<double> x;
  217. fclose(ps);
  218. for (int i = 0; i < degree; i++) {
  219. x = SpuskCoorinat_2(0,kf);
  220. x = SpuskCoorinat_2(x,first_kf);
  221. root[i] = x;
  222. ps = fopen("D:\\optimization\\KS.txt", "at");
  223. fprintf(ps, "Корень: x = (%6.10f,%6.10f) y = (%6.10f,%6.10f)\n", root[i].real(), root[i].imag(), f(root[i], first_kf).real(), f(root[i], first_kf).imag());
  224. fprintf(ps, "-----------------------------------------------------------------------\n");
  225. fclose(ps);
  226. Gorner(x,kf);
  227. }
  228. ps = fopen("D:\\optimization\\KS.txt", "at");
  229. fprintf(ps, "Итераций:%4d \n", iteration);
  230. for (int i = 0; i < degree; i++) {
  231. fprintf(ps, "Корень: x = (%6.10f,%6.10f) y = (%6.10f,%6.10f)\n", root[i].real(), root[i].imag(), f(root[i], first_kf).real(), f(root[i], first_kf).imag());
  232. }
  233. fprintf(ps, "\nКоличество вычисления целевой функции:%4d\n", iteration*4);
  234. iteration = 0;
  235. counting = 0;
  236. fclose(ps);
  237. for (int i = 0; i < degree + 1; i++) {
  238. kf[i] = first_kf[i];
  239. }
  240. }
  241.  
  242. void Poisk_korney_GDS(complex<double> kf[degree + 1]) {
  243. FILE *ps;
  244. ps = fopen("D:\\optimization\\GDS.txt", "w");//создаем текстовый файл в //который будут записываться выходные данные
  245. fprintf(ps, "Градиентный спуск с дробением шага\n");
  246. fprintf(ps, "-------------------------------------------\n");
  247. fprintf(ps, " Итер | Y | x | grad |\n"); //«шапка» таблицы
  248. fprintf(ps, "-------------------------------------------\n");
  249. complex<double> x;
  250. fclose(ps);
  251. for (int i = 0; i < degree; i++) {
  252. x = Gradient_Drop_Step(0,kf);
  253. x = Gradient_Drop_Step(x, first_kf);
  254. root[i] = x;
  255. ps = fopen("D:\\optimization\\GDS.txt", "at");
  256. fprintf(ps, "Корень: x = (%6.10f,%6.10f) y = (%6.10f,%6.10f)\n", root[i].real(), root[i].imag(), f(root[i], first_kf).real(), f(root[i], first_kf).imag());
  257. fprintf(ps, "-----------------------------------------------------------------------------------------------\n");
  258. fclose(ps);
  259. Gorner(x, kf);
  260. }
  261. ps = fopen("D:\\optimization\\GDS.txt", "at");
  262. fprintf(ps, "Итераций:%4d \n", iteration);
  263. for (int i = 0; i < degree; i++) {
  264. fprintf(ps, "Корень: x = (%6.10f,%6.10f) y = (%6.10f,%6.10f)\n", root[i].real(),root[i].imag(),f(root[i],first_kf).real(), f(root[i], first_kf).imag());
  265. }
  266. fprintf(ps, "\nКоличество вычисления целевой функции:%4d\n", counting);
  267. for (int i = 0; i < degree + 1; i++) {
  268. kf[i] = first_kf[i];
  269. }
  270. iteration = 0;
  271. counting = 0;
  272. fclose(ps);
  273. }
  274.  
  275. void Poisk_korney_GCS(complex<double> kf[degree + 1]) {
  276. FILE *ps;
  277. ps = fopen("D:\\optimization\\GCS.txt", "w");//создаем текстовый файл в //который будут записываться выходные данные
  278. fprintf(ps, "Градиентный спуск с постоянным шагом\n");
  279. fprintf(ps, "-------------------------------------------\n");
  280. fprintf(ps, " Итер | Y | x | grad |\n"); //«шапка» таблицы
  281. fprintf(ps, "-------------------------------------------\n");
  282. fclose(ps);
  283. complex<double> x;
  284. for (int i = 0; i < degree; i++) {
  285. x = Gradient_Const_Step(0, kf);
  286. x = Gradient_Const_Step(x, first_kf);
  287. root[i] = x;
  288. ps = fopen("D:\\optimization\\GCS.txt", "at");
  289. fprintf(ps, "Корень: x = (%6.10f,%6.10f) y = (%6.10f,%6.10f)\n", root[i].real(), root[i].imag(), f(root[i], first_kf).real(), f(root[i], first_kf).imag());
  290. fprintf(ps, "-----------------------------------------------------------------------------------------------\n");
  291. fclose(ps);
  292. Gorner(x, kf);
  293. }
  294. ps = fopen("D:\\optimization\\GCS.txt", "at");
  295. fprintf(ps, "Итераций:%4d \n", iteration);
  296. for (int i = 0; i < degree; i++) {
  297. fprintf(ps, "Корень: x = (%6.10f,%6.10f) y = (%6.10f,%6.10f)\n", root[i].real(), root[i].imag(), f(root[i], first_kf).real(), f(root[i], first_kf).imag());
  298. }
  299. fprintf(ps, "\nКоличество вычисления целевой функции:%4d\n", iteration*4);
  300. for (int i = 0; i < degree + 1; i++) {
  301. kf[i] = first_kf[i];
  302. }
  303. iteration = 0;
  304. counting = 0;
  305. fclose(ps);
  306. }
  307.  
  308. void Poisk_korney_GSS(complex<double> kf[degree + 1]) {
  309. FILE *ps;
  310. ps = fopen("D:\\optimization\\GSS.txt", "w");//создаем текстовый файл в //который будут записываться выходные данные
  311. fprintf(ps, "Градиентный спуск с заранее заданным шагом\n");
  312. fprintf(ps, "-------------------------------------------\n");
  313. fprintf(ps, " Итер | Y | x | grad |\n"); //«шапка» таблицы
  314. fprintf(ps, "-------------------------------------------\n");
  315. complex<double> x;
  316. fclose(ps);
  317. for (int i = 0; i < degree; i++) {
  318. x = Gradient_Set_Step(0, kf);
  319. x = Gradient_Set_Step(x, first_kf);
  320. root[i] = x;
  321. ps = fopen("D:\\optimization\\GSS.txt", "at");
  322. fprintf(ps, "Корень: x = (%6.10f,%6.10f) y = (%6.10f,%6.10f)\n", root[i].real(), root[i].imag(), f(root[i], first_kf).real(), f(root[i], first_kf).imag());
  323. fprintf(ps, "-----------------------------------------------------------------------------------------------\n");
  324. fclose(ps);
  325. Gorner(x, kf);
  326. }
  327. ps = fopen("D:\\optimization\\GSS.txt", "at");
  328. fprintf(ps, "Итераций:%4d \n", iteration);
  329. for (int i = 0; i < degree; i++) {
  330. fprintf(ps, "Корень: x = (%6.10f,%6.10f) y = (%6.10f,%6.10f)\n", root[i].real(), root[i].imag(), f(root[i], first_kf).real(), f(root[i], first_kf).imag());
  331. }
  332. fprintf(ps, "\nКоличество вычисления целевой функции:%4d\n", iteration*4);
  333. for (int i = 0; i < degree + 1; i++) {
  334. kf[i] = first_kf[i];
  335. }
  336. iteration = 0;
  337. counting = 0;
  338. fclose(ps);
  339. }
  340.  
  341. int main() {
  342. Poisk_korney_KS(kf);
  343. Poisk_korney_GSS(kf);
  344. Poisk_korney_GDS(kf);
  345. Poisk_korney_GCS(kf);
  346. system("pause");
  347. return 0;
  348. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement