Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- using namespace std;
- //задает тридиагональную матрицу
- float get_m (float **ma,int n){
- for (int i = 0; i<n; i++){
- for (int j = 0; j<n; j++){
- cout << "уравнение " << i + 1 << "-е коэффициент " << j + 1 << " : ";
- cin >> ma[i][j];
- if (((j>i + 1) || (j<i - 1)) && (ma[i][j] != 0)){
- cout << "Матрица не тридиагональная" << endl;
- system ("pause");
- return 1;
- }
- }
- cout << endl;
- }
- }
- //печатает матрицу
- void print_m (float **ma,int size_i){
- cout << "matrix: " << endl;
- for (int i = 0; i<size_i; i++){
- for (int j = 0; j<size_i; j++)
- cout << ma[i][j] << " ";
- cout << endl;
- }
- }
- //метод прогонки
- void pr (float**MA,int n,float*MB){
- vector<double> P (n),Q (n);
- int i,j;
- for (i = 0; i < n; i++){ //поменяли знак главной диагонали
- MA[i][i] = -MA[i][i];
- for (j = 0; j < n; j++){
- cout << MA[i][j] << " ";
- }
- cout << endl;
- }
- cout << endl;
- P[0] = MA[0][1] / MA[0][0]; //начальные
- Q[0] = -(MB[0] / MA[0][0]); // значения p и q
- cout << "P Q\n";
- cout << P[0] << ", " << Q[0] << "\n";
- for (i = 1; i <= n - 1; i++){//цикл до n-1, потому что при вычислении P[i] идет обращение к элементу А[i][i+1] (при i = n-1 будет выход за пределы вектора)
- P[i] = (MA[i][i + 1]) / (MA[i][i] - MA[i][i - 1] * P[i - 1]); //последний элемент строки делит на средний, от которого отняли первый умноженный на прерыдущее значение P
- Q[i] = (MA[i][i - 1] * Q[i - 1] - MB[i]) / (MA[i][i] - MA[i][i - 1] * P[i - 1]);//первый элемент строки от которого отняли соотв. элемент правого вектор-столбца делится на средний, от которого отняли первый умноженный на прерыдущее значение P
- if (i!=n-1)
- cout << P[i] << ", " << Q[i] << "\n";else
- cout<<"xx"<<", "<<Q[i]<<"\n";
- }
- //делаем так, потому что в цикле не посчиталась Q[n - 1]
- //Q[n - 1] = (MA[n - 1][n - 2] * Q[n - 2] - MB[n - 1]) / (MA[n - 1][n - 1] - MA[n - 1][n - 2] * P[n - 2]);
- MB[n - 1] = Q[n - 1];
- for (i = n - 2; i >= 0; i--){ //в правый крайний вектор-стоблец записывает результат
- MB[i] = P[i] * MB[i + 1] + Q[i];
- }
- }
- int main (){
- setlocale (LC_ALL,"Ru");
- int i,j,n,m;
- cout << "введите размерность матрицы А: ";
- cin >> n;
- float **matrix = new float *[n];
- for (i = 0; i<n; i++)
- matrix[i] = new float[n];
- //if (get_m (matrix,n) == 1) return 1;
- get_m(matrix,n);
- print_m (matrix,n);
- cout << "введите вектор:\n";
- float* B = new float[n];
- for (i = 0; i < n; i++)
- cin >> B[i]; //правый вектор-столбец
- cout << endl;
- pr (matrix,n,B);
- cout << "\nРезультат:\n";
- for (i = 0; i < n; i++)
- cout << B[i] << "\n";
- system ("pause");
- return 0;
- }
- //metod progonki trebuet 3diagonal'nuu matricu => realizaciya gaussa neeffectivna, eto po4ti gauss no isklucheniya stroyatsya inache
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement