Advertisement
Guest User

koniec

a guest
Mar 30th, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4.  
  5. using namespace std;
  6.  
  7. int zliczacz(int &ile);
  8. double przepiszzpliku(double **tab, int ile, double *tab2);
  9. bool sprawdz(double **tab, int ile);
  10. double macierzD(double **tabD, int ile, double **tab);
  11. double odwrotnaD(double **tabD, int ile);
  12. double macierzLU(double **tabLU, int ile, double **tab);
  13. double mnozenie(double **tab, int ile, double **tabLU, double **tabD);
  14. double mnozenie2(double *tabdb, int ile, double *tab2, double **tabD);
  15. void czy(bool &wybor,int &iter,double &epsilon);
  16. double iks(double **tab, int ile, double **tab3, double **tabk,int iter,double epsilon,bool wybor, double **x);
  17. bool porownanie(double **tabk,double **x,double epsilon,int ile);
  18.  
  19. int main()
  20. {
  21. int ile = 0,iter=0;
  22. bool flaga = true, flaga1 = true, wybor=false;
  23. zliczacz(ile);
  24. double epsilon;
  25. // cout << "Linii jest: " << ile << endl;
  26.  
  27. double **tab = new double *[ile];
  28. // cout << "Flaga = " << flaga << endl;
  29.  
  30. double **tabD = new double *[ile];
  31. double **tabLU = new double *[ile];
  32. double **tab3 = new double *[ile];
  33. double **tabk = new double *[ile];
  34. double **x = new double *[ile];
  35. for (int i = 0; i < ile; i++)
  36. {
  37. tab[i] = new double [ile];
  38. tabD[i] = new double [ile];
  39. tabLU[i] = new double [ile];
  40. tab3[i] = new double [ile];
  41. tabk[i] = new double [ile];
  42. x[i] = new double [ile];
  43. }
  44.  
  45. double *tab2 = new double[ile];
  46. double *tabdb = new double[ile];
  47.  
  48. **tab = przepiszzpliku(tab, ile, tab2);
  49.  
  50. cout << "Wspolczynniki przy iksach (MACIERZ A) :" << endl;
  51. cout << endl;
  52.  
  53. for(int i = 0; i < ile; i++)
  54. {
  55. for(int j = 0; j < ile; j++)
  56. {
  57. cout << tab[i][j] << " ";
  58. }
  59. cout << endl;
  60.  
  61. }
  62.  
  63. cout << endl;
  64. cout << endl;
  65.  
  66. cout << "Wyrazy wolne (JEDNOKOLUMNOWA MACIERZ B) : " << endl;
  67. for(int i = 0; i < ile; i++)
  68. {
  69. cout << tab2[i] <<endl;
  70. }
  71.  
  72. cout << endl;
  73.  
  74. flaga1 = sprawdz(tab, ile);
  75. //cout << "Flaga1: " << flaga1 << endl;
  76. //flaga = flaga1;
  77. cout<<endl;
  78. if(flaga1)
  79. {
  80. **tabD = macierzD(tabD, ile, tab);
  81.  
  82. /* cout << endl;
  83. cout << endl;
  84. cout << "ELEMENTY MACIERZY D: " << endl;
  85.  
  86. for(int i = 0; i < ile; i++)
  87. {
  88. for(int j = 0; j < ile; j++)
  89. {
  90. cout << tabD[i][j] << " ";
  91. }
  92. cout << endl;
  93. }
  94. cout << endl;*/
  95.  
  96. **tabD = odwrotnaD(tabD, ile);
  97. /* cout << "ELEMENTY MACIERZY D^-1: " << endl;
  98. for(int i = 0; i < ile; i++)
  99. {
  100. for(int j = 0; j < ile; j++)
  101. {
  102. cout << tabD[i][j] << " ";
  103. }
  104. cout << endl;
  105. }
  106. cout << endl;*/
  107.  
  108. **tabLU = macierzLU(tabLU, ile, tab);
  109. /* cout << "ELEMENTY MACIERZY L+U: " << endl;
  110. for(int i = 0; i < ile; i++)
  111. {
  112. for(int j = 0; j < ile; j++)
  113. {
  114. cout << tabLU[i][j] << " ";
  115. }
  116. cout << endl;
  117. }
  118. cout << endl;*/
  119. for(int i = 0; i < ile; i++)
  120. {
  121. for(int j = 0; j < ile; j++)
  122. {
  123. tabD[i][j]=tabD[i][j]*(-1);
  124. }
  125. }
  126. **tab = mnozenie(tab, ile, tabLU, tabD);
  127. /* cout << "ELEMENTY MACIERZY TAB: " << endl;
  128. for(int i = 0; i < ile; i++)
  129. {
  130. for(int j = 0; j < ile; j++)
  131. {
  132. cout << tab[i][j] << " ";
  133. }
  134. cout << endl;
  135. }
  136. cout << endl;*/
  137. for(int i = 0; i < ile; i++)
  138. {
  139. for(int j = 0; j < ile; j++)
  140. {
  141. tabD[i][j]=tabD[i][j]*(-1);
  142. }
  143. }
  144. *tabdb = mnozenie2(tabdb, ile, tab2, tabD);
  145. /* cout << "ELEMENTY MACIERZY TABDB: " << endl;
  146. for(int i = 0; i < ile; i++)
  147. {
  148. cout << tabdb[i] <<endl;
  149. }
  150. cout << endl;*/
  151. for(int i = 0; i < ile; i++)
  152. {
  153. for(int j = 0; j < ile; j++)
  154. {
  155. x[i][j]=0;
  156. }
  157. }
  158. for(int i = 0; i < ile; i++)
  159. {
  160. for(int j = 0; j < ile; j++)
  161. {
  162. tab3[i][j]=0;
  163. }
  164. }
  165. for(int i = 0; i < ile; i++)
  166. {
  167. tab3[i][0]=tabdb[i];
  168. }
  169. /* cout << "ELEMENTY MACIERZY TAB3: " << endl;
  170. for(int i = 0; i < ile; i++)
  171. {
  172. for(int j = 0; j < ile; j++)
  173. {
  174. cout << tab3[i][j] << " ";
  175. }
  176. cout << endl;
  177. }
  178. cout << endl;
  179. */
  180. for(int i = 0; i < ile; i++)
  181. {
  182. for(int j = 0; j < ile; j++)
  183. {
  184. tabk[i][j]=0;
  185. }
  186. }
  187. czy(wybor,iter,epsilon);
  188. **tabk = iks(tab, ile, tab3,tabk,iter,epsilon,wybor,x);
  189. cout << "Wyniki: " << endl;
  190. for(int i = 0; i < ile; i++)
  191. {
  192. for(int j = 0; j < 1; j++)
  193. {
  194. cout <<"x"<<i+1<<"= " <<tabk[i][j] << " ";
  195. }
  196. }
  197. cout << endl;
  198. }
  199.  
  200.  
  201. //flaga = false;
  202.  
  203. return 0;
  204. }
  205. //*************************************************************************************
  206. int zliczacz(int &ile)
  207. {
  208. ifstream plik;
  209. string linia;
  210. plik.open("wspolczynniki.txt");
  211. if(plik.is_open())
  212. {
  213. while(!plik.eof())
  214. {
  215. getline(plik, linia);
  216. ile++;
  217. }
  218. //cout << "Zliczylo: " << ile << endl;
  219. }
  220. else
  221. cout << "Blad otwarcia pliku " << endl;
  222.  
  223. plik.close();
  224. }
  225. //*************************************************************************************
  226. double przepiszzpliku(double **tab, int ile, double *tab2)
  227. {
  228. ifstream plik;
  229. int k = 0;
  230. // cout << "TERAZ ILE = " << ile << endl;
  231. plik.open("wspolczynniki.txt");
  232. if(plik.is_open())
  233. {
  234. cin.clear();
  235. cin.sync();
  236. for(int i = 0; i < ile; i++)
  237. {
  238. for(int j = 0; j < ile + 1; j++)
  239. {
  240. if(j == ile)
  241. {
  242. plik >> tab2[k];
  243. k++;
  244. }
  245. else
  246. {
  247. plik >> tab[i][j];
  248. }
  249. }
  250. }
  251. }
  252. else
  253. cout << "Blad otwarcia pliku" << endl;
  254.  
  255. plik.close();
  256.  
  257. return **tab;
  258. }
  259. //*************************************************************************************
  260. bool sprawdz(double **tab, int ile)
  261. {
  262. bool flaga2 = true;
  263. int licznik = 0;
  264. int maks = ile-1;
  265. double suma1 = 0, suma2 = 0, suma3 = 0;
  266.  
  267. // cout << "Sprawdza czy spelnia warunki zbieznosci: " << endl;
  268.  
  269. for(int j = 0; j < ile; j++)
  270. {
  271. suma1 = suma1 + tab[maks][j];
  272. }
  273. suma1 = abs(suma1);
  274. for(int i=0; i < ile; i++)
  275. {
  276. suma2 = suma2 + tab[i][maks];
  277. }
  278. suma2 = abs(suma2);
  279. // cout << "Suma1 = " << suma1 << endl;
  280. // cout << "Suma2 = " << suma2 << endl;
  281.  
  282. for(int i = 0; i < ile; i++)
  283. {
  284. for(int j = 0; j < ile; j++)
  285. {
  286. suma3 = suma3 + tab[i][j];
  287. }
  288. }
  289.  
  290. suma3 = sqrt(abs(suma3*suma3));
  291. double pomoc=1;
  292. for(int i=0; i<ile; i++)
  293. {
  294. pomoc=pomoc*tab[i][i];
  295. }
  296.  
  297. //cout << "Suma3 = " << suma3 << endl;
  298. if(pomoc!=0)
  299. {
  300. if(suma1 < 1 || suma2 < 1 || suma3 < 1 )
  301. {
  302. flaga2 = true;
  303. }
  304. else
  305. flaga2 = false;
  306.  
  307. if(flaga2)
  308. {
  309. cout << "Spelnia warunki zbieznosci " << endl;
  310. }
  311. else
  312. cout << "Nie spelnia warunkow zbieznosci " << endl;
  313. }
  314. else
  315. {
  316. cout<<"Wyznacznik macierzy diagonalnej musi byc rozny od 0"<<endl;
  317. flaga2 = false;
  318. }
  319. return flaga2;
  320. }
  321. //*************************************************************************************
  322. double macierzD(double **tabD, int ile, double **tab)
  323. {
  324. for(int i = 0; i < ile; i++)
  325. {
  326. for(int j = 0; j < ile; j++)
  327. {
  328. if( i == j)
  329. {
  330. tabD[i][j] = tab[i][j];
  331. }
  332. else
  333. tabD[i][j] = 0;
  334. }
  335. }
  336. return **tabD;
  337. }
  338. //*************************************************************************************
  339. double odwrotnaD(double **tabD, int ile)
  340. {
  341. for(int i = 0; i < ile; i++)
  342. {
  343. for(int j = 0; j < ile; j++)
  344. {
  345. if( i == j)
  346. {
  347. tabD[i][j] = 1 / tabD[i][j];
  348. }
  349. }
  350. }
  351. return **tabD;
  352. }
  353. //*************************************************************************************
  354. double macierzLU(double **tabLU, int ile, double **tab)
  355. {
  356. for(int i = 0; i < ile; i++)
  357. {
  358. for(int j = 0; j < ile; j++)
  359. {
  360. if( i == j)
  361. {
  362. tabLU[i][j] = 0;
  363. }
  364. else
  365. tabLU[i][j] = tab[i][j];
  366. }
  367. }
  368. return **tabLU;
  369. }
  370. //************************************************************************************
  371. double mnozenie(double **tab, int ile, double **tabLU, double **tabD)
  372. {
  373. for(int i = 0; i < ile; i++)
  374. {
  375. for(int j = 0; j < ile; j++)
  376. {
  377. tab[i][j]=0;
  378. }
  379. }
  380.  
  381. for(int i = 0; i < ile; i++)
  382. {
  383. for(int j = 0; j < ile; j++)
  384. {
  385. for(int k = 0; k < ile; k++)
  386. {
  387. tab[i][j]=tab[i][j]+tabD[i][k]*tabLU[k][j];
  388. }
  389. }
  390. }
  391.  
  392. return **tab;
  393. }
  394. //*********************************************************************************
  395. double mnozenie2(double *tabdb, int ile, double *tab2, double **tabD)
  396. {
  397.  
  398. for(int j = 0; j < ile; j++)
  399. {
  400. tabdb[j]=0;
  401. }
  402.  
  403.  
  404. for(int i = 0; i < ile; i++)
  405. {
  406. tabdb[i] = tabdb[i] + tabD[i][i] * tab2[i];
  407. }
  408.  
  409. return *tabdb;
  410. }
  411. //*******************************************************************************
  412. void czy(bool &wybor,int &iter,double &epsilon)
  413. {
  414. int a;
  415. cout<<"1 - iteracje"<<endl;
  416. cout<<"2 - epsilon";
  417. cin>>a;
  418. switch (a)
  419. {
  420. case 1:
  421. cout<<"Podaj ilosc iteracji";
  422. cin>>iter;
  423. wybor=true;
  424. break;
  425. case 2:
  426. cout<<"Podaj epsilon";
  427. cin>>epsilon;
  428. break;
  429. }
  430. }
  431.  
  432. double iks(double **tab, int ile, double **tab3, double **tabk,int iter,double epsilon,bool wybor, double **x)
  433. {
  434. bool doep=true;
  435.  
  436. if(wybor)
  437. {
  438. for(int k=0; k<iter; k++)
  439. {
  440. **tabk=mnozenie(tabk,ile,x,tab);
  441. for(int i = 0; i < ile; i++)
  442. {
  443. for(int j = 0; j < ile; j++)
  444. {
  445.  
  446. tabk[i][j]=tabk[i][j]+tab3[i][j];
  447. }
  448. }
  449. for(int i = 0; i < ile; i++)
  450. {
  451. for(int j = 0; j < ile; j++)
  452. {
  453.  
  454. x[i][j]=tabk[i][j];
  455. }
  456. }
  457. }
  458. }
  459. else
  460. {
  461. while(doep)
  462. {
  463. **tabk=mnozenie(tabk,ile,x,tab);
  464. for(int i = 0; i < ile; i++)
  465. {
  466. for(int j = 0; j < ile; j++)
  467. {
  468.  
  469. tabk[i][j]=tabk[i][j]+tab3[i][j];
  470. }
  471. }
  472. if(porownanie(tabk,x,epsilon,ile))
  473. {
  474. doep=false;
  475. }
  476.  
  477. for(int i = 0; i < ile; i++)
  478. {
  479. for(int j = 0; j < ile; j++)
  480. {
  481.  
  482. x[i][j]=tabk[i][j];
  483. }
  484. }
  485.  
  486. }
  487. for(int i = 0; i < ile; i++)
  488. {
  489. for(int j = 0; j < ile; j++)
  490. {
  491.  
  492. x[i][j]=tabk[i][j];
  493. }
  494. }
  495. }
  496.  
  497.  
  498. return **tabk;
  499. }
  500. bool porownanie(double **tabk,double **x,double epsilon,int ile)
  501. {
  502. double pom;
  503. bool pom2;
  504. for(int i=0; i<ile; i++)
  505. {
  506. pom=tabk[i][0]-x[i][0];
  507. pom=abs(pom);
  508. if(pom>epsilon)
  509. {
  510. pom2=false;
  511. }
  512. else pom2=true;
  513.  
  514. }
  515. return pom2;
  516. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement