Advertisement
Guest User

Untitled

a guest
Dec 12th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.51 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. cout<<"max ne diag = "<<matrix[l][m]<<". Where l = "<<l<<" and m = "<<m<<endl;
  53. }
  54.  
  55. void counting_fi (double**matrix){
  56. fi = 0.5*atan((2*matrix[l][m])/(matrix[l][l] - matrix[m][m]));
  57. }
  58.  
  59.  
  60. double scalar(double* V1,double* V2,int n)
  61. {
  62. double rez(0);
  63. for(int i = 0; i<size;++i)
  64. rez+= V1[i]*V2[i];
  65. return rez;
  66. }
  67.  
  68. void Print_Vector (double *arr){
  69. for (int i = 0; i < size; ++i){
  70. cout<<setw(7);
  71. printf("%.15f \n",arr[i]);
  72. }
  73. cout<<endl;
  74. }
  75.  
  76. void Print_Matrix (double** arr){
  77. for (int i=0;i<size;++i){
  78. for(int j=0;j<size;j++){
  79. printf("%15.5f ",arr[i][j]);
  80. }
  81. cout<<endl;
  82. }
  83. cout<<endl;
  84. }
  85.  
  86. void Norm_prisvaivanie (double** arr1,double** arr2){
  87. for (int i=0;i<size;++i){
  88. for(int j=0;j<size;j++){
  89. arr1[i][j] = arr2[i][j];
  90. }
  91. }
  92. }
  93.  
  94. void Norm_prisvaivanie (double* arr1,double* arr2){
  95. for (int i=0;i<size;++i){
  96. arr1[i] = arr2[i];
  97. }
  98. }
  99.  
  100. void Transpouse_matrix (double **arr){
  101. for(int i = 0; i < size; ++i){
  102. for(int j = i; j < size; ++j){
  103. swap(arr[i][j] , arr[j][i]);
  104. }
  105. }
  106. }
  107.  
  108. void matrix_multiplication(double **arr1, double **arr2, double ** answer){
  109. for (int i=0; i<size; ++i){
  110. for(int j=0;j<size;++j){
  111. for(int k = 0; k < size; ++k){
  112. answer[i][j] += arr1[i][k] * arr2[k][j];
  113. }
  114. }
  115. }
  116. }
  117.  
  118. double * matrix_multiplication(double **arr1, double *arr2){
  119. double *buff_vector = new double[size] {0};
  120. for (int i=0; i<size; ++i){
  121. for(int j=0;j<size;++j){
  122. buff_vector[i]+=arr1[i][j]*arr2[j];
  123. }
  124. }
  125. return buff_vector;
  126. }
  127.  
  128.  
  129. double first_Norm(double*x){
  130. double max = DBL_MIN;
  131. for(int i =0;i<size;++i){
  132. (abs(x[i])> abs(max))?(max = x[i]):(max=max);
  133. }
  134. return abs(max) ;
  135. }
  136.  
  137. double mark_for_Test_1(double** matrix){
  138. double summ(0);
  139. for(int i=0;i<size;++i){
  140. for (int j=0; j<size; ++j) {
  141. if (i ==j )
  142. continue;
  143. summ +=pow(matrix[i][j],2);
  144. }
  145. }
  146. return summ;
  147. }
  148.  
  149. void Normirovka (double* arr1,double k){
  150. for (int i=0;i<size;++i){
  151. arr1[i] /=k;
  152. }
  153. }
  154.  
  155. void Obnulenie(double** matrix){
  156. for(int i = 0;i<size;++i)
  157. for(int j = 0;j<size;++j)
  158. matrix[i][j]=0;
  159. }
  160.  
  161. void sin_cos(double** arr){
  162. double Plm = 2*arr[l][m]/(arr[l][l]-arr[m][m]);
  163. printf("P(l,m) = 2 * %f / (%f - %f) = %f\n",arr[l][m],arr[l][l],arr[m][m],2*arr[l][m]/(arr[l][l]-arr[m][m]));
  164. double _cos =pow(0.5*(1+1/sqrt(pow(Plm,2)+1)),0.5);
  165. printf("cos = sqrt(0,5 * (1 + 1/ sqrt((%f)^2+1))) = %f\n",Plm,_cos);
  166. double _sin = Plm/abs(Plm) * pow(0.5*(1-1/sqrt(pow(Plm,2)+1)),0.5);
  167. printf("sin = %f *sqrt(0,5 * (1 - 1/ sqrt((%f)^2+1))) = %f\n", Plm/abs(Plm),Plm,_sin);
  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. printf("~~~~ итерация № %d ~~~~\n",iteration);
  181. Max_ne_diag(arr);
  182. sin_cos(arr);
  183. counting_fi(arr);
  184. Norm_prisvaivanie(buf2, Build_U_matrix());
  185. cout<<"U matrix:"<<endl;
  186. Print_Matrix(buf2);
  187. Transpouse_matrix(buf2);
  188. Obnulenie(buf);
  189. matrix_multiplication(buf2, arr, buf);
  190. Obnulenie(arr);
  191. matrix_multiplication(buf,Build_U_matrix(), arr);
  192. cout<<"Next matrix:"<<endl;
  193. Print_Matrix(arr);
  194. cout<<"~~~~~~~~~~"<<endl;
  195. }
  196. }
  197. void print_all_I_need (double *buff_pred,double * buff){
  198. cout<<"Наши значения y(k),y(k+1):"<<endl;
  199. Print_Vector(buff_pred);
  200. cout<<"~~~~~~~~~~"<<endl;
  201. Print_Vector(buff);
  202.  
  203. }
  204.  
  205.  
  206. double Task_2_1_and_2(double **arr,double* y){
  207. iteration = 1;
  208. printf("~~~~ итерация № %d ~~~~\n",iteration);
  209. double lamd(0),pred_lambd(0);
  210. double * buff_pred = y;
  211. double * buff =matrix_multiplication(arr, y);
  212. print_all_I_need(buff_pred,buff);
  213. lamd = scalar(buff, buff_pred, size)/scalar(buff_pred, buff_pred, size);
  214. cout<<lamd<<endl;
  215. while (abs(lamd-pred_lambd)>eps) {
  216. iteration ++;
  217. printf("~~~~ итерация № %d ~~~~\n",iteration);
  218. pred_lambd = lamd;
  219. bool bool_norm;
  220. cout<<"Будем делать нормировку? {0,1}"<<endl;
  221. cin>>bool_norm;
  222. if (bool_norm){
  223. double k = first_Norm(buff);
  224. Normirovka(buff, k);
  225. }
  226. Norm_prisvaivanie(buff_pred, buff);
  227. buff = matrix_multiplication(arr, buff);
  228. print_all_I_need(buff_pred,buff);
  229. lamd = scalar(buff, buff_pred, size) / scalar(buff_pred, buff_pred, size) ;
  230. cout<<lamd<<endl;
  231. }
  232. return lamd;
  233. }
  234.  
  235.  
  236. void print_all_I_need (double * buff_ppred,double * buff_pred,double * buff){
  237. cout<<"Наши значения y(k-1),y(k),y(k+1):"<<endl;
  238. Print_Vector(buff_ppred);
  239. cout<<"~~~~~~~~~~"<<endl;
  240. Print_Vector(buff_pred);
  241. cout<<"~~~~~~~~~~"<<endl;
  242. Print_Vector(buff);
  243. }
  244.  
  245. double Task_2_3(double **arr,double* y){
  246. iteration = 1;
  247. printf("~~~~ итерация № %d ~~~~\n",iteration);
  248. double lamd(0), pred_lambd(0);
  249. double * buff_ppred = y;
  250. double * buff =matrix_multiplication(arr, y);
  251. double * buff_pred =new double[size];
  252. Norm_prisvaivanie(buff_pred, buff);
  253. buff =matrix_multiplication(arr, buff_pred);
  254. print_all_I_need(buff_ppred,buff_pred,buff);
  255. lamd = sqrt(scalar(buff, buff_pred, size)/scalar(buff_pred, buff_ppred, size));
  256. cout<<lamd<<endl;
  257. while (abs(lamd-pred_lambd)>eps) {
  258. iteration ++;
  259. printf("~~~~ итерация № %d ~~~~\n",iteration);
  260. pred_lambd = lamd;
  261. bool bool_norm;
  262. cout<<"Будем делать нормировку? {0,1}"<<endl;
  263. cin>>bool_norm;
  264. if (bool_norm){
  265. double k = first_Norm(buff_pred);
  266. Normirovka(buff_pred, k);
  267. }
  268. Norm_prisvaivanie(buff_ppred, buff_pred);
  269. buff_pred =matrix_multiplication(arr, buff_ppred);
  270. buff = matrix_multiplication(arr, buff_pred);
  271. print_all_I_need(buff_ppred,buff_pred,buff);
  272. lamd = sqrt(scalar(buff, buff_pred, size)/scalar(buff_pred, buff_ppred, size));
  273. cout<<lamd<<endl;
  274. }
  275. return lamd;
  276. }
  277.  
  278.  
  279. int main() {
  280. srand(time(NULL));
  281. double ** matrix=new double *[size];
  282. for (int i = 0; i< size; ++i)
  283. matrix[i] = new double[size];
  284. for (int i = 0; i< size; ++i)
  285. for (int j =0;j<size;++j){
  286. cin>>matrix[i][j];
  287. }
  288. cout<<"Матрица c которой будем работать:"<<endl;
  289. Print_Matrix(matrix);
  290. //Start
  291. double ** buf=new double *[size];
  292. for (int i = 0; i< size; ++i)
  293. buf[i] = new double[size]{0};
  294. Norm_prisvaivanie(buf, matrix);
  295. Task_1(buf);
  296. cout<<"Количество итераций для вычисления = "<<iteration<<"."<<endl;
  297. //Task_2
  298. double * y = new double [size]{0};
  299. y[0] = 1;
  300. int choise;
  301. cout<<"У вас случай 1 и 2 или случай 3:"<<endl;
  302. cin>>choise;
  303. switch (choise) {
  304. case 1:
  305. {
  306. double p = Task_2_1_and_2(matrix, y);
  307. printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  308. break;
  309. }
  310. case 2:
  311. {
  312. double p = Task_2_1_and_2(matrix, y);
  313. printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  314. break;
  315.  
  316. }
  317. case 3:
  318. {
  319. double p = Task_2_3(matrix, y);
  320. printf("Максимальное по модулю собственное значение, полученное итерационно-степенным методом %10.15f.\n",p);
  321. break;
  322. }
  323. default:
  324. break;
  325. }
  326. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement