Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <iomanip>
- #include <vector>
- using namespace std;
- int L = 9;
- int N = 3;
- double sk (vector<double>&a,vector<double> &b){ //скалярное прозведение
- double c=0;
- for (int i = 0; i < N ;i++)
- c+=a[i]*b[i];
- return c;
- }
- void mv (vector <vector<double>>&a,vector<double>&b,vector<double>&c)
- {//умножение матрицы на столбец
- for (int i=0;i<N;i++)
- for(int j=0;j<N;j++)
- c[i]+=a[i][j]*b[j];
- }
- void crt (vector<vector<double>> &a,vector<double>&b){
- cout << "Введите матрицу А: " << endl;
- for (int i = 0; i < N; i++){
- for (int j = 0; j < N; j++){
- cin >> a[i][j];
- }
- }
- cout << "Введите стоблец свободных членов:" << endl;
- for (int i = 0; i < N; i++){
- cin >> b[i];
- }
- cout << endl;
- }
- void prnt (vector<vector<double>> &a){
- for (int i = 0; i < N; i++){
- for (int j = 0; j < N; j++){
- cout << a[i][j] << " ";
- }
- cout << "\n";
- }
- cout << "\n";
- }
- void prntB (vector<double>& a){
- for (int i = 0; i < N; i++){
- cout <<a[i] << " ";
- }
- cout << "\n";
- }
- bool converge (vector<double> &a, double e){
- double norm;
- norm=sk(a,a);
- if (sqrt(norm)>=e)
- return false;
- return true;
- }
- void GRADIENTIREN(vector<vector<double>>&a,vector<double>&b){
- int k=0;
- double e;
- cout << "Введите точность вычислений : ";
- cin >> e;
- cout << endl;
- vector<vector<double>>x(100,vector<double>(N)),r(100,vector<double>(N)),z(100,vector<double>(N));
- vector<double>res(N);
- double ak,bk;
- //x[0]={1,2,3}; //начальное приближение
- mv(a,x[0],res);
- for(int i=0;i<N;i++){ //podgotovka
- r[0][i]=b[i]-res[i]; //невязка
- z[0][i]=r[0][i]; //базисный вектор
- }
- res={0,0,0};
- do{
- k++;
- mv(a,z[k-1],res);
- ak=(sk(r[k-1],r[k-1]))/(sk(res,z[k-1]));
- for (int i = 0;i < N;i++){
- x[k][i]=x[k-1][i]+(ak*z[k-1][i]);
- r[k][i]=r[k-1][i]-(ak*(res[i]));
- }
- res={0,0,0};
- bk=sk(r[k],r[k])/sk(r[k-1],r[k-1]);
- for (int i=0;i<N;i++)
- z[k][i]=r[k][i]+bk*z[k-1][i];
- cout<<k<<"-я итерация : "<<endl;
- for (int i = 0; i < N; i++){
- cout << "X" << i + 1 << " = " << x[k][i] << fixed << setprecision (L) << endl;
- }
- }//while (k<N);
- while (sqrt(sk(r[k],r[k]))>=e);
- //вывод решения
- cout << "\nРешение системы:" << endl;
- for (int i = 0; i < N; i++){
- cout << "X" << i + 1 << " = " << x[k][i] << fixed << setprecision (L) << endl;
- }
- cout << "Число итераций: " << k << endl;
- }
- int main (){
- setlocale(LC_ALL,"ru");
- vector<vector<double>>A(N,vector<double>(N));
- vector<double>B(N);
- /* A[0]={9,4,3};
- A[1]={4,-3,0};
- A[2]={3,0,5};
- B[0]=1;
- B[1]=5;
- B[2]=9;*/
- crt(A,B);
- prnt(A);
- prntB(B);
- GRADIENTIREN(A,B);
- system("pause");
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement