2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Метод Гаусса с полным выбором. C++
Сообщение19.04.2013, 20:06 


28/05/12
214
Написал код реализующий метод Гаусса с полным выбором ведущего элемента, но ответ выдает не правильный. Помогите найти ошибку
Код:
#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <math.h>
#define N 6
void PrintArray(double A[][N]){ //вывод матрицы
   for(int i=0; i<N; i++){
      for(int j=0; j<N; j++)
         std::cout<< A[i][j] <<"  ";
   std::cout<<std::endl;
    }
}
void PrintVector(double X[]){ // вывод вектора
   for(int i=0; i<N; i++){
      std::cout << std::fixed << std::setw(22) << std::setprecision(20) << X[i];
      std::cout<<std::endl;
   }
}
void GilbertM(double A[][N]){   //матрица Гильберта
   int i;
   int j;
   for (i = 0;i<N;i++){
      for(j=0;j<N;j++){
         A[i][j]=1./(i+1+j);
      }
   }
}
void VectorB(double B[]){  // заполняем вектор B
   int i;
   B[0] = 1;
   for (i = 1;i<N;i++){
      if (i % 2 == 0){
         B[i]=-(B[i-1]-1);
      }
      else{ B[i] = -(B[i - 1] + 1);}
   }
}
void SwapColumns(double A[][N],int c1,int c2){ // меняем столбцы матрицы
   double temp;
   int j;
   for(j=0; j<N; j++)
    {
     temp=A[j][c1];
     A[j][c1]=A[j][c2];
     A[j][c2]=temp;
    }
}
void SwapLines(double A[][N], double B[],int l1,int l2){ // меняем строки матрицы и вектора
   double temp;
   int j;
   for(j=0; j<N; j++)
    {
     temp=A[l1][j];
     A[l1][j]=A[l2][j];
     A[l2][j]=temp;
    temp=B[l1];
     B[l1]=B[l2];
     B[l2]=temp;
    }
}
void Destroy(double A[][N], double B[], int d){ // зануляем элементы под ведущим элементом
   int i,k;
   double v;
   for(i=d+1; i<N; i++){
      v=(-A[i][d]/A[d][d]);
      for(k=d; k<N; k++){
         A[i][k]=A[i][k]+v*A[d][k];
      }
      B[i]=B[i]+v*B[d];
   }
}
void Solution(double A[][N], double B[], double X[]){ //собственно само решение
   int i,j,s,m,k,l,temp;
   double max;
   int memory[N];
   double Y[N];
   double v;
   for (i=0; i<N; i++)
      memory[i]=i;
   for (i=0; i<N; i++){   
      max=0;
      k=i;
      l=i;
      for (s = i;s<N;s++){//ищем максимум в подматрице
         for (m = i;m<N;m++){
            if (fabs(A[s][m])>max){max=fabs(A[s][m]); k=s; l=m;}
         }
      }
//      if (k!=i)
      SwapLines(A,B,i,k);//меням строки
//      if (l!=i){
      SwapColumns(A,i,l);// меням столбцы и запоминаем какие переменные поменялись
      temp = memory[i];
        memory[i] = memory[l];
        memory[l] = temp;
//      }
      Destroy(A,B,i); // зануление
   }
   for (i=N-1; i>-1; i--){ //обратная подстановку
      v=0;
      for (j=N-1; j>i; j--)
         v=A[i][j]*Y[j]+v;
      Y[i]=(B[i]-v)/A[i][i];
   }
   for (i = 0; i < N; i++)//меняем местами переменные как должно быть
        X[memory[i]] = Y[i];
}
void F(double A[][N], double X[N], double B[N]){// подставляем A,B,X в уравнение AX-B и смотрим чему равен максимальный элемент
   double L[N];
   double max;
   int i,j;
   max=0;
   for(i=0; i<N; i++){
      L[i]=0;
      for(j=0; j<N; j++){
         L[i]=L[i]+A[i][j]*X[j];
      }
      L[i]=L[i]-B[i];
   }
   for (i=0; i<N; i++){
      max=max+fabs(L[i]);
   }
   std::cout << std::fixed << std::setw(22) << std::setprecision(20) << max<<std::endl<<std::endl;
}


void main(){
   double B[N];
   double X[N];
   double A[N][N];
   double max;
   GilbertM(A);
   VectorB(B);
   Solution(A,B,X);
   PrintVector(X);
   GilbertM(A);
   VectorB(B);
   std::cout<<std::endl;
   F(A,X,B);
   getch();
}



 Профиль  
                  
 
 Re: Метод Гаусса с полным выбором. C++
Сообщение19.04.2013, 22:16 
Заслуженный участник
Аватара пользователя


06/10/08
6422
В процедуре SwapLines менять местами элементы вектора B надо один раз, а не в цикле.

 Профиль  
                  
 
 Re: Метод Гаусса с полным выбором. C++
Сообщение19.04.2013, 23:09 


28/05/12
214
Спасибо большое. Исправил и все работает.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 3 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group