Автор Тема: Крамер. Вычисление определителей.  (Прочитано 4674 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Lvenke

  • Новичок
  • *
  • Сообщений: 6
    • Просмотр профиля
Помогите, пожалуйста, никак не могу найти ошибку >.<

Пишу решение СЛУ Крамером. Вычисляю определители сводя их к треугольному виду и перемножая элементы главной диагонали.

Для проб специально задала массив. Корни должны получится 1, 3 и 5. Вывод сделан несколько раз, чтобы проследить ошибку..

Главный определитель считает нормально.

Судя по всему, у меня не получается свести к треугольному виду все остальные определители, потому что

5 1 0
27 -1 6
-290 0 -58

- я вручную считаю и получается правильно - 116, а после свода к треугольному виду очевидно, что произведение элементов главной диагонали не 116..

uses crt;
type
  mas= array[0..20, 0..20] of real;
  masodnom= array[0..10] of real;
var
  a, b: mas;
  i, j, m, c, d, n: integer;
  opr, x: masodnom;
  opred, r, s: real;
begin
  n:= 3;
  a[0,0]:= 2;
  a[0,1]:= 1;
  a[0,2]:= 0;
  a[0,3]:= 5;
 
  a[1,0]:= 1;
  a[1,1]:= 0;
  a[1,2]:= 3;
  a[1,3]:= 16;
 
  a[2,0]:= 0;
  a[2,1]:= 5;
  a[2,2]:= -1;
  a[2,3]:= 10;
 
  for i:= 0 to n-1 do
    begin
      for j:= 0 to n do
        write(a[i,j]:6:3, ' ');
      writeln;
    end;
  readln;
 
  for j:= 0 to n-2 do
    begin
      r:= a[j,j];
 
      if r = 0 then                       {избавление от нулей на}
      for i:= 0 to n-1 do                    {главной диагонали}
        if a[i,j] <> 0 then
          begin
            for m:= 0 to n do
            a[j,m]:= a[j,m] + a[i,m];
            break;
          end;
 
      for i:= j+1 to n-1 do               {приведение матрицы к}
        begin                               {треугольному виду}
          s:= a[i,j];
          for m:= j to n do
            a[i,m]:= a[i,m] * r - a[j,m] * s;
        end;
    end;
 
  for i:= 0 to n-1 do                      {вывод}
    begin
      for j:= 0 to n do
        write(a[i,j]:6:3, ' ');
      writeln;
    end;
    readln;
 
 
  opred:= 1;                                //вычисление главного
  for i:= 0 to n-1 do                           //определителя
    opred:= opred * a[i,i];
 
  write('Главный определитель = ', opred);
  readln;
 
  for d:= 0 to n-1 do
    begin
      b:= a;                             //составление d-го подопределителя
      for c:= 0 to n do
        b[c,d]:= a[c,n];
 
    writeln(d, '-й определитель:');
 
    for i:= 0 to n-1 do                      {вывод}
    begin
      for j:= 0 to n-1 do
        write(b[i,j]:6:3, ' ');
      writeln;
    end;
    readln;
 
      for j:= 0 to n-2 do
        begin
          r:= b[j,j];
       
        if r = 0 then                       //избавление от нулей на
          for i:= 0 to n-1 do                   //главной диагонали
            if b[i,j] <> 0 then                   //d-го подопределителя
              begin
                for m:= 0 to n do
                  b[j,m]:= b[j,m] + b[i,m];
                break;
              end;
 
          for i:= j+1 to n-1 do               //приведение d-го определителя к
            begin                               //треугольному виду
              s:= b[i,j];
              for m:= j to n-1 do
                b[i,m]:= b[i,m] * r - b[j,m] * s;
            end;
        end;
 
    opr[d]:= 1;                         //вычисление d-го
      for i:= 0 to n-1 do                     //подопределителя
        opr[d]:= opr[d] * b[i,i];
       
      for i:= 0 to n-1 do                      {вывод}
        begin
          for j:= 0 to n-1 do
            write(b[i,j]:6:3, ' ');
          writeln;
        end;
      readln;
       
        write(d, '-й определитель = ', opr[d]);
        readln;
    end;
 
  for i:= 0 to n-1 do
    x[i]:= opr[i] / opred;
   
  for i:= 0 to n-1 do
    writeln(x[i]);
   
end.

Помогите, прошу!
Вот спишь, спишь, спишь, потом просыпаешься... а одеяло всё ещё спит. (с)

Оффлайн Selyd

  • Старожил
  • ****
  • Сообщений: 408
    • Просмотр профиля
Re: Крамер. Вычисление определителей.
« Ответ #1 : 04 Мая 2011, 22:48:42 »
Я печатаю промежуточные результаты. Не все сразу, по-блочно.
И, таким образом, постепенно проверяю работу программы.
Уже поздно, посмотрю завтра.

 

Вычисление числа пи, алгоритм подсчета с нужной точностью

Автор AntonResl

Ответов: 4
Просмотров: 4316
Последний ответ 03 Октября 2011, 20:01:50
от AntonResl
Вычисление по формуле, согласно норме матрицы

Автор drongoo

Ответов: 5
Просмотров: 6825
Последний ответ 09 Мая 2010, 06:36:20
от drongoo
Вычисление полинома по схеме Горнера(Pascal)

Автор 00884

Ответов: 3
Просмотров: 13426
Последний ответ 17 Февраля 2011, 16:35:09
от Nataniel
Как в паскале организовать вычисление 100 факториал?

Автор bifshtex

Ответов: 2
Просмотров: 5542
Последний ответ 28 Марта 2010, 17:35:06
от bifshtex
Вычисление квадратной матрицы, pascal

Автор Vogelfrei

Ответов: 3
Просмотров: 3850
Последний ответ 13 Декабря 2011, 02:07:43
от wital1984