Advertisement
Guest User

Untitled

a guest
Dec 19th, 2018
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.11 KB | None | 0 0
  1. #include <iostream>
  2. #include <Cmath>
  3. #include <complex>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. int printn = 0;
  9. int NF = 0;
  10.  
  11. double Abs(complex<double> x) {
  12. return sqrt(x.imag() * x.imag() + x.real() * x.real());
  13. }
  14.  
  15. vector<complex<double>> coefficients = { complex<double>(19,0),complex<double>(18,0), //коэффиценты полинома
  16. complex<double>(16,0), complex<double>(10,0),complex<double>(2,0), complex<double>(0,1) };
  17.  
  18. double max(double a, double b)
  19. {
  20. if (a > b)
  21. return a;
  22. else return b;
  23. }
  24.  
  25. double R = 1;
  26.  
  27. double g1(complex<double> z) {
  28. return Abs(z - complex<double>(-2, 0)) - R;
  29. }
  30.  
  31. double g2(complex<double> z) {
  32. return z.real() + z.imag();
  33. }
  34.  
  35. vector<complex<double>> Horner(complex<double> x, vector<complex<double>> coefficients) { //схема Горнера
  36. vector<complex<double>> newcoefficients;
  37. newcoefficients.push_back(coefficients.operator[](0));
  38. for (int i = 1; i < coefficients.size(); i++) {
  39. newcoefficients.push_back(x * newcoefficients[i - 1] + coefficients[i]);
  40. }
  41. return newcoefficients;
  42. }
  43.  
  44. double f(complex<double> z) {
  45. vector<complex<double>> temp = Horner(z, coefficients);
  46. return Abs(temp[temp.size() - 1]);
  47. }
  48.  
  49. double H(complex<double> z) {
  50. return pow(max(0.0, g1(z)), 2) + pow(max(0.0, g2(z)), 2);
  51. }
  52.  
  53. int r = 10000;
  54.  
  55. double F(complex<double> z, vector<complex<double>> coefficients) {
  56. NF++;
  57. return f(z) + r * H(z);
  58. };
  59.  
  60. vector<complex<double>> DerCoef(vector<complex<double>> coef) {
  61. vector<complex<double>> temp;
  62. int N = coef.size() - 1;
  63. for (int i = 0; i < N; i++) {
  64. temp.push_back(coef[i] * (double)(N - i));
  65. }
  66. return temp;
  67. }
  68.  
  69. complex<double> gradG1(complex<double> z) {
  70. return complex<double>(2 * z.real() + 4, 2 * z.imag() - 4); //производная от g1
  71. }
  72.  
  73. complex<double> gradG2(complex<double> z) { //производная от g2
  74. return complex<double>(1, 1);
  75. }
  76.  
  77. complex<double> GradientF(complex<double> z, vector<complex<double>> coefficients) {//Градиент
  78. complex<double> Pz = Horner(z, coefficients).back();
  79. complex<double> Pzconj(Pz.real(), -Pz.imag());
  80. complex<double> Pz1 = Horner(z, DerCoef(coefficients)).back();
  81. complex<double> gr = Pzconj * Pz1;
  82. gr = complex<double>(gr.real(), -gr.imag());
  83. return gr;
  84. }
  85.  
  86. complex<double> GradientH(complex<double> z) {
  87. complex<double> grH(2 * max(0.0, g1(z)) * (2 * z.real() + 4) + 2 * max(0.0, g2(z)),
  88. 2 * max(0.0, g1(z)) * (2 * z.imag() - 4) + 2 * max(0.0, g2(z)));
  89. return grH;
  90. }
  91.  
  92. complex<double> Gradient(complex<double> z) {
  93. complex<double> gr = GradientF(z, coefficients) + GradientH(z);
  94. return gr;
  95. }
  96.  
  97. int N = 0;
  98.  
  99. complex<double> SpuskCoordinates(complex<double> z0, double epsilon, vector<complex<double>> coef)
  100. { bool check1 = false;
  101. bool check2 = false;
  102. double alpha1 = 0.1;
  103. double alpha2 = 0.001;
  104. complex<double> z, temp;
  105. int k = 0;
  106. z = z0;
  107. double delta = 1;
  108. complex<double>minz = z;
  109. double minf = F(z,coef);
  110. N++;
  111. double minfl;
  112. cout <<"F(z)= " <<minf <<" z= "<< z << " Итерация "<<endl;
  113. /*while (Abs(F(z, coefficients) - F(z0, coefficients)) > epsilon || k < 10) {
  114. N++;
  115. z0 = z;
  116. temp = z + complex<double>(alpha1, 0);
  117. if (F(temp, coefficients) < F(z, coefficients)) {
  118. z = z + complex<double>(alpha1, 0);
  119. }
  120. temp = z - complex<double>(alpha1, 0);
  121. if (F(temp, coefficients) < F(z, coefficients)) {
  122. z = z - complex<double>(alpha1, 0);
  123. }
  124. if (z == z0) {
  125. k = k + 1;
  126. alpha1 *= 0.1;
  127. }
  128. temp = z + complex<double>(0, alpha2);
  129. if (F(temp, coefficients) < F(z, coefficients)) {
  130. z = z + complex<double>(0, alpha2);
  131. }
  132. temp = z - complex<double>(0, alpha2);
  133. if (F(temp, coefficients) < F(z, coefficients)) {
  134. z = z - complex<double>(0, alpha2);
  135. }
  136. if (z == z0) {
  137. k = k + 1;
  138. alpha2 *= 0.1;
  139. }
  140. cout << N << "\t" << F(z, coefficients) << " " << z << endl;
  141. }*/
  142. while (delta > epsilon /2)//спуск по координатам, пока шаг>погрешности
  143. {
  144. //r *= 10;
  145. delta /= 4;
  146. while (F(z - complex<double>(delta, 0), coef) < minf)
  147. { minz -= complex<double>(delta, 0);
  148. z = minz;
  149. minf = F(minz, coef);
  150. N++;
  151. if (printn == 1)
  152. {
  153. cout << "F(z)= " << minf << " z= " << z << " Итерация " << N << endl;
  154. }
  155. //r *= 10;
  156. }
  157. while (F(z + complex<double>(delta, 0), coef) < minf)
  158. { minz += complex<double>(delta, 0);
  159. z = minz;
  160. minf = F(minz, coef);
  161. N++;
  162. //r *= 10;
  163. if (printn == 1)
  164. {
  165. cout << "F(z)= " << minf << " z= " << z << " Итерация " << N << endl;
  166. }
  167. }
  168.  
  169. while (F(z + complex<double>(0, delta), coef) < minf)
  170. { minz += complex<double>(0, delta);
  171. z = minz;
  172. minf = F(minz, coef);
  173. N++;
  174. //r *= 10;
  175. if (printn == 1)
  176. {
  177. cout << "F(z)= " << minf << " z= " << z << " Итерация " << N << endl;
  178. }
  179. }
  180. while (F(z - complex<double>(0, delta), coef) < minf)
  181. {
  182. minz -= complex<double>(0, delta);
  183. z = minz;
  184. minf = F(minz, coef);
  185. N++;
  186. //r *= 10;
  187. if (printn == 1)
  188. {
  189. cout << "F(z)= " << minf << " z= " << z << " Итерация " << N << endl;
  190. }
  191. }
  192. //cout << "Дробление шага, шаг = " << delta << endl;;
  193. }
  194. if (g1(z) > 0) check1 = true;
  195. if (g2(z) > 0) check2 = true;
  196. cout <<"Итого "<< "F(z)= " << minf << " z= " << minz << "Кол-во итераций " << N << endl;
  197. cout << "g1=" << g1(z) << " g2=" << g2(z) << endl;
  198. if (check1)
  199. { complex<double> gr1 = gradG1(z);
  200. complex<double> gr2 = -Gradient(z);
  201. cout << "cos(A) " << (gr1.real() * gr2.real() + gr1.imag() * gr2.imag()) / (Abs(gr1) * Abs(gr2))<<endl;
  202. }
  203. if (check2)
  204. { complex<double> gr1 = gradG2(z);
  205. complex<double> gr2 = -Gradient(z);
  206. cout << "cos(A)" << (gr1.real() * gr2.real() + gr1.imag() * gr2.imag()) / (Abs(gr1) * Abs(gr2))<<endl;
  207. }
  208. cout << "Коэф штрафа = " << r << endl;
  209. cout << "Кол-во вызовов функции " << N*2+1<<endl;
  210. N = 0;
  211. return z;
  212. }
  213.  
  214. int main() {
  215. printn = 1;
  216. setlocale(LC_ALL, "Russian");
  217. cout <<"радиус"<< R << endl;
  218. SpuskCoordinates(complex<double>(-2, 0), 0.0005, coefficients);
  219. system("pause");
  220. return 0;
  221. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement