Wątek przeniesiony 2018-05-11 12:47 z Delphi i Pascal przez furious programming.

Rozwiązywanie układu równań metodą eliminacji Jordana – gdzie jest błąd?

0

Witam, moim zadaniem jest napisanie programu rozwiązującego układ równać metodą eliminacji Jordana. Napisałem kod, który już przy pierwszej pętli działa nie poprawnie i nie wiem gdzie leży błąd. Załączam część kodu w której występuje problem.

program jordans_method;

uses 
  crt;

type
  tablica = array [1..4, 1..5] of real;

var
  a : tablica;
  i,j : integer;
begin
  clrscr;

  WriteLn('Program wyszukuje rozwiazania ponizszego ukladu rownan metoda eliminacji Jordana-Gaussa');
  WriteLn();
  WriteLn('Podany uklad rownan to: ');
  WriteLn('2x + 1y - 0.1z + 1w = 2.7');
  WriteLn('0.4x + 0.5y + 4z - 8.5w = 21.9');
  WriteLn('0.3x - 1y + 1z + 5.2w = -3.9');
  WriteLn('1x + 0.2y + 2.5z - 1w = 9.9');

  a[1,1]:=2;
  a[1,2]:=1;
  a[1,3]:=-0.1;
  a[1,4]:=1;
  a[1,5]:=2.7;
  a[2,1]:=0.4;
  a[2,2]:=0.5;
  a[2,3]:=4;
  a[2,4]:=-8.5;
  a[2,5]:=21.9;
  a[3,1]:=0.3;
  a[3,2]:=-1;
  a[3,3]:=1;
  a[3,4]:=5.2;
  a[3,5]:=-3.9;
  a[4,1]:=1;
  a[4,2]:=0.2;
  a[4,3]:=2.5;
  a[4,4]:=-1;
  a[4,5]:=9.9;

  for j:=1 to 5 do
    a[1,j]:=a[1,j]/a[1,1];

Problem jest leży właśnie w tej ostatniej pętli. Dla kolejnych elementów macierzy tj. 2, 1, -0.1, 1, 2.7, pętla powinna moim zdaniem dać wyniki 1, 0.5, -0.05, 0.5, 1.35. Niestety pętla zmienia tylko pierwszy element, pozostawiając resztę bez zmian. Byłbym bardzo wdzięczny za wskazówkę gdzie robię błąd.

1

Rozpisz sobie na kartce to zobaczysz co masz źle. Dzielisz elementy przez wartość elementy głównego (zaczynając od elementu głównego). W twoim przypadku masz w pierwszym wierszu: 2 1 -0.1 1 2.7.
Dzielisz a[1,j] przez a[1,1], czyli masz 2/2=1, Później każdą wartość dzielisz znowu przez nową wartość a[1,1] czyli 1.
Trzeba to robić na dwóch tablicach głównej i tymczasowej. Na koniec iteracji przenosisz elementy z tablicy tymczasowej na główną, kasujesz tymczasową i od nowa.
PS. Do formatowania Delphi jest znacznik ```delphi

0

Bardzo dziękuję za pomoc, jakoś nie zauważyłem tego że przy kolejnych iteracja jest podstawiana nowa wartość elementu a[1,1]. Z tymi tablicami to jestem za dużym laikiem i jakoś bardzo nie chce mi się myśleć jak to zrobić więc przed pętlą dodałem dodatkową zmienną która wykonuje działanie:

n:=1/a[1,1];

for j:=1 to 5 do
  a[1,j]:=a[1,j]*n;

Teraz już wszystko działa.
Pozdrawiam i jeszcze raz dziękuję za pomoc

1 użytkowników online, w tym zalogowanych: 0, gości: 1