2014 dxdy logo

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

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




 
 Метод Гаусса с полным выбором. C++
Сообщение19.04.2013, 20:06 
Написал код реализующий метод Гаусса с полным выбором ведущего элемента, но ответ выдает не правильный. Помогите найти ошибку
Код:
#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 
Аватара пользователя
В процедуре SwapLines менять местами элементы вектора B надо один раз, а не в цикле.

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

 
 
 [ Сообщений: 3 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group