It is necessary to calculate the condition number of the matrix by definition and give a lower estimate for this number (that is, an experimental estimate).
The condition number by definition: condA = || A ^ (- 1) || * || A ||. The fact is that before this task, the program implemented the Gauss method for solving the SLAE and the qr-decomposition method. To reverse the matrix (and a 4x4 matrix is ββgiven), then I simply solve four equations, where the right side is first (1,0,0,0), (0,1,0,0), (0,0,1,0) , (0,0,0,1). I get the inverse matrix, multiply by the original and get the unit. Everything would be fine, but we picked up a matrix in which it is with the type of "float" that the multiplication is not single. With the type of "double" everything is good, but it is with "float" - nonsense.
The matrix itself (also in the readable file):
0.2910 1.8100 9.3110 9.1100 4.2280 1.4500 8.5790 44.1950 42.9950 20.4290 -0.2900 -1.7980 -9.2500 -9.0500 -4.2080 0.0000 0.0820 0.4100 0.4500 0.1220 By multiplying the original matrix (see above) and the inverse, it turns out that the matrix is ββnot exactly the same (in some places the numbers in the spirit of 0.06, etc.) emerge. Once again, this happens only with the type "float". For the code, I ask you not to scold too much, I know that it is heavily cluttered.
#include <iostream> #include <iomanip> #include <cmath> #include <fstream> #include <float.h> using namespace std; typedef float tdouble; const tdouble eps = 1e-16; //ΠΏΡΠΈ 1e-8 DATA9 Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ const unsigned n = 4; void product(tdouble**, tdouble*, tdouble*); void product(tdouble**, tdouble**, tdouble**); void output(tdouble**, tdouble*); void output(tdouble*); void output(tdouble **); void changing(tdouble**, tdouble*, int, int); bool gausss(tdouble**, tdouble*); void qr(tdouble**, tdouble*, tdouble**); void qr(tdouble**, tdouble*, tdouble*, tdouble*, tdouble*, tdouble**); void reverse(tdouble**, tdouble*, tdouble*); void spherical(tdouble*, tdouble*)ΠΆ tdouble octahedron(tdouble*); tdouble octahedron(tdouble*, tdouble*); tdouble cubic(tdouble*, tdouble*); tdouble cubic(tdouble *); tdouble cubic_matrix(tdouble **); tdouble octah_matrix(tdouble **); int main() { setlocale(LC_ALL, "Russian"); tdouble **mtx, **mtxun, *vect, *vectun; mtx = new tdouble *[n]; //ΠΌΠ°ΡΡΠΈΠ² ΡΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΉ mtxun = new tdouble *[n]; //Π½Π΅ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ ΠΌΠ°ΡΡΠΈΡΠ° vect = new tdouble[n]; vectun = new tdouble[n]; ifstream filemat; filemat.open("U:\\FS13\\FS2-x3\\Melikhov\\Metody_vych\\LLaba1 \\DATA9.txt"); for (int i = 0; i < n; i++) { mtxun[i] = new tdouble[n]; mtx[i] = new tdouble[n]; for (int j = 0; j < n + 1; j++) { filemat >> (j == 4 ? vect[i] : mtx[i][j]); //Π΅ΡΠ»ΠΈ j == 4 ? vectun[i] = vect[i] : mtxun[i][j] = mtx[i][j]; } } filemat.close(); cout << "\t\tΠΡΠ²ΠΎΠ΄ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ ΠΈ Π²Π΅ΠΊΡΠΎΡΠ° ΠΏΡΠ°Π²ΠΎΠΉ ΡΠ°ΡΡΠΈ" << endl << endl; output(mtx, vect); //Π²ΡΠ²ΠΎΠ΄ Π½Π° ΡΠΊΡΠ°Π½ ΠΌΠ°ΡΡΠΈΡΡ ΠΈ ΠΏΡΠ°Π²ΠΎΠ³ΠΎ Π²Π΅ΠΊΡΠΎΡ //ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π²ΡΡΠΎΠΆΠ΄Π΅Π½Π½ΠΎΡΡΡ bool h = gausss(mtx, vect); tdouble product_diagonal_elements = mtx[0][0]; //ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² (Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΡΠΎΠΆΠ΄Π΅Π½Π½ΠΎΡΡΠΈ) for (int i = 1; i < n; i++) product_diagonal_elements *= mtx[i][i]; if (!h || abs(product_diagonal_elements) < eps) //Π΅ΡΠ»ΠΈ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡΠ½ΡΡ
ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΌΠ΅Π½ΡΡΠ΅ ΡΠΏΡΠΈΠ»ΠΎΠ½, ΡΠΎ Π²ΡΠ²ΠΎΠ΄ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ { cout << "ΠΠ°ΡΡΠΈΡΠ° Π²ΡΡΠΎΠΆΠ΄Π΅Π½Π½Π°Ρ. ΠΠΎ ΡΠ²ΠΈΠ΄Π°Π½ΠΈΡ!"; } else //ΠΈΠ½Π°ΡΠ΅ { tdouble *sol = new tdouble[n], *check = new tdouble[n]; tdouble *sin1 = new tdouble[n], *sin2 = new tdouble[n], *sin3 = new tdouble[n], *sin4 = new tdouble[n]; //Π΅Π΄ΠΈΠ½ΠΈΡΠ½Π°Ρ ΠΏΡΠ°Π²Π°Ρ ΡΠ°ΡΡΡ tdouble *solr1 = new tdouble[n], *solr2 = new tdouble[n], *solr3 = new tdouble[n], *solr4 = new tdouble[n]; //ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠΉ ΠΏΡΠ°Π²ΠΎΠΉ ΡΠ°ΡΡΡΡ tdouble *solv1 = new tdouble[n], *solv2 = new tdouble[n], *solv3 = new tdouble[n], *solv4 = new tdouble[n]; //ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Ρ Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΠΎΠΉ ΠΏΡΠ°Π²ΠΎΠΉ ΡΠ°ΡΡΡΡ tdouble **mtxrev = new tdouble*[n]; //ΠΎΠ±ΡΠ°ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ° tdouble nun_cub, nrev_cub, condex_cub; //Π½ΠΎΡΠΌΠ° ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ, Π½ΠΎΡΠΌΠ° ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ, ΡΠΈΡΠ»ΠΎ ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΠΎΡΡΠΈ tdouble nun_oct, nrev_oct, condex_oct; for (int i = 0; i < n; i++) { (i == 0 ? sin1[i] = 1 : sin1[i] = 0); (i == 1 ? sin2[i] = 1 : sin2[i] = 0); (i == 2 ? sin3[i] = 1 : sin3[i] = 0); (i == 3 ? sin4[i] = 1 : sin4[i] = 0); } //ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ Π²ΠΈΠ΄Ρ mtx ΠΈ vect tdouble **T = new tdouble*[n], **mtxcheck = new tdouble*[n]; //ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΌΠ°ΡΡΠΈΠ² T - Π΅Π΄ΠΈΠ½ΠΈΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ. ΠΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΌΠ°ΡΡΠΈΡΡ Q for (int i = 0; i < n; i++) { T[i] = new tdouble[n]; mtxrev[i] = new tdouble[n]; mtxcheck[i] = new tdouble[n]; for (int j = 0; j < n; j++) { T[i][j] = (i == j ? 1 : 0); //Π΅ΡΠ»ΠΈ i=j, ΡΠΎΠ³Π΄Π° ΠΏΡΠΈΡΠ²Π°Π΅ΠΌ 1, ΠΈΠ½Π°ΡΠ΅ - 0 mtx[i][j] = mtxun[i][j]; //Π² mtx Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π½Π΅ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ mtxun Π΄Π»Ρ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ²ΠΎΠΉ } vect[i] = vectun[i]; //Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Ρ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ } //QR-ΠΌΠ΅ΡΠΎΠ΄ qr(mtx, vect, sin1, sin2, sin3, sin4, T); ////Π’ΡΠ°Π½ΡΠΏΠΎΠ½ΠΈΡΡΠ΅ΠΌ T Π² Q, ΡΠΎΠ·Π΄Π°Π΅ΠΌ ΠΌΠ°ΡΡΠΈΠ² A tdouble **Q = new tdouble*[n], **A = new tdouble*[n]; for (int i = 0; i < n; i++) { Q[i] = new tdouble[n]; A[i] = new tdouble[n]; for (int j = 0; j < n; j++) Q[i][j] = T[j][i]; } //ΠΠ°Ρ
ΠΎΠ΄ΠΈΠΌ ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΡΡ reverse(mtx, sin1, solr1); reverse(mtx, sin2, solr2); reverse(mtx, sin3, solr3); reverse(mtx, sin4, solr4); for (int j = 0; j < n; j++) { for (int i = 0; i < n; i++) { if (j == 0) mtxrev[i][j] = solr1[i]; else if (j == 1) mtxrev[i][j] = solr2[i]; else if (j == 2) mtxrev[i][j] = solr3[i]; else if (j == 3) mtxrev[i][j] = solr4[i]; } } cout << "ΠΠ±ΡΠ°ΡΠ½Π°Ρ ΠΌΠ°ΡΡΠΈΡΠ°" << endl; output(mtxrev); product(mtxun, mtxrev, mtxcheck); cout << "ΠΡΠΎΠ²Π΅ΡΠΊΠ°" << endl; output(mtxcheck); cout << endl << endl << "ΠΡΠ±ΠΈΡΠ΅ΡΠΊΠ°Ρ Π½ΠΎΡΠΌΠ°" << endl; nun_cub = cubic_matrix(mtxun); nrev_cub = cubic_matrix(mtxrev); condex_cub = nun_cub * nrev_cub; cout << endl << "ΠΠΎΡΠΌΠ° ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ = " << nun_cub << endl << "ΠΠΎΡΠΌΠ° ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ = " << nrev_cub << endl << "ΠΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½ΠΎΡΠΌ = " << condex_cub << endl; cout << endl << endl << "ΠΠΊΡΠ°ΡΠ΄ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π½ΠΎΡΠΌΠ°" << endl; nun_oct = octah_matrix(mtxun); nrev_oct = octah_matrix(mtxrev); condex_oct = nun_oct * nrev_oct; cout << endl << "ΠΠΎΡΠΌΠ° ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ = " << nun_oct << endl << "ΠΠΎΡΠΌΠ° ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΡΠΈΡΡ = " << nrev_oct << endl << "ΠΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π½ΠΎΡΠΌ = " << condex_oct << endl; //ΠΠ±ΡΠ°ΡΠ½ΡΠΉ Ρ
ΠΎΠ΄ reverse(mtx, vect, sol); tdouble n_dx, n_db, //Π½ΠΎΡΠΌΡ ΡΠ°Π·Π½ΠΎΡΡΠ΅ΠΉ dx, db nx_d, nb_d, //Π½ΠΎΡΠΌΡ Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ
, b n_x, n_b; //Π½ΠΎΡΠΌΡ x ΠΈ b tdouble max_div, norm_div; //ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ Π΄Π΅Π»Π΅Π½ΠΈΡ, Π½ΠΎΡΠΌΠ° Π΄Π΅Π»Π΅Π½ΠΈΡ tdouble o_dx, o_db, ox_d, ob_d, o_x, o_b, maxo_div, normo_div; //ΠΎΠΊΡΠ°ΡΠ΄ΡΠΈΡΠ΅ΡΠΊΠ°Ρ n_x = cubic(sol); o_x = octahedron(sol); //cout << endl << "n_x " << n_x << endl; n_b = cubic(vectun); o_b = octahedron(vectun); //cout << endl << "n_b " << n_b << endl; max_div = 0; maxo_div = 0; //ΠΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ ΠΊ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠΌΡ Π²ΠΈΠ΄Ρ vect ΠΈ mtx for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) mtx[i][j] = mtxun[i][j]; vect[i] = vectun[i]; } for (int i = 0; i < n; i++) { vect[i] += 0.01; //Π²ΠΎΠ·ΠΌΡΡΠ°Π΅ΠΌ i-ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π²Π΅ΠΊΡΠΎΡΠ° vect //cout << "VECT" << endl; //output(vect); n_db = cubic(vect, vectun); o_db = octahedron(vect, vectun); //cout << endl << "n_db " << n_db << endl; qr(mtx, vect, T); reverse(mtx, vect, solv1); //cout << endl; output(solv1); cout << endl; for (int k = 0; k < n; k++) { for (int j = 0; j < n; j++) mtx[k][j] = mtxun[k][j]; vect[k] = vectun[k]; } n_dx = cubic(solv1, sol); o_dx = octahedron(solv1, sol); //cout << endl << "n_dx " << n_dx << endl; nx_d = n_dx / n_x; ox_d = o_dx / o_x; //cout << endl << "nx_d " << nx_d << endl; nb_d = n_db / n_b; ob_d = o_db / o_b; //cout << endl << "nb_d " << nb_d << endl; norm_div = nx_d / nb_d; normo_div = ox_d / ob_d; //cout << endl << "norm_div " << norm_div << endl; if (max_div < norm_div) max_div = norm_div; if (maxo_div < norm_div) maxo_div = normo_div; } cout << endl << "ΠΡΠ΅Π½ΠΊΠ° ΡΠ½ΠΈΠ·Ρ (ΠΊΡΠ±ΠΈΡΠ΅ΡΠΊΠ°Ρ Π½ΠΎΡΠΌΠ°): " << max_div << endl; cout << endl << "ΠΡΠ΅Π½ΠΊΠ° ΡΠ½ΠΈΠ·Ρ (ΠΎΠΊΡΠ°ΡΠ΄ΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π½ΠΎΡΠΌΠ°): " << maxo_div << endl; delete[] sin1; delete[] sin2; delete[] sin3; delete[] sin4; delete[] check; delete[] sol; for (int i = 0; i < n; i++) { delete[] A[i]; delete[] Q[i]; delete[] T[i]; } delete[] A; delete[] Q; delete[] T; } cin.get(); delete[] vect; delete[] vectun; for (int i = 0; i < n; i++) { delete[] mtx[i]; delete[] mtxun[i]; } delete[] mtx; delete[] mtxun; } void reverse(tdouble **mtx, tdouble *vect, tdouble *sol) { //ΠΠ±ΡΠ°ΡΠ½ΡΠΉ Ρ
ΠΎΠ΄/ for (int i = n - 1; i >= 0; i--) { tdouble temp = 0; for (int j = i + 1; j < n; j++) //ΡΠΈΠΊΠ» Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ ΡΠ°Π·Π° Π½Π΅ ΠΏΡΠΎΠΉΠ΄Π΅Ρ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΡΡΠΎΠΉ ΠΌΠ°ΡΡΠΈΠ² sol[j] ΡΠ΅Π±Ρ Π½Π΅ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ ΡΠ½Π°ΡΠ°Π»Π°, Π° ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΈΡΠ΅ΡΠ°ΡΠΈΠΈ Π²Π½Π΅ΡΠ½Π΅Π³ΠΎ ΡΠΈΠΊΠ»Π° temp += mtx[i][j] * sol[j]; sol[i] = (vect[i] - temp) / mtx[i][i]; } } bool gausss(tdouble **mtx, tdouble *vect) { tdouble c; //ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½Ρ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ for (int j = 0; j < n; j++) //Π΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ { tdouble temp = abs(mtx[j][j]); //ΠΈΡΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ Π² ΡΡΠΎΠ»Π±ΡΠ΅, Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Ρ j,j-ΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ (ΠΈΡΠ΅ΠΌ Π²ΡΠ΅Π³Π΄Π° Π½Π° Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΠΈ ΠΈ Π½ΠΈΠΆΠ΅) int mem = j; //ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄Π»Ρ Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΡ Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΡΠΎΠΊΠΈ, Π³Π΄Π΅ ΠΈΡΠ΅ΡΡΡ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ for (int i = j + 1; i < n; i++) //ΠΎΡ j+1, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΠ΄ Π΄ΠΈΠ°Π³ΠΎΠ½Π°Π»ΡΡ ΠΈΡΠ΅ΠΌ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ if (temp < abs(mtx[i][j])) { temp = abs(mtx[i][j]); //Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Π½ΠΎΠ²ΡΠΉ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ mem = i; //Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ ΡΡΡΠΎΠΊΡ } if (temp < eps) return false; //Π΅ΡΠ»ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΡΡΠ°Π²Π½ΠΈΠΌ Ρ Π½ΡΠ»Π΅ΠΌ, ΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ false, ΡΠΎ Π΅ΡΡΡ Π΄Π°Π»ΡΡΠ΅ ΡΠ°Π±ΠΎΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π±Π΅ΡΡΠΌΡΡΠ»Π΅Π½Π½Π° changing(mtx, vect, mem, j); //ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΡΡΡΠΎΠΊΠΈ for (int i = j + 1; i < n; i++) //ΡΠΈΠΊΠ» Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ { c = mtx[i][j] / mtx[j][j]; for (int k = j; k < n; k++) mtx[i][k] -= c * mtx[j][k]; //ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°Π΅ΠΌ i-Ρ ΡΡΡΠΎΠΊΡ Π² ΠΌΠ°ΡΡΠΈΡΠ΅ (Π»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ)... vect[i] -= c * vect[j]; //... ΠΈ Π² Π²Π΅ΠΊΡΠΎΡΠ΅ } } return true; //Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌ ΠΈΡΡΠΈΠ½Ρ } void qr(tdouble **mtx, tdouble *vect, tdouble **T) //ΠΏΡΠΈΠ½ΡΠΈΠΏ: ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΡΡΡΠΎΠΊΠΈ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π½Π΅ Π±ΡΠ»ΠΎ Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π° Π½ΠΎΠ»Ρ. ΠΠ°ΡΠ΅ΠΌ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΠΈ Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ { //QR-ΠΌΠ΅ΡΠΎΠ΄ for (int k = 0; k < n; k++) //ΠΈΠ΄Π΅ΠΌ ΠΏΠΎ ΡΡΡΠΎΠΊΠ΅ { //int z = k; //Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΠΎΠΊΠΈ //while (abs(mtx[z][k]) < eps && z < n) //ΠΏΠΎΠΊΠ° Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ z, Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡΡΡ ΡΡΡΠΎΠΊΡ. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π²ΡΡ
ΠΎΠ΄ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΌΠ°ΡΡΠΈΠ²Π°. // z++; //if (z != k) // changing(mtx, vect, z, k); tdouble c, s, temp_sqr; //c,s - ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ, temp_sqr - Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΠΊΠΎΡΠ΅Π½Ρ for (int i = k + 1; i < n; i++) //ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ Π½Π° ΡΡΡΠΎΡΠΊΡ Π²Π½ΠΈΠ· ΠΈ ΡΡΠΈΡΠ°Π΅ΠΌ: { //ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² if (abs(mtx[i][k]) < eps) continue; temp_sqr = sqrt(mtx[k][k] * mtx[k][k] + mtx[i][k] * mtx[i][k]); c = mtx[k][k] / temp_sqr; s = mtx[i][k] / temp_sqr; tdouble temp, tempT; for (int j = 0; j < n; j++)//k { //Π·Π°ΠΌΠ΅Π½Π° Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ tempT = T[k][j]; T[k][j] = c * T[k][j] + s * T[i][j]; T[i][j] = -s * tempT + c * T[i][j]; if (j >= k) // ΡΡΠΎΠ±Ρ Π»ΠΈΡΠ½ΠΈΠΉ ΡΠ°Π· Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°ΡΡ Π½ΡΠ»ΠΈ { temp = mtx[k][j]; //ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΡ ΡΡΡΠΎΠΊΡ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ mtx[k][j] = c * mtx[k][j] + s * mtx[i][j]; //Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ k-Ρ ΡΡΡΠΎΠΊΡ Π½Π° Π»ΠΊ Ρ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠ°ΠΌΠΈ c ΠΈ s mtx[i][j] = -s * temp + c * mtx[i][j]; //Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ j-Ρ ΡΡΡΠΎΠΊΡ Π½Π° Π»ΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ k-ΠΉ ΡΡΡΠΎΠΊΠΈ } } //Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Ρ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ ΠΏΡΠ°Π²ΠΎΠΉ ΡΠ°ΡΡΠΈ temp = vect[k]; vect[k] = c * vect[k] + s * vect[i]; vect[i] = -s * temp + c * vect[i]; } } } void qr(tdouble **mtx, tdouble *vect, tdouble *sin1, tdouble *sin2, tdouble *sin3, tdouble *sin4, tdouble **T) //ΠΏΡΠΈΠ½ΡΠΈΠΏ: ΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΌΠ΅ΡΡΠ°ΠΌΠΈ ΡΡΡΠΎΠΊΠΈ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ Π½Π΅ Π±ΡΠ»ΠΎ Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π° Π½ΠΎΠ»Ρ. ΠΠ°ΡΠ΅ΠΌ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ ΠΈ Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΡΡΠΎΠΊΠΈ Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ { //QR-ΠΌΠ΅ΡΠΎΠ΄ for (int k = 0; k < n; k++) //ΠΈΠ΄Π΅ΠΌ ΠΏΠΎ ΡΡΡΠΎΠΊΠ΅ { //int z = k; //Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Π½ΠΎΠΌΠ΅Ρ ΡΡΡΠΎΠΊΠΈ //while (abs(mtx[z][k]) < eps && z < n) //ΠΏΠΎΠΊΠ° Π½ΡΠ»Π΅Π²ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅ΠΌ z, Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°ΡΡΡΡ ΡΡΡΠΎΠΊΡ. Π’Π°ΠΊΠΆΠ΅ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΡΡΡ Π²ΡΡ
ΠΎΠ΄ Π·Π° ΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΌΠ°ΡΡΠΈΠ²Π°. // z++; //if (z != k) // changing(mtx, vect, z, k); tdouble c, s, temp_sqr; //c,s - ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΡ, temp_sqr - Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ ΠΊΠΎΡΠ΅Π½Ρ for (int i = k + 1; i < n; i++) //ΡΠ΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ Π½Π° ΡΡΡΠΎΡΠΊΡ Π²Π½ΠΈΠ· ΠΈ ΡΡΠΈΡΠ°Π΅ΠΌ: { //ΠΏΠΎΠ΄ΡΡΠ΅Ρ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠΎΠ² if (abs(mtx[i][k]) < eps) continue; temp_sqr = sqrt(mtx[k][k] * mtx[k][k] + mtx[i][k] * mtx[i][k]); c = mtx[k][k] / temp_sqr; s = mtx[i][k] / temp_sqr; tdouble temp, tempT; for (int j = 0; j < n; j++)//k { //Π·Π°ΠΌΠ΅Π½Π° Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ tempT = T[k][j]; T[k][j] = c * T[k][j] + s * T[i][j]; T[i][j] = -s * tempT + c * T[i][j]; if (j >= k) // ΡΡΠΎΠ±Ρ Π»ΠΈΡΠ½ΠΈΠΉ ΡΠ°Π· Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΡΠΈΡΡΠ²Π°ΡΡ Π½ΡΠ»ΠΈ { temp = mtx[k][j]; //ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΡΡ ΡΡΡΠΎΠΊΡ Π²ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ mtx[k][j] = c * mtx[k][j] + s * mtx[i][j]; //Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ k-Ρ ΡΡΡΠΎΠΊΡ Π½Π° Π»ΠΊ Ρ ΠΊΠΎΡΡΡΠΈΡΠΈΠ΅Π½ΡΠ°ΠΌΠΈ c ΠΈ s mtx[i][j] = -s * temp + c * mtx[i][j]; //Π·Π°ΠΌΠ΅Π½ΡΠ΅ΠΌ j-Ρ ΡΡΡΠΎΠΊΡ Π½Π° Π»ΠΊ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎΠΉ k-ΠΉ ΡΡΡΠΎΠΊΠΈ } } //Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Ρ Π²Π΅ΠΊΡΠΎΡΠΎΠΌ ΠΏΡΠ°Π²ΠΎΠΉ ΡΠ°ΡΡΠΈ temp = vect[k]; vect[k] = c * vect[k] + s * vect[i]; vect[i] = -s * temp + c * vect[i]; temp = sin1[k]; sin1[k] = c * sin1[k] + s * sin1[i]; sin1[i] = -s * temp + c * sin1[i]; temp = sin2[k]; sin2[k] = c * sin2[k] + s * sin2[i]; sin2[i] = -s * temp + c * sin2[i]; temp = sin3[k]; sin3[k] = c * sin3[k] + s * sin3[i]; sin3[i] = -s * temp + c * sin3[i]; temp = sin4[k]; sin4[k] = c * sin4[k] + s * sin4[i]; sin4[i] = -s * temp + c * sin4[i]; } } } void product(tdouble **mtx, tdouble *sol, tdouble *check) { for (int i = 0; i < n; i++) //ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΡΡΠΎΠΊΡ { check[i] = 0; for (int j = 0; j < n; j++) //Π΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ ΠΈ.... check[i] += mtx[i][j] * sol[j]; //ΠΏΠ΅ΡΠ΅ΠΌΠ½ΠΎΠΆΠ°Π΅ΠΌ } } void product(tdouble **mtxun, tdouble **mtxrev, tdouble **mtxcheck) { for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) mtxcheck[i][j] = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { for (int m = 0; m < n; m++) { mtxcheck[i][j] += mtxun[i][m] * mtxrev[m][j]; } } } } void output(tdouble *sol) { for (int i = 0; i < n; i++) cout << fixed << setprecision(4) << setw(42) << sol[i] << endl; } void output(tdouble **mtx, tdouble *vect) { for (int i = 0; i < n; i++) //ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΡΡΠΎΠΊΡ { for (int j = 0; j < n + 1; j++) //ΠΏΠΎΠ΅Ρ
Π°Π»ΠΈ ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ cout << fixed << setprecision(4) << setw(14) << (j == n ? vect[i] : mtx[i][j]); //Π΅ΡΠ»ΠΈ j==n, ΡΠΎ Π²ΡΠ²Π΅ΡΡΠΈ Π²Π΅ΠΊΡΠΎΡ (ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΡΠΎΠ»Π±Π΅Ρ), ΠΈΠ½Π°ΡΠ΅ - ΠΌΠ°ΡΡΠΈΡΡ cout << endl; } } void output(tdouble **mtx) { for (int i = 0; i < n; i++) //ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΡΡΠΎΠΊΡ { for (int j = 0; j < n; j++) //ΠΏΠΎΠ΅Ρ
Π°Π»ΠΈ ΠΏΠΎ ΡΡΠΎΠ»Π±ΡΠ°ΠΌ cout << fixed << setprecision(4) << setw(14) << mtx[i][j]; //Π΅ΡΠ»ΠΈ j==n, ΡΠΎ Π²ΡΠ²Π΅ΡΡΠΈ Π²Π΅ΠΊΡΠΎΡ (ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΡΠΎΠ»Π±Π΅Ρ), ΠΈΠ½Π°ΡΠ΅ - ΠΌΠ°ΡΡΠΈΡΡ cout << endl; } } void changing(tdouble **mtx, tdouble *vect, int line1, int line2) { tdouble *t = mtx[line2]; //Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ Π°Π΄ΡΠ΅Ρ mtx[line2] = mtx[line1]; mtx[line1] = t; tdouble r = vect[line2]; vect[line2] = vect[line1]; vect[line1] = r; } void spherical(tdouble *vectun, tdouble *check) { tdouble diff, diff2 = diff = 0.0; for (int i = 0; i < n; i++) { diff += (vectun[i] - check[i]) * (vectun[i] - check[i]); diff2 += vectun[i] * vectun[i] - 2 * vectun[i] * check[i] + check[i] * check[i]; } cout << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΡΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << ' ' << setw(14) << diff2 << endl; //os << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΡΡΠ΅ΡΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << ' ' << setw(14) << diff2 << endl; } tdouble octahedron(tdouble *vectun) { tdouble diffo_2 = 0.0; for (int i = 0; i < n; i++) diffo_2 += abs(vectun[i]); //cout << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΠΎΠΊΡΠ°ΡΠ΄ΡΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << endl; return diffo_2; // os << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΠΎΠΊΡΠ°ΡΠ΄ΡΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << endl; } tdouble octahedron(tdouble *vectun, tdouble *check) { tdouble diffo_1 = 0.0; for (int i = 0; i < n; i++) diffo_1 += abs(vectun[i] - check[i]); //cout << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΠΎΠΊΡΠ°ΡΠ΄ΡΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << endl; return diffo_1; // os << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΠΎΠΊΡΠ°ΡΠ΄ΡΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << endl; } tdouble cubic(tdouble *vectun, tdouble *check) { tdouble diffc_1 = abs(vectun[0] - check[0]); //ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΡΠ΅ΡΡΡ => Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΡΠ°ΠΌΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΡΠ°Π·Π½ΠΎΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Ρ Π½Π΅ΠΉ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ for (int i = 1; i < n; i++) { if (diffc_1 < abs(vectun[i] - check[i])) diffc_1 = abs(vectun[i] - check[i]); } // cout << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΠΊΡΠ±ΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << endl; return diffc_1; //os << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΠΊΡΠ±ΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << endl; } tdouble cubic(tdouble *vectun) { tdouble diffc_2 = abs(vectun[0]); //ΠΌΠ°ΠΊΡΠΈΠΌΡΠΌ ΠΌΠΎΠ΄ΡΠ»Ρ ΠΈΡΠ΅ΡΡΡ => Π·Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅ΠΌ ΡΠ°ΠΌΡΡ ΠΏΠ΅ΡΠ²ΡΡ ΡΠ°Π·Π½ΠΎΡΡΡ, Π° Π·Π°ΡΠ΅ΠΌ Ρ Π½Π΅ΠΉ ΡΡΠ°Π²Π½ΠΈΠ²Π°Π΅ΠΌ for (int i = 1; i < n; i++) { if (diffc_2 < abs(vectun[i])) diffc_2 = abs(vectun[i]); } // cout << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΠΊΡΠ±ΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << endl; return diffc_2; //os << scientific << endl << "\t\t\t\tΠΠ΅Π²ΡΠ·ΠΊΠ° ΠΊΡΠ±ΠΈΡΠ΅ΡΠΊΠ°Ρ" << endl << setw(14) << diff << endl; } tdouble cubic_matrix(tdouble **mtxun) { tdouble norm = 0; tdouble maxn = norm; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) norm += abs(mtxun[i][j]); if (norm > maxn) maxn = norm; norm = 0; } norm= maxn; return norm; } tdouble octah_matrix(tdouble **mtxun) { tdouble norm = 0; tdouble maxn = norm; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) norm += abs(mtxun[j][i]); if (norm > maxn) maxn = norm; norm = 0; } norm = maxn; return norm; }