zak100 Ответов: 2

Ошибка сегментации при печати результата для алгоритма исключения Гаусса


Привет,
Из книги я получил следующий алгоритм метода исключения Гаусса. Но я не знаю, как вывести корни одновременных уравнений, полученных из следующего алгоритма. Алгоритм приведен ниже:
1. procedure Gaussian_Elimination(A, b, y)
  2. begin
  3.    for k:= 0 to n-1 do
  4.      begin
  5.       for j:=k + 1 to n-1 do
  6.          A[k,j] := A[k,j] /A[k,k];
  7.       y[k] : = b[k]/A[k,k];
  8.       A[k,k] :=1;
  9.       for i:= k + 1 to n-1 do
 10.       begin
 11.           for j:= k+1 to n-1 do
 12.              A[i,j]:= A[i,j] - A[i,k] * A[k, j];
 13.           b[i] := b[i] -A[i, k] * y[k];
 14.            A[i, k] :=0;
 15.       endfor;*//* Line 9 */
 /*16. endfor; *//*line 3*/
 /*17. end


Пожалуйста, проверьте мой код мой код и скажите мне, правильна ли импликация или нет. Мой код приведен ниже:

#include <iostream>
#include <cmath>
//#include <mpi.h>
#include <fstream>
#include <ctime>
#include <vector>
#define n  3
using namespace std;

void GaussianElimination(double **,double *b ,double *y);
int main(int argc, char * argv[])
{
  /* values
  Row0 = 0, 2, 1; b0= -8
  Row1 = 1, -2, -3; b1 = 0
  Row3 = -1, 1, 2; b2= 3

  Ans = -4, -5, 2 */
 
  
  
 <pre>double *A[n]={NULL, NULL, NULL} ;
  double *b = NULL;
  double *y= NULL;

  for (int i=0; i < n; i++){
    A[i] = new double [n];
    if (A[i] == NULL){
       cout<< " problem with memory Allocation:";
       return -2;
    }
  }
  b = new double[n];
  if(b== NULL){
    cout<< " problem with memory Allocation:";
    return -2;
  }
 
  y = new double[n];
  if(y== NULL){
    cout<< " Problem with Memory Allocation:";
    return -2;
  }
  
  A[0][0] =0.0;A[0][1] =2.0; A[0][2] = 1.0; //A[0][3] = -8.0;
  A[1][0] =1.0;A[1][1] =-2.0; A[1][2] =-3.0; //A[1][3] = 0.0;
  A[2][0] =-1.0;A[0][1] =1.0; A[0][2] = 2.0; //A[0][3] = 3.0;
  b[0] = -8.0;
  b[1] = 0.0;
  b[2] = 3.0;


  GaussianElimination(A, b ,y);
  delete [] y;
  delete [ ]b;
  for(int i = 0; i < n; i++)
    delete [] A[i];
 // delete [ ] A; No need to delete A because A is not created dynamically  
}
  void GaussianElimination(double **A, double *b,double *y) {
     for(int k=0; k<n-1; ++k) {
        for(int j= k+1; j <n-1; ++j)
           A[k][j] = A[k][j]/A[k][k]; 
        y[k] = b[k]/A[k][k];
        for(int i=k+1; k<n-1; i++){
           for(int j=k+1; j<n-1; j++)
              A[i][j] = A[i][j] -A[i][k] *A[k][j];
           b[i]= b[i] -A[i][k] * y[k];
           A[i][k] = 0;
        }
     }

     for(int i=0; i<n-1; i++)
        cout<<y[i];
}        


I am printing the contents of y but its giving me segmentation fault. Some body please guide me.
<pre>$ ./a.out
Segmentation fault (core dumped)
$ 


Зульфи.

Что я уже пробовал:

Я также попытался напечатать значение "b", но это также дает мне ошибку сегментации

2 Ответов

Рейтинг:
7

zak100

Привет,

Я думаю, что этот алгоритм не может работать, если диагональная запись равна нулю. Это для плотных одновременных уравнений.

<pre> void GaussianElimination(double **A, double *b,double *y) {
     cout<<"Inside Gaussian 1";
     for(int k=0; k<=n-1; ++k) {
        cout<<"k =" <<k<<endl;
        for(int j= k+1; j <=n-1; ++j){
           cout<<"A["<<k<<"]["<<k<<"] =" <<A[k][k] <<endl;
           A[k][j] = A[k][j]/A[k][k]; 
         }
      
       
        y[k] = b[k]/A[k][k];
        cout<<"Reached";
        for(int i=k+1; i<=n-1; i++){
           for(int j=k+1; j<=n-1; j++)
              A[i][j] = A[i][j] -A[i][k] *A[k][j];
           b[i]= b[i] -A[i][k] * y[k];
           A[i][k] = 0;
        }
     }

     for(int i=0; i<n-1; i++)
        cout<<y[i];
}        

Я получаю следующий вывод:
Testing0Testing1Inside Gaussian 1k =0
A[0][0] =0
A[0][0] =0
Segmentation fault (core dumped)

Он не может напечатать "достиг". Я должен изменить входные данные.
Если я ошибаюсь, пожалуйста, дайте мне знать.

Зульфи.


k5054

Я думаю, что вам нужно посмотреть на выражение условия ваших циклов for:

for(initial;condition;increment)

zak100

К сожалению, я не могу понять, почему мой средний срок неправильный.Я следую алгоритму:

for k:= 0 to n-1 do

Пожалуйста, веди меня.

Зульфи.
Зульфи.

zak100

В "решении 2" я исправил верхний предел.

Зульфи.

zak100

Я исправил проблему с условием.

Зульфи.

Рейтинг:
0

Patrice T

Цитата:
Ошибка сегментации: как вывести решение для алгоритма исключения Гаусса

Это означает, что ваш код пытается использовать пространство памяти, которым он не владеет, где-то вы пытаетесь читать/писать после окончания массива.
Изучите инструмент, который поможет вам самостоятельно найти ошибку, изучите отладчик.
----
Ваш код ведет себя не так, как вы ожидаете, или вы не понимаете, почему !

Существует почти универсальное решение: запускайте свой код на отладчике шаг за шагом, проверяйте переменные.
Отладчик здесь, чтобы показать вам, что делает ваш код, и ваша задача-сравнить с тем, что он должен делать.
В отладчике нет никакой магии, он не знает, что должен делать ваш код, он не находит ошибок, он просто помогает вам, показывая, что происходит. Когда код не делает того, что ожидается, вы близки к ошибке.
Чтобы увидеть, что делает ваш код: просто установите точку останова и посмотрите, как работает ваш код, отладчик позволит вам выполнять строки 1 на 1 и проверять переменные по мере их выполнения.

Отладчик - Википедия, свободная энциклопедия[^]

Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]
Базовая отладка с помощью Visual Studio 2010 - YouTube[^]

1.11 — отладка программы (пошаговое выполнение и останова) | выучить C++[^]

Отладчик здесь только для того, чтобы показать вам, что делает ваш код, и ваша задача-сравнить его с тем, что он должен делать.


zak100

Я обнаружил, что переоформляю b & y. Я удалил эту ошибку, но все равно получаю ошибку сегментации.

Спасибо за ваш ответ.

Зульфи.

Patrice T

Обновите свой вопрос новой информацией и новым кодом.
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

zak100

Привет,
Я не вижу варианта improvequestion. Пожалуйста, веди меня.

Зульфи.

Patrice T

наведите курсор мыши на последнюю строку вопроса, и вы увидите.