Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2012, 00:08   #1
Krivaia_soplea
Новичок
Джуниор
 
Регистрация: 06.11.2012
Сообщений: 3
Стрелка Исправьте ошибку!!

Решить уравнение методом Гаусса
5x2+x4+5x5=89
-8x1+4x2-x4+4x5=87
10x1+3x2-9x3-3x4-2x5=-13
-7x1+6x2-6x3+7x4+7x5=217
-7x1+6x2+8x3-7x4+x5=-1

выдает ошибку Error 200: Division by zero

Program p1;
uses crt;
const n=5;
a:array[1..n,1..n] of real=((0,5,0,1,5,
(-8,4,0,-1,4),
(10,3,-9,-3,-2),
(-7,6,-6,7,7),
(-7,6,8,-7,,1));
b:array[1..n] of real=(89,87,-13,217,-1);
var x:array[1..5] of real;
i,j,k:integer;z,r,g:real;
begin
clrscr;
{приведение матрицы к треугольному виду}
for k:=1 to n do
begin
for j:=k+1 to n do
begin
r:=a[j,k]/a[k,k];
for i:=k to n do
a[j,i]:=a[j,i]-r*a[k,i];
b[j]:=b[j]-r*b[k];
end;
end;
{вычисление корней}
for k:=n downto 1 do
begin
r:=0;
for j:=k+1 to n do
begin
g:=a[k,j]*x[j];
r:=r+g;
end;
x[k]:=(b[k]-r)/a[k,k];
end;
writeln('Корни системы:');
for i:=1 to n do
write('x[',i,']=',x[i]:0:2,' ');
readln;
end.

Последний раз редактировалось Krivaia_soplea; 07.11.2012 в 00:10. Причина: Забыл дописать
Krivaia_soplea вне форума Ответить с цитированием
Старый 07.11.2012, 08:52   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

А чего тут исправлять? Деление на ноль - может возникнуть только во тут:

Код:
for j:=k+1 to n do
begin
r:=a[j,k]/a[k,k];
и тут:

Код:
end;
x[k]:=(b[k]-r)/a[k,k];
end;
Обратите внимание, что в обоих случаях делится на a[k,k]. В массиве, где первый же элемент a[1,1]=0.

И, да, вроде в методе Гаусса надо использовать не два массива, как у Вас:

Код:
a:array[1..n,1..n] of real=((0,5,0,1,5),
(-8,4,0,-1,4),
(10,3,-9,-3,-2),
(-7,6,-6,7,7),
(-7,6,8,-7,,1));
b:array[1..n] of real=(89,87,-13,217,-1);
а один:

Код:
a:array[1..n,1..n+1] of real=((0,5,0,1,5,89),
(-8,4,0,-1,4,87),
(10,3,-9,-3,-2,-13),
(-7,6,-6,7,7,217),
(-7,6,8,-7,1,-1));
И обратите внимание, что в первом подмассиве у Вас скобка не закрыта А в последнем - лишняя запятая
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 07.11.2012 в 08:56.
Sciv вне форума Ответить с цитированием
Старый 07.11.2012, 09:21   #3
Krivaia_soplea
Новичок
Джуниор
 
Регистрация: 06.11.2012
Сообщений: 3
По умолчанию

если Вам не трудно,помогите написать программу,чтоб решить эту систему(метод гаусса). заранее спасибо.
Krivaia_soplea вне форума Ответить с цитированием
Старый 07.11.2012, 09:24   #4
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Вот Вам код, писанный не мной, найденный на просторах нашего необъятного тырнета. Код, увы, без комментариев. Замените в нем матрицу на свою.

В принципе, можно было и по форуму пошариться, тут такие задачи неоднократно уже решались.
Вложения
Тип файла: zip gausspascal.zip (1,008 байт, 9 просмотров)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 07.11.2012, 11:13   #5
Krivaia_soplea
Новичок
Джуниор
 
Регистрация: 06.11.2012
Сообщений: 3
По умолчанию

Вот я ввел сюда свою систему, но выдает все значения 0! может что то по другому надо сделать!
Код:
program gaussmethod;
const n=6;
type
matrix = array[1..n,1..n+1] of real;
vector = array[1..n] of real;

var i,j:integer;
var a:matrix;
var v:vector;
var ff:text;



procedure gauss(a:matrix; var v:vector);
var i,j,k,m,imax,jmax:integer;
var s,max:real;
var w:array[1..n] of real;
var index:array[1..n] of integer;

begin
  for i:=1 to n do
  begin
    v[i]:=0.0;
    index[i]:=i;
  end;


  for k:=1 to n-1 do
  begin
    max:=0.0;
    for i:=1 to n do
    begin
      for j:=1 to n do
      begin
        if max < abs(a[i,j]) then
        begin
          max:=abs(a[i,j]);
          imax:=i;
          jmax:=j;
        end;
      end;
    end;

    if max=0.0 then
    begin
      write('det |A| =0');
      exit;
    end;

    for i:=1 to n do
    begin
      s:=a[i,k];
      a[i,k]:=a[i,jmax];
      a[i,jmax]:=s;

      m:=index[k];
      index[k]:=index[jmax];
      index[jmax]:=m;
    end;

    for j:=1 to n+1 do
    begin
      s:=a[k,j];
      a[k,j]:=a[imax,j];
      a[imax,j]:=s;
    end;

    s:=a[k,k];
    for j:=k to n+1 do
    begin
      a[k,j]:=a[k,j]/s;
    end;

    for i:=k+1 to n do
    begin
      s:=a[i,k];
      for j:=k to n+1 do
      begin
        a[i,j]:=a[i,j]-s*a[k,j];
      end;
    end;
  end;


  if a[n,n]=0.0 then
  begin
    write('det(a)=0');
    exit;
  end;

  s:=a[n,n];
  for j:=n to n+1 do
  begin
    a[n,j]:=a[n,j]/s;
  end;

  w[n]:=a[n,n+1];
  for i:=n-1 downto 1 do
  begin
    s:=0.0;
    for j:=i+1 to n do
    begin
      s:=s+a[i,j]*w[j];
    end;
    w[i]:=a[i,n+1]-s;
  end;

  for i:=1 to n do
  begin
    v[index[i]]:=w[i];
  end;
end;


begin

    assign(ff,'RESULT.TXT');
    rewrite(ff);
(* ВВОД МАТРИЦЫ A(N,N+1). ПОСЛЕДНИЙ СТОЛБЕЦ --- ВЕКТОР ПРАВЫХ ЧАСТЕЙ СИСТЕМЫ УРАВНЕНИЙ Ax=b *)
      a[ 1, 1]:= 0.0;
      a[ 1, 2]:= 5.0;
      a[ 1, 3]:= 0.0;
      a[ 1, 4]:= 1.0;
      a[1,5]:=5;
      a[1,6]:=89;

      a[ 2, 1]:= -8.0;
      a[ 2, 2]:= 4.0;
      a[ 2, 3]:= 0.0;
      a[ 2, 4]:= -1.0;
        a[2,5]:=4;
      a[2,6]:=87;


      a[ 3, 1]:= 10.0;
      a[ 3, 2]:= 3.0;
      a[ 3, 3]:=-9.0;
      a[ 3, 4]:= -3.0;
        a[3,5]:=-2;
      a[3,6]:=-13;

      a[ 4, 1]:= -7.0;
      a[ 4, 2]:= 6.0;
      a[ 4, 3]:= -6.0;
      a[ 4, 4]:= 7.0;
        a[4,5]:=7;
      a[4,6]:=217;

      a[ 5, 1]:= -7.0;
      a[ 5, 2]:= 6.0;
      a[ 5, 3]:= 8.0;
      a[ 5, 4]:= -7.0;
        a[5,5]:=1;
      a[5,6]:=-1;
(* ВВОД МАТРИЦЫ A(N,N+1). ПОСЛЕДНИЙ СТОЛБЕЦ --- ВЕКТОР ПРАВЫХ ЧАСТЕЙ СИСТЕМЫ УРАВНЕНИЙ Ax=b *)

  gauss(a,v);

  for i:=1 to n do
  begin
    write('v[',i,']=',v[i]);
    writeln(ff,'v[',i,']=',v[i]);
  end;

  close(ff);

end.

Последний раз редактировалось Stilet; 07.11.2012 в 11:19.
Krivaia_soplea вне форума Ответить с цитированием
Старый 07.11.2012, 20:15   #6
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
const n=6;
Вообще-то n=5.

Вот что показывает у меня Ваша система:
Изображения
Тип файла: jpg 1.JPG (5.9 Кб, 98 просмотров)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Исправьте ошибку 15104 Общие вопросы C/C++ 2 06.10.2011 11:07
Исправьте ошибку.С# Tase4ka Помощь студентам 8 12.02.2011 14:09
Исправьте ошибку kipapsih Помощь студентам 0 07.01.2011 20:19
Исправьте ошибку пожалуйста Алиса_1515 Помощь студентам 1 03.12.2009 19:12