Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.45 KB | None | 0 0
  1. //
  2. // main.cpp
  3. // KR_PO_VMA
  4. //
  5. // Created by Berkovich Pavel on 12/8/19.
  6. // Copyright © 2019 Berkovich Pavel. All rights reserved.
  7. //
  8.  
  9.  
  10.  
  11. #include <iostream>
  12. #include<time.h>
  13. #include <cmath>
  14. #include <iomanip>
  15. #include <float.h>
  16.  
  17. using namespace std;
  18. const int size =3;
  19. const double eps = pow(10, -3);
  20. int iteration = 1;
  21. int m,l;
  22. double fi(0);
  23.  
  24.  
  25.  
  26.  
  27. double** Build_U_matrix(){
  28. double ** matrix=new double *[size];
  29. for (int i = 0; i< size; ++i)
  30. matrix[i] = new double[size]{0};
  31. for(int i = 0; i<size;++i){
  32. matrix[i][i]=1;
  33. }
  34. matrix[l][l] = cos(fi);
  35. matrix[m][m] = cos(fi);
  36. matrix[m][l] = sin(fi);
  37. matrix[l][m] = -sin(fi);
  38. return matrix;
  39. }
  40.  
  41. void Max_ne_diag (double**matrix){
  42. double max = DBL_MIN;
  43. for(int i=0;i<size;++i){
  44. for (int j=0; j<size; ++j) {
  45. if (abs(max)<abs(matrix[i][j]) && (i<j)){
  46. max =abs( matrix[i][j]);
  47. l = i;
  48. m=j;
  49. }
  50. }
  51. }
  52. }
  53.  
  54. void counting_fi (double**matrix){
  55. fi = 0.5*atan((2*matrix[l][m])/(matrix[l][l] - matrix[m][m]));
  56. }
  57.  
  58.  
  59. double scalar(double* V1,double* V2,int n)
  60. {
  61. double rez(0);
  62. for(int i = 0; i<size;++i)
  63. rez+= V1[i]*V2[i];
  64. return rez;
  65. }
  66.  
  67. void Print_Vector (double *arr){
  68. for (int i = 0; i < size; ++i){
  69. cout<<setw(7);
  70. printf("%.15f \n",arr[i]);
  71. }
  72. cout<<endl;
  73. }
  74.  
  75. void Print_Matrix (double** arr){
  76. for (int i=0;i<size;++i){
  77. for(int j=0;j<size;j++){
  78. printf("%15.5f ",arr[i][j]);
  79. }
  80. cout<<endl;
  81. }
  82. cout<<endl;
  83. }
  84.  
  85. void Norm_prisvaivanie (double** arr1,double** arr2){
  86. for (int i=0;i<size;++i){
  87. for(int j=0;j<size;j++){
  88. arr1[i][j] = arr2[i][j];
  89. }
  90. }
  91. }
  92.  
  93. void Norm_prisvaivanie (double* arr1,double* arr2){
  94. for (int i=0;i<size;++i){
  95. arr1[i] = arr2[i];
  96. }
  97. }
  98.  
  99. void Transpouse_matrix (double **arr){
  100. for(int i = 0; i < size; ++i){
  101. for(int j = i; j < size; ++j){
  102. swap(arr[i][j] , arr[j][i]);
  103. }
  104. }
  105. }
  106.  
  107. void matrix_multiplication(double **arr1, double **arr2, double ** answer){
  108. for (int i=0; i<size; ++i){
  109. for(int j=0;j<size;++j){
  110. for(int k = 0; k < size; ++k){
  111. answer[i][j] += arr1[i][k] * arr2[k][j];
  112. }
  113. }
  114. }
  115. }
  116.  
  117. double * matrix_multiplication(double **arr1, double *arr2){
  118. double *buff_vector = new double[size] {0};
  119. for (int i=0; i<size; ++i){
  120. for(int j=0;j<size;++j){
  121. buff_vector[i]+=arr1[i][j]*arr2[j];
  122. }
  123. }
  124. return buff_vector;
  125. }
  126.  
  127.  
  128. double first_Norm(double*x){
  129. double max = DBL_MIN;
  130. for(int i =1;i<size;++i){
  131. (abs(x[i])> abs(max))?(max = x[i]):(max=max);
  132. }
  133. return abs(max) ;
  134. }
  135.  
  136. double mark_for_Test_1(double** matrix){
  137. double summ(0);
  138. for(int i=0;i<size;++i){
  139. for (int j=0; j<size; ++j) {
  140. if (i ==j )
  141. continue;
  142. summ +=pow(matrix[i][j],2);
  143. }
  144. }
  145. return summ;
  146. }
  147.  
  148. int mark_for_aprior(double** matrix){
  149. double summ(0),p(0);
  150. int answ(0);
  151. summ =mark_for_Test_1(matrix);
  152. p = 1.0 - 2.0/(size*(size-1));
  153. answ = log(eps/summ)/log(p)+1;
  154. return answ;
  155. }
  156.  
  157.  
  158. void Normirovka (double* arr1,double k){
  159. for (int i=0;i<size;++i){
  160. arr1[i] /=k;
  161. }
  162. }
  163.  
  164. void Obnulenie(double** matrix){
  165. for(int i = 0;i<size;++i)
  166. for(int j = 0;j<size;++j)
  167. matrix[i][j]=0;
  168. }
  169.  
  170. void Task_1(double** arr){
  171. iteration=0;
  172. double ** buf2=new double *[size];
  173. for (int i = 0; i< size; ++i)
  174. buf2[i] = new double[size]{0};
  175. double ** buf=new double *[size];
  176. for (int i = 0; i< size; ++i)
  177. buf[i] = new double[size]{0};
  178. while (mark_for_Test_1(arr)>eps){
  179. iteration++;
  180. Max_ne_diag(arr);
  181. counting_fi(arr);
  182. Norm_prisvaivanie(buf2, Build_U_matrix());
  183. cout<<"U matrix:"<<endl;
  184. Print_Matrix(buf2);
  185. Transpouse_matrix(buf2);
  186. Obnulenie(buf);
  187. matrix_multiplication(buf2, arr, buf);
  188. Obnulenie(arr);
  189. matrix_multiplication(buf,Build_U_matrix(), arr);
  190. cout<<"Next matrix:"<<endl;
  191. Print_Matrix(arr);
  192. }
  193. }
  194. void print_all_I_need (double *buff_pred,double * buff){
  195. cout<<"Наши значения y(k),y(k+1):"<<endl;
  196. Print_Vector(buff_pred);
  197. cout<<"~~~~~~~~~~"<<endl;
  198. Print_Vector(buff);
  199.  
  200. }
  201.  
  202.  
  203. double Task_2_1_and_2(double **arr,double* y){
  204. iteration = 1;
  205. double lamd(0),pred_lambd(0);
  206. double * buff_pred = y;
  207. double * buff =matrix_multiplication(arr, y);
  208. print_all_I_need(buff_pred,buff);
  209. lamd = scalar(buff, buff_pred, size)/scalar(buff_pred, buff_pred, size);
  210. cout<<lamd<<endl;
  211.  
  212. while (abs(lamd-pred_lambd)>eps) {
  213. iteration ++;
  214. pred_lambd = lamd;
  215. double k = first_Norm(buff);
  216. Normirovka(buff, k);
  217. Norm_prisvaivanie(buff_pred, buff);
  218. buff = matrix_multiplication(arr, buff);
  219. lamd = scalar(buff, buff_pred, size) / scalar(buff_pred, buff_pred, size) ;
  220. cout<<lamd<<endl;
  221. }
  222. return lamd;
  223. }
  224.  
  225.  
  226. void print_all_I_need (double * buff_ppred,double * buff_pred,double * buff){
  227. cout<<"Наши значения y(k-1),y(k),y(k+1):"<<endl;
  228. Print_Vector(buff_ppred);
  229. cout<<"~~~~~~~~~~"<<endl;
  230. Print_Vector(buff_pred);
  231. cout<<"~~~~~~~~~~"<<endl;
  232. Print_Vector(buff);
  233. }
  234.  
  235. double Task_2_3(double **arr,double* y){
  236. iteration = 1;
  237. double lamd(0), pred_lambd(0);
  238. double * buff_ppred = y;
  239. double * buff =matrix_multiplication(arr, y);
  240. double * buff_pred =new double[size];
  241. Norm_prisvaivanie(buff_pred, buff);
  242. buff =matrix_multiplication(arr, buff_pred);
  243. print_all_I_need(buff_ppred,buff_pred,buff);
  244. lamd = sqrt(scalar(buff, buff_pred, size)/scalar(buff_pred, buff_ppred, size));
  245. cout<<lamd<<endl;
  246. while (abs(lamd-pred_lambd)>eps) {
  247. iteration ++;
  248. pred_lambd = lamd;
  249. //double k = first_Norm(buff);
  250. //Normirovka(buff, k);
  251. //Norm_prisvaivanie(buff_pred, buff);
  252. buff_ppred = buff_pred;
  253. buff_pred = buff;
  254. buff = matrix_multiplication(arr, buff);
  255. print_all_I_need(buff_ppred,buff_pred,buff);
  256. lamd = sqrt(scalar(buff, buff_pred, size)/scalar(buff_pred, buff_ppred, size));
  257. cout<<lamd<<endl;
  258. }
  259. return lamd;
  260. }
  261.  
  262.  
  263. int main() {
  264. srand(time(NULL));
  265. double ** matrix=new double *[size];
  266. for (int i = 0; i< size; ++i)
  267. matrix[i] = new double[size];
  268. //Generate_matrix_2_0(matrix);
  269. //Getting_the_right_matrix(matrix);
  270. for (int i = 0; i< size; ++i)
  271. for (int j =0;j<size;++j){
  272. cin>>matrix[i][j];
  273. }
  274. cout<<"Матрица c которой будем работать:"<<endl;
  275. Print_Matrix(matrix);
  276. //Start
  277. double ** buf=new double *[size];
  278. for (int i = 0; i< size; ++i)
  279. buf[i] = new double[size]{0};
  280. Norm_prisvaivanie(buf, matrix);
  281. Task_1(buf);
  282. cout<<"Количество итераций для вычисления = "<<iteration<<"."<<endl;
  283. //Task_2
  284. double * y = new double [size]{0};
  285. y[0] = 1;
  286. int choise;
  287. cout<<"У вас случай 1 и 2 или случай 3:"<<endl;
  288. cin>>choise;
  289. switch (choise) {
  290. case 1:
  291. {
  292. double p = Task_2_1_and_2(matrix, y);
  293. printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  294. break;
  295. }
  296. case 2:
  297. {
  298. double p = Task_2_1_and_2(matrix, y);
  299. printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  300. break;
  301.  
  302. }
  303. case 3:
  304. {
  305. double p = Task_2_3(matrix, y);
  306. printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  307. break;
  308. }
  309. default:
  310. break;
  311. }
  312. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement