muMECH  1.0
matrix_vector.cpp
Go to the documentation of this file.
1 #include "matrix_vector.h"
2 
3 #include <math.h>
4 
5 
6 namespace mumech {
7 
8 
10 double vektor :: norma () const
11 {
12  long i;
13  double norma=0.0;
14 
15  for(i=0;i<p;i++)
16  norma+=v[i]*v[i];
17 
18  return sqrt(norma);
19 }
20 
23 {
24  if(r==3 && s==3){
25  int i,j;
26  double Det=d.Determinant_3x3();
27 
28  for(i=0;i<3;i++)
29  for(j=0;j<3;j++){
30  g(i,j)=1.0*pow(-1.0,i+j)*d.Determinant_3x3_doplnek(j,i)/Det;
31  }
32  }
33  else{
34  printf("\nCHYBA - spatny rozmer matice pro pouziti funkce inverze_3x3\n");
35  }
36 }
37 
39 void enter()
40 {
41  fflush(stdin);scanf("%*c");
42 }
43 
45 void e (int i)
46 {
47  printf("\n%d",i);fflush(stdin);scanf("%*c");printf("\n");
48 }
49 
50 
52 int MaticexVektor(vektor &res, matice &mat,vektor &vek)
53 {
54  if (mat.s != vek.p) return 0;
55  int u,r;
56  res.vynulovat();
57  for(u=0;u<mat.r;u++)for(r=0;r<mat.s;r++)res.v[u]+=mat.g(u,r)*vek.v[r];
58  return 1;
59 }
60 
63 {
64  int i;
65  if(a.p==b.p && b.p==c.p){
66  for(i=0;i<a.p;i++)c.v[i]=a.v[i]-b.v[i];
67  return 1;
68  }
69  return 0;
70 }
71 
73 void PrintVektor(vektor &vekt)
74 {
75  int u;
76  for(u=0;u<vekt.p;u++){
77  printf("%d) %4.4f\n",u,vekt.v[u]);
78  }
79  printf("\n");
80 }
81 
83 void PrintMatrix(matice &mat,FILE *&soubor)
84 {
85  int u,v;
86  for(u=0;u<mat.r;u++){
87  for(v=0;v<mat.s;v++){fprintf(soubor,"%5.4f ",mat.g(u,v));}
88  printf("\n");
89  }
90  printf("\n");
91 }
92 
94 void rotate_vector (vektor &V, double angle)
95 {
96  if (angle!=0.0) {
97  vektor zaloha(3);
98  matice A(3,3);
99  double c,s;
100 
101  c=cos(angle);
102  s=sin(angle);
103  A.g(0,0)=A.g(1,1)=c*c;
104  A.g(1,0)=A.g(0,1)=s*s;
105  A.g(2,2)=c*c-s*s;
106  A.g(0,2)=c*s;
107  A.g(1,2)=-c*s;
108  A.g(2,0)=-2.0*c*s;
109  A.g(2,1)=2.0*c*s;
110  V.g(2)*=2.0;
111  zaloha.rovna_se(V);
112  MaticexVektor(V,A,zaloha);
113  V.g(2)/=2.0;
114  }
115 }
117 void change_radky(vektor &a, vektor &b) {
118  vektor zaloha(a.p);
119  zaloha.rovna_se(a);
120  a.rovna_se(b);
121  b.rovna_se(zaloha);
122 }
124 void gaussovaEliminace(matice &m, vektor &right) {
125  if (m.r != m.s || right.p != m.r) { printf("Matice a vektor pro Gaussovu eliminaci nemaji odpovidajici rozmery."); }
126  int i, j, k, radku = m.r;
127  long double nasobitel, delitel;
128  bool found;
129  vektor *radek;
130  vektor zaloha(radku);
131  radek = new vektor[radku];
132  for (i = 0; i < radku; i++)radek[i].define(radku + 1);
133  for (i = 0; i < radku; i++)for (j = 0; j < radku; j++)radek[i].g(j) = 1.0*m.g(i, j);
134  for (i = 0; i < radku; i++)radek[i].g(radku) = 1.0*right.g(i);
135  for (i = 0; i < radku - 1; i++) {
136  if (radek[i].g(i) == 0.0) {
137  found = false;
138  k = i + 1;
139  while (found == false && k < radku) {
140  if (radek[k].g(i) != 0.0) {
141  change_radky(radek[i], radek[k]);
142  found = true;
143  }
144  k++;
145  }
146  if (k == radku && found == false) { printf("Error pri hledani nenuloveho prvku na diagonale."); enter();}
147  }
148  for (j = i + 1; j < radku; j++) {
149  if (radek[j].g(i) != 0.0) {
150  nasobitel = 1.0*radek[i].g(i);
151  delitel = 1.0*radek[j].g(i);
152  radek[j].krat(1.0*nasobitel);
153  radek[j].deleno(1.0*delitel);
154  radek[j].odecist(radek[i]);
155  }
156  }
157  }
158  //pod diagonalou nuly
159  for (i = 0; i < radku; i++) {
160  delitel = 1.0*radek[i].g(i);
161  radek[i].deleno(1.0*delitel);
162  }
163  //na diagonale jednicky
164  for (i = radku - 2; i > -1; i--) {
165  for (j = i + 1; j < radku; j++)radek[i].g(radku) -= radek[j].g(radku)*radek[i].g(j);
166  for (j = i + 1; j < radku; j++)radek[i].g(j) = 0.0;
167  }
168 
169  //pouze jednicky na diagonale
170 
171  /*for (i = 0; i < radku; i++){
172  for (j = 0; j < radku + 1; j++)printf("%5.3lf ",radek[i].g(j));
173  printf("\n");
174  }
175  enter();*/
176 
177 
178  for (i = 0; i < radku; i++)right.g(i) = radek[i].g(radku);
179 };
180 
181 } // namespace mumech
void rovna_se(vektor &co)
Definition: matrix_vector.h:35
Class vector and matrix.
void rotate_vector(vektor &V, double angle)
double & g(int radek, int sloupec)
Definition: matrix_vector.h:93
void inverze_3x3(matice &d)
int MaticexVektor(vektor &res, matice &mat, vektor &vek)
double & g(long i)
Definition: matrix_vector.h:38
void PrintMatrix(matice &mat, FILE *&soubor)
double Determinant_3x3_doplnek(int i, int j)
void change_radky(vektor &a, vektor &b)
void define(long n)
Definition: matrix_vector.h:37
int RozdilVektoru(vektor &a, vektor &b, vektor &c)
int odecist(vektor &co)
Definition: matrix_vector.h:58
void PrintVektor(vektor &vekt)
void gaussovaEliminace(matice &m, vektor &right)
double norma() const
void enter()
void deleno(long double cislo)
Definition: matrix_vector.h:59
double Determinant_3x3()
void krat(double cislo)
Definition: matrix_vector.h:36
void e(int i)