Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.71 KB | None | 0 0
  1. #include <iostream>
  2. #include <Cmath>
  3. #include <complex>
  4. #include <vector>
  5. #include "math.h"
  6.  
  7. using namespace std;
  8.  
  9. complex<double> root[4];
  10. int k = 0;
  11.  
  12. vector<complex<double>> coef = { complex<double>(2,0),complex<double>(16,0),
  13. complex<double>(18,0), complex<double>(10,0),complex<double>(19,0), complex<double>(0,1) };
  14.  
  15. vector<complex<double>>Horner(complex<double> z, vector<complex<double>> coef)
  16. {
  17. vector<complex<double>> newcoef;
  18. newcoef.push_back(coef[0]);
  19. for (int i = 1; i < coef.size(); i++)
  20. {
  21. newcoef.push_back(z*newcoef[i - 1] + coef[i]);
  22. }
  23. return newcoef;
  24. }
  25.  
  26. double Abs(complex<double>z)
  27. {
  28. return sqrt(z.real()*z.real() + z.imag()*z.imag());
  29. }
  30.  
  31. double F(complex<double>z, vector<complex<double>> coef)
  32. {
  33. vector<complex<double>> newcoef = Horner(z, coef);
  34. return Abs(newcoef[newcoef.size() - 1]);
  35. }
  36.  
  37. //complex<double>
  38. complex<double> SpuskCoordinates(complex<double> a, complex<double> b, double Epsilon, vector<complex<double>> coef)
  39. {
  40. complex<double> z0 = a;
  41. complex<double> minz = z0;
  42. complex<double>z = b;
  43. double min = F(a,coef);
  44. while (Abs(F(z,coef) - F(minz,coef)) > Epsilon) {
  45. a = z0;
  46. z = minz;
  47. int k = (b.real() - a.real()) / Epsilon;
  48. for (int i = 0; i < k; i++)
  49. {
  50. if (F(a+ complex<double>(i*Epsilon, 0), coef) < min)
  51. {
  52. minz = a + complex<double>(i*Epsilon, 0);
  53. min = F(minz, coef);
  54. //cout << minz << endl;
  55. //cout << minz << " " << F(minz, coef) << endl;
  56. }
  57. }
  58. a = minz;
  59. k = (b.imag() - a.imag()) / Epsilon;
  60. for (int i = 0; i < k; i++)
  61. {
  62. if (F(a + complex<double>(0, i*Epsilon), coef) < min)
  63. {
  64. minz = a + complex<double>(0, i*Epsilon);
  65. min = F(minz, coef);
  66. //cout << minz << endl;
  67. //cout << minz << " " << F(minz, coef) << endl;
  68. }
  69.  
  70. }
  71. //cout << minz << " " << z << endl;
  72. }
  73. z = minz;
  74. return z;
  75. }
  76.  
  77. vector<complex<double>>DerCoef(vector<complex<double>> coef)
  78. {
  79. vector<complex<double>> dercoef;
  80. int s = coef.size() - 1;
  81. for (int i = 0; i < s; i++)
  82. {
  83. dercoef.push_back(coef[i] * (double)(s - i));
  84. }
  85. return dercoef;
  86. }
  87.  
  88. complex<double>Gradient(complex<double> z, vector<complex<double>> coef)
  89. {
  90. complex<double> G = Horner(z, coef).back();
  91. complex<double> Gconj(G.real(), -G.imag());
  92. complex<double> G1 = Horner(z, DerCoef(coef)).back();
  93. complex<double> grad = Gconj * G1;
  94. grad = complex<double>(grad.real(), -grad.imag());
  95. return grad;
  96. }
  97.  
  98. int N = 0;
  99.  
  100. complex<double> GradientDrob(complex<double>z, double epsilon, double delta, double alpha, vector<complex<double>> coef)
  101. {
  102. complex<double>zi, zi1;
  103. complex<double> grad = Gradient(z, coef);
  104. N++;
  105. double fi, fi1;
  106. zi1 = z;
  107. fi = F(zi1, coef);
  108. while (Abs(grad) > delta)
  109. {
  110. zi = zi1;
  111. zi1 = zi - alpha * grad;
  112. fi1 = F(zi1, coef);
  113. grad = Gradient(zi1, coef);
  114. N++;
  115. if (fi1 - fi > -alpha * epsilon*Abs(grad))
  116. alpha /= 10;
  117. //cout << fi1 << " " << zi1 << " " << grad << endl;
  118. }
  119. N = 0;
  120. return zi1;
  121. }
  122.  
  123. double Lx(vector<complex<double>> coef)
  124. {
  125. double max = Abs(coef[0].real());
  126. for (int i = 1; i < coef.size(); i++) {
  127. if (Abs(coef[i].real()) > max)
  128. max = Abs(coef[i].real());
  129. }
  130.  
  131. return 1+(max/Abs(coef[0]));
  132. }
  133.  
  134. complex<double> GradientConst(complex<double> z,double epsilon, vector<complex<double>> coef)
  135. {
  136. cout << "CHECK1" << endl;
  137. complex<double> zi, zi1;
  138. cout << "CHECK1" << endl;
  139. complex<double> grad = Gradient(z, coef);
  140. cout << "CHECK1" << endl;
  141. double fi1;
  142. cout << "CHECK1" << endl;
  143. double x = Lx(coef);
  144. vector<complex<double>>Der1 = DerCoef(coef);
  145. cout << "CHECK2" << endl;
  146. int L = (int)round(pow(Horner(complex<double>(x, 0), Der1).back().real(), 2) +
  147. Horner(complex<double>(x, 0), coef).back().real() *
  148. Horner(complex<double>(x, 0), DerCoef(Der1)).back().real());
  149. zi1 = z;
  150. cout << "L= " << L << endl;
  151. double alpha = (1 - epsilon) / (double)L;
  152. cout << "A = " << alpha<<endl;
  153. cout << "CHECK3" << endl;
  154. alpha = -alpha;
  155. while(Abs(grad) > epsilon)
  156. {
  157. //cout << "CHECK4" << endl;
  158. zi1 -= alpha * grad;
  159. fi1 = F(zi1, coef);
  160. grad = Gradient(zi1, coef);
  161. //cout << fi1 << " " << zi1 << " " << grad << endl;
  162. }
  163. cout << "CHECK5" << endl;
  164. complex<double>minz, min;
  165. return minz;
  166. }
  167.  
  168. complex<double>GradientPredict(complex<double>z,double epsilon,vector<complex<double>> coef)
  169. {
  170. complex<double> zi;
  171. complex<double> grad = Gradient(z, coef);
  172. int k = 10000;
  173. zi = z;
  174. while (Abs(grad) > epsilon)
  175. {
  176. zi -= (1 / (double)(k))*grad;
  177. grad = Gradient(zi, coef);
  178. k++;
  179. }
  180. complex<double> minz, min;
  181. minz = zi;
  182. min = F(minz, coef);
  183. return zi;
  184. }
  185.  
  186. //vector<complex<double>>
  187. void root_search(vector<complex<double>>coef)
  188. {
  189. complex<double>a = complex<double>(-7, -1);
  190. complex<double>b = complex<double>(2,1);
  191. vector<complex<double>> roots;
  192. int deg = coef.size();
  193. vector<complex<double>> tempcoef = coef;
  194. complex<double> root;
  195. double alpha = 10e-5;
  196. double alpha1 = 0.5;
  197. double alpha2 = 0.5;
  198. double Epsilon = 10e-4;
  199. double delta = 10e-3;
  200. for (int i = 1; i < deg; i++)
  201. {
  202. root = SpuskCoordinates(a, b, Epsilon, tempcoef);
  203. tempcoef = Horner(root, tempcoef);
  204. tempcoef.resize(deg - i);
  205. roots.push_back(root);
  206. }
  207. for (int i = 0; i < roots.size(); i++)
  208. {
  209. cout << "Корни" << roots[i] << " " << "F(z)= " << F(roots[i], coef) << endl;
  210. }
  211. roots.clear();
  212. tempcoef = coef;
  213. cout << "GradDrop" << endl;
  214. for (int i = 1; i < deg; i++)
  215. {
  216. root = GradientDrob(complex<double>(0, 0), Epsilon, delta, alpha, tempcoef);
  217. tempcoef = Horner(root, tempcoef);
  218. tempcoef.resize(deg - i);
  219. roots.push_back(root);
  220. }
  221. for (int i = 0; i < roots.size(); i++)
  222. {
  223. cout << "Корни" << roots[i] << " " << "F(z)= " << F(roots[i], coef) << endl;
  224. }
  225. tempcoef = coef;
  226. roots.clear();
  227. cout << "GradPredict" << endl;
  228. for (int i = 1; i < deg; i++)
  229. {
  230. root = GradientPredict(complex<double>(0, 0), Epsilon, tempcoef);
  231. tempcoef = Horner(root, tempcoef);
  232. tempcoef.resize(deg - i);
  233. roots.push_back(root);
  234. }
  235. for (int i = 0; i < roots.size(); i++)
  236. {
  237. cout << "Корни" << roots[i] << " " << "F(z)= " << F(roots[i], coef) << endl;
  238. }
  239. tempcoef = coef;
  240. roots.clear();
  241. cout << "GradConst" << endl;
  242. for (int i = 1; i < deg; i++)
  243. {
  244. root = GradientConst(complex<double>(0, 0), Epsilon, tempcoef);
  245. tempcoef = Horner(root, tempcoef);
  246. tempcoef.resize(deg - i);
  247. roots.push_back(root);
  248. }
  249. for (int i = 0; i < roots.size(); i++)
  250. {
  251. cout << "Корни" << roots[i] << " " << "F(z)= " << F(roots[i], coef) << endl;
  252. }
  253.  
  254. }
  255.  
  256. /*void SpuskCoordinates(complex<double>a, complex<double>b, double epsilon)
  257. {
  258. complex<double> x0 = a;
  259. int k = 0;
  260. while (k < 4)
  261. {
  262. complex<double> minx = x0;
  263. complex<double> x;
  264. double min = 100000;
  265. while (abs(F(minx) - F(x)) > epsilon)
  266. {
  267. a = x0;
  268.  
  269. int j = (real(b) - real(a)) / epsilon;
  270. for (int i = 0; i < j; i++)//метод пассивного поиска для целой части
  271. {
  272. if (F(a + complex<double>(i*epsilon, 0)) < min)
  273. {
  274. minx = a + complex<double>(i*epsilon, 0);
  275. min = F(a+complex<double>(i*epsilon, 0));
  276. }
  277. }
  278. a = complex<double>(real(minx), imag(x0));
  279. j = (imag(b) - imag(a)) / epsilon;
  280. for (int i = 0; i < j; i++)//метод пассивного поиска для мнимой части
  281. {
  282. if (F(a + complex<double>(0, i*epsilon)) < min)
  283. {
  284. minx = a + complex<double>(0, i*epsilon);
  285. min = F(a + complex<double>(0, i*epsilon));
  286. }
  287. }
  288. x = minx;
  289. }
  290. cout << "Целая часть:" << real(x) << " Мнимая часть:" << imag(x) << " Значение полинома:" << F(x) << endl;
  291. root[k] = minx;
  292. k++;
  293. }
  294.  
  295. }*/
  296.  
  297. int main()
  298. {
  299. setlocale(LC_ALL, "Russian");
  300. root_search(coef);
  301. system("pause");
  302. return 0;
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement