Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //Нормы
- double eucl_norm(double* vec,
- int size) {
- double res = cblas_ddot(size, vec, 1, vec, 1);
- res = sqrt(res);
- return res;
- }
- double ATA_norm(sparse_matrix_t& A,
- const matrix_descr descr,
- double* vec,
- int size) {
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, vec, 0, vec);
- double res = cblas_ddot(size, vec, 1, vec, 1);
- res = sqrt(res);
- return res;
- }
- //Метод минимальных ошибок (недоделанный)
- void MME(int nrows, //число строк в матрице
- sparse_matrix_t& A, //матрица в формате CSR
- double* u, //начальное приближение
- double* f, //правая часть
- double eps, //точность вычислений
- int itermax, //максимальное число итераций
- int* number_of_operations, //число выполненных итераций
- double* u_exact, //точное решение
- double** P
- )
- {
- ofstream outf("MME.txt");
- matrix_descr descr = { SPARSE_MATRIX_TYPE_GENERAL, SPARSE_FILL_MODE_UPPER, SPARSE_DIAG_UNIT };
- double* Ap = new double[nrows];
- //double* p = new double[nrows];
- double* r = new double[nrows];
- double* v_0 = new double[nrows];
- double* v = new double[nrows];
- int iter = 0; double alpha = 0.0; double beta = 0.0; double rho = 0.0; double sigma = 0.0;
- double sigma_1 = 0; double L = 0; double delta_0 = 0; double rr = 0;
- double Phi = 0; double vv = 0;
- copy(f, f + nrows, r);
- //r_0 = f - Au_0
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, -1., A, descr, u, 1, r);
- rr = cblas_ddot(nrows, r, 1, r, 1);
- eps *= eps * cblas_ddot(nrows, f, 1, f, 1);
- //Ap = Ap_0
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, P[0], 0, Ap);
- //rho_0 = (p_0, p_0)
- rho = cblas_ddot(nrows, P[0], 1, P[0], 1);
- //alpha_0 = rr / rho_0
- alpha = rr / rho;
- //delta_0 = ||u_exact - u_0||
- copy(u_exact, u_exact + nrows, v);
- cblas_daxpy(nrows, -1, u, 1, v, 1);
- vv = cblas_ddot(nrows, v, 1, v, 1);
- copy(v, v + nrows, v_0);
- delta_0 = eucl_norm(v, nrows);
- Phi = pow(delta_0, 2); //Phi_0 = delta_0^2
- outf << "Iter: " << iter << "\n" << "u: ";
- for (int i = 0; i < nrows; i++) { outf << u[i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\n" << "v: ";
- for (int i = 0; i < nrows; i++) { outf << v[i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\n" << "r: ";
- for (int i = 0; i < nrows; i++) { outf << r[i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\n" << "p: ";
- for (int i = 0; i < nrows; i++) { outf << P[iter][i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\n" << "Ap: ";
- for (int i = 0; i < nrows; i++) { outf << Ap[i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\nalpha = " << alpha << ", rho = " << rho
- << ", (r_n, r_n) = " << rr << ", L = " << L
- << ", delta^2 = " << vv << ", Phi = " << Phi << endl;
- while (rr > eps && iter < itermax-1)
- {
- ////Phi_n = delta_0^2 - summ_(k = 0, ..., n-1) L_k
- sigma_1 = cblas_ddot(nrows, v_0, 1, P[iter], 1);
- L = pow(sigma_1, 2) / rho;
- Phi -= L;
- //u_n = u_n-1 + alpha_n-1 * p_n-1
- cblas_daxpy(nrows, alpha, P[iter], 1, u, 1);
- //delta_n = ||u_exact - u_n||
- copy(u_exact, u_exact + nrows, v);
- cblas_daxpy(nrows, -1, u, 1, v, 1);
- vv = cblas_ddot(nrows, v, 1, v, 1);
- //r_n = r_n-1 - alpha_n-1 * Ap_n-1
- cblas_daxpy(nrows, -1 * alpha, Ap, 1, r, 1);
- rr = cblas_ddot(nrows, r, 1, r, 1);
- //sigma_n = (r_n, p_n-1)
- sigma = cblas_ddot(nrows, r, 1, P[iter], 1);
- //beta_n = -sigma_n / rho_n-1
- beta = -1 * sigma / rho;
- ////p_n = r_n + beta_n * p_n-1
- //cblas_daxpby(nrows, 1, r, 1, beta, P[iter], 1);
- //mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, P[iter], 0, Ap);
- //rho_n = (p_n, p_n)
- rho = cblas_ddot(nrows, P[iter], 1, P[iter], 1);
- //alpha_n = -alpha_n-1 * sigma_n / rho_n
- alpha = -1 * alpha * sigma / rho;
- iter++;
- *number_of_operations = iter;
- outf << "Iter: " << iter << "\n" << "u: ";
- for (int i = 0; i < nrows; i++) { outf << u[i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\n" << "v: ";
- for (int i = 0; i < nrows; i++) { outf << v[i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\n" << "r: ";
- for (int i = 0; i < nrows; i++) { outf << r[i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\n" << "p: ";
- for (int i = 0; i < nrows; i++) { outf << P[iter][i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\n" << "Ap: ";
- for (int i = 0; i < nrows; i++) { outf << Ap[i] << ", "; if ((i + 1) % 7 == 0) outf << "\n"; }
- outf << "\nalpha = " << alpha << ", beta = " << beta << ", rho = " << rho << ", sigma = " << sigma
- << ", (r_n, r_n) = " << rr << ", L = " << L << ", delta^2 = " << vv
- << ", Phi = " << Phi << endl;
- }
- outf.close();
- delete[] r;
- //delete[] p;
- delete[] Ap;
- delete[] v_0;
- delete[] v;
- }
- //Бидиагонилизация Голуба-Кахана
- void Bidiagonalization_G_K(
- int nrows,
- sparse_matrix_t& A,
- double** p,
- double** q,
- int size_q,
- double* r_0
- )
- {
- double** z = new double* [size_q];
- for (int i = 0; i < size_q; i++) z[i] = new double[nrows];
- double** w = new double* [size_q];
- for (int i = 0; i < size_q; i++) w[i] = new double[nrows];
- double* Ap = new double[nrows];
- double* Aq = new double[nrows];
- double* tmp = new double[nrows];
- double* alpha = new double[nrows];
- double* beta = new double[nrows];
- ofstream outf("ab_check.txt");
- matrix_descr descr = {SPARSE_MATRIX_TYPE_GENERAL,
- SPARSE_FILL_MODE_UPPER, SPARSE_DIAG_UNIT};
- //q[0] = (1, 0, 0, 0, 0, 0, 0, 0, 0)
- //q[0][0] = 10;
- //for (int i = 1; i < nrows; i++) q[0][i] = 0;
- //q_0 = Ar_0
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, r_0, 0, q[0]);
- //Нормирование q_0
- double norm_q_0 = eucl_norm(q[0], nrows);
- cblas_daxpby(nrows, 1.0 / norm_q_0, q[0], 1, 0, tmp, 1);
- copy(tmp, tmp + nrows, q[0]);
- //set w_0 = Aq_0
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE,
- 1., A, descr, q[0], 0, w[0]);
- //alpha_0 = ||w_0||
- alpha[0] = eucl_norm(w[0], nrows);
- //p_0 = alpha_0^-1 * w_0
- cblas_daxpby(nrows, 1.0 / alpha[0], w[0], 1, 0, p[0], 1);
- for (int i = 0; i < size_q - 1; i++)
- {
- //z_i = Ap_i - alpha_i * q_i
- mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE,
- 1., A, descr, p[i], 0, Ap);
- cblas_daxpy(nrows, -1 * alpha[i], q[i], 1, Ap, 1);
- copy(Ap, Ap + nrows, z[i]);
- //beta_i = ||z_i||
- beta[i] = eucl_norm(z[i], nrows);
- //q_i+1 = beta_i^-1 * z_i
- cblas_daxpby(nrows, 1.0 / beta[i], z[i], 1, 0, q[i + 1], 1);
- //w_i = Aq_i - beta_i-1 * p_i-1
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE,
- 1., A, descr, q[i+1], 0, Aq);
- cblas_daxpy(nrows, -1 * beta[i], p[i], 1, Aq, 1);
- copy(Aq, Aq + nrows, w[i+1]);
- //alpha_i = ||w_i||
- alpha[i+1] = eucl_norm(w[i+1], nrows);
- //outf << "alpha_" << i+1 << " = " << setprecision(3) << alpha[i+1] << "\t";
- //p_i = alpha_i^-1 * w_i
- cblas_daxpby(nrows, 1.0 / alpha[i+1], w[i+1], 1, 0, p[i+1], 1);
- }
- outf << "\t";
- for (int i = 0; i < size_q; i++) outf << i << "\t";
- outf << "\nalpha\t";
- for (int i = 0; i < size_q; i++) outf << setprecision(2) << alpha[i] << "\t";
- outf << "\nbeta \t";
- for (int i = 0; i < size_q - 1; i++) outf << setprecision(2) << beta[i] << "\t";
- /*for (int n = 0; n < size_q - 1; n++) {
- cout << "z_" << n << " = ";
- for (int i = 0; i < nrows; i++)
- cout << z[n][i] << ", ";
- cout << "\n";
- }*/
- outf.close();
- delete[] w;
- delete[] z;
- delete[] Ap;
- delete[] Aq;
- delete[] tmp;
- delete[] alpha;
- delete[] beta;
- }
- void Bidiagonalization_ATA(
- int nrows,
- sparse_matrix_t& A,
- double** p,
- double** q,
- int size_q
- )
- {
- double** z = new double* [size_q];
- for (int i = 0; i < size_q; i++) z[i] = new double[nrows];
- double** w = new double* [size_q];
- for (int i = 0; i < size_q; i++) w[i] = new double[nrows];
- double* ATAp = new double[nrows];
- double* ATAq = new double[nrows];
- double* tmp = new double[nrows];
- double* alpha = new double[nrows];
- double* beta = new double[nrows];
- ofstream outf("ab_check.txt");
- matrix_descr descr = { SPARSE_MATRIX_TYPE_GENERAL,
- SPARSE_FILL_MODE_UPPER, SPARSE_DIAG_UNIT };
- //q[0] = (1, 0, 0, 0, 0, 0, 0, 0, 0)
- q[0][0] = 1;
- for (int i = 1; i < nrows; i++) q[0][i] = 0;
- //set w_0 = ATA * q_0
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, q[0], 0, tmp);
- print(tmp, nrows, "Aq");
- mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE, 1., A, descr, tmp, 0, w[0]);
- print(w[0], nrows, "ATAq");
- //alpha_0 = ||w_0||
- alpha[0] = ATA_norm(A, descr, w[0], nrows);
- //alpha[0] = e_norm(w[0], nrows);
- cout << "alpha = " << alpha[0];
- //p_0 = alpha_0^-1 * w_0
- cblas_daxpby(nrows, 1.0 / alpha[0], w[0], 1, 0, p[0], 1);
- for (int i = 0; i < size_q - 1; i++)
- {
- //z_i = ATA * p_i - alpha_i * q_i
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE,
- 1., A, descr, p[i], 0, tmp);
- mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE,
- 1., A, descr, tmp, 0, ATAp);
- cblas_daxpy(nrows, -1 * alpha[i], q[i], 1, ATAp, 1);
- copy(ATAp, ATAp + nrows, z[i]);
- //beta_i = ||z_i||
- beta[i] = ATA_norm(A, descr, z[i], nrows);
- //beta[i] = e_norm(z[i], nrows);
- //q_i+1 = beta_i^-1 * z_i
- cblas_daxpby(nrows, 1.0 / beta[i], z[i], 1, 0, q[i + 1], 1);
- //w_i = ATA * q_i - beta_i-1 * p_i-1
- mkl_sparse_d_mv(SPARSE_OPERATION_NON_TRANSPOSE, 1., A, descr, q[i + 1], 0, tmp);
- mkl_sparse_d_mv(SPARSE_OPERATION_TRANSPOSE, 1., A, descr, tmp, 0, ATAq);
- cblas_daxpy(nrows, -1 * beta[i], p[i], 1, ATAq, 1);
- copy(ATAq, ATAq + nrows, w[i + 1]);
- //alpha_i = ||w_i||
- alpha[i + 1] = ATA_norm(A, descr, w[i + 1], nrows);
- //alpha[i + 1] = e_norm(w[i + 1], nrows);
- //outf << "alpha_" << i+1 << " = " << setprecision(3) << alpha[i+1] << "\t";
- //p_i = alpha_i^-1 * w_i
- cblas_daxpby(nrows, 1.0 / alpha[i + 1], w[i + 1], 1, 0, p[i + 1], 1);
- }
- outf << "\t";
- for (int i = 0; i < size_q; i++) outf << i << "\t";
- outf << "\nalpha\t";
- for (int i = 0; i < size_q; i++) outf << setprecision(2) << alpha[i] << "\t";
- outf << "\nbeta \t";
- for (int i = 0; i < size_q - 1; i++) outf << setprecision(2) << beta[i] << "\t";
- outf.close();
- delete[] w;
- delete[] z;
- delete[] ATAp;
- delete[] ATAq;
- delete[] alpha;
- delete[] beta;
- }
- //Проверка ортогонализации
- void Check_orthogonalization(int nrows,
- sparse_matrix_t& A,
- double** v,
- int size_v,
- double* r_0
- )
- {
- //cout << "q_0 = r_0 = ";
- //for (int i = 0; i < nrows; i++)
- // cout << v[0][i] << ", ";
- //cout << "\n";
- //cout << "Norm_q_0 = " << eucl_norm(v[0], nrows) << "\n";
- ofstream outf("Check_ort_matr.txt");
- matrix_descr descr = { SPARSE_MATRIX_TYPE_GENERAL, SPARSE_FILL_MODE_UPPER, SPARSE_DIAG_UNIT };
- for (int n = 0; n < size_v; n++) {
- outf << "v_" << n << " = ";
- for (int i = 0; i < nrows; i++)
- outf << v[n][i] << ", ";
- outf << "\n";
- }
- double vv = 0;
- outf << "(v_i, v_j)" << "\t";
- for (int i = 0; i < size_v; i++) outf << i << "\t";
- outf << "\n";
- for (int i = 0; i < size_v; i++) {
- outf << i << "\t";
- for (int j = 0; j < size_v; j++) {
- vv = cblas_ddot(nrows, v[i], 1, v[j], 1);
- outf << setprecision(1) << vv << "\t";
- }
- outf << "\n";
- }
- outf.close();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement