Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rozkład Macierzy LU - Metoda Dollitle'a
Forum PHP.pl > Forum > Gotowe rozwiązania > Algorytmy, klasy, funkcje
kudlaty12
Witajcie.
Mam pewien problem, ponieważ napisałem skrypt do liczenia macierzy (rozkład LU) metodą Dollitle'a. Jest on oparty na przykładzie zawartym na wikipedia.pl , jednak nie dziala do końca tak jak powinien. Wartości bedące 0 zapisują sie w macierzy L ponizej przekątnej i w macierzy U ponad przekątną. Jednak problem polega na tym ze nie ma wypelnienia calych macierzy, gdzyż kilka luk po wykonaniu skryptu zostaje pusta. I pytanie brzmi czemu ?
Czy ktoś mógłbym sprawdzić kod i pomóc mi w odnalezieniu błędu ?
Będę wdzięczny winksmiley.jpg

Ponizej przesyłam link do kodu w php.


http://lew.wsinf.edu.pl/~blazej01/rozkladlu.txt

a o to wersja graficzna jak to wygląda :

http://lew.wsinf.edu.pl/~blazej01/rozkladlu2.php

a tutaj link do materiału na Wikipedia.pl :

http://pl.wikipedia.org/wiki/Metoda_LU
rzymek01
Witaj,
dzięki za linka do LU, bo nie znałem wcześniej tej metody :]

odnośnie kodu - zawsze chciłem to powiedzieć - u mnie działa biggrin.gif

dobra, było parę błędów w kodzie, ale jakoś poszło:
1. inicjalizuj zmienne, np. $suma = 0;
2. wg mnie sprawdzenie w liczeniu kolumn u[i][i]!=0 mija się z celem, bo wtedy cała metoda idzie sie j*** na łąkę i trzeba zastosować - z tego co tam jest napisane - metodę Crouta
3. zrób sobie z tego klase, zeby nie trzeba bylo przekazywac co chwilę macierzy, i,j,n smile.gif
4. nie kamufluj błędów @-małpą, w ifie $i =1 (przypisanie!), akurat ten warunek był cały zbędny
5. natomiast główne błąd to logiczny w iteracji pętli, np. sumuje się włącznie do k-1, oraz w kolumnach bierzemy za $j o jeden więcej niż w wierszach

kod:
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
  2. "http://www.w3.org/TR/html4/strict.dtd">
  3.  
  4. <html>
  5.  
  6. <head>
  7.  
  8. <title>Mnozenie Macierzy</title>
  9. <meta http-equiv="Content-type" content="text/html; charset=utf-8">
  10.  
  11. <style type="text/css">
  12. .pro{
  13. text-align: center;
  14. }
  15. .proo{
  16. margin-left: auto;
  17. margin-right: auto;
  18. width: 200px
  19.  
  20. }
  21. body {
  22. background-color:#ff9900;
  23.  
  24. }
  25.  
  26. </style>
  27. </head>
  28.  
  29.  
  30. <?php
  31.  
  32. //Budujemy 3 tablice, A = L * U (przyklad ponizej to przyklad dla macierzy 3x3)
  33.  
  34.  
  35.  
  36. //macierz A:
  37.  
  38. $A = array( 'a11' => '5', 'a12' => '3', 'a13' => '2',
  39.  
  40. 'a21' => '1', 'a22' => '2', 'a23' => '0',
  41.  
  42. 'a31' => '3', 'a32' => '0', 'a33' => '4',
  43. );
  44.  
  45. //kolumny macierzy:
  46.  
  47. $L = array( 'l11' => '1', 'l12' => '0', 'l13' => '0',
  48.  
  49. 'l21' => '' , 'l22' => '1', 'l23' => '0',
  50.  
  51. 'l31' => '' , 'l32' => '' , 'l33' => '1',
  52. );
  53.  
  54. //wiersze macierzy:
  55.  
  56. $U = array( 'u11' => '' , 'u12' => '' , 'u13' => '' ,
  57.  
  58. 'u21' => '0', 'u22' => '' , 'u23' => '' ,
  59.  
  60. 'u31' => '0', 'u32' => '0', 'u33' => '' ,
  61. );
  62.  
  63. //Aby wynik byl poprawny musimy obliczac na przemian wiersze macierzy U i kolumny macierzy L
  64.  
  65.  
  66. //funkcja liczaca $U czyli wiersze macierzy
  67.  
  68. function liczWiersz(&$A, &$L, &$U, $i, $j) {
  69.  
  70. $suma = 0;
  71.  
  72. for($k=1;$k<=$i-1;$k++)
  73. $suma += ($L['l'.$i.$k] * $U['u'.$k.$j]);
  74.  
  75. $U['u'.$i.$j] = round($A['a'.$i.$j] - $suma, 3);
  76. }
  77.  
  78. // funkcja liczaca $L czyli kolumny macierzy
  79. function liczKolumne(&$A, &$L, &$U, $i, $j) {
  80. $suma = 0;
  81.  
  82. if($U['u'.$i.$i] != 0 ) {
  83.  
  84. for($k=1;$k<=$i-1;$k++)
  85.  
  86. {
  87.  
  88. $suma += ($L['l'.$j.$k] * $U['u'.$k.$i]);
  89.  
  90. }
  91.  
  92. $L['l'.$j.$i] = round( (1 / $U['u'.$i.$i]) * ($A['a'.$j.$i] - $suma), 3);
  93.  
  94. }
  95.  
  96. }
  97.  
  98.  
  99.  
  100. for($i=1;$i<=3;$i++) {
  101.  
  102. for($j=$i;$j<=3;$j++) {
  103.  
  104. liczWiersz($A, $L, $U, $i, $j);
  105.  
  106. }
  107.  
  108. for($j=$i+1;$j<=3;$j++) {
  109.  
  110. liczKolumne($A, $L, $U, $i, $j);
  111. }
  112.  
  113. }
  114.  
  115. //funkcja wyswietlajaca macierz
  116. // $M - dana macierz jaka chcemy wyswietlic
  117. // $p - przedrostek kolumny
  118.  
  119. function wyswietlMacierz(&$M, $p) {
  120.  
  121. // strtoupper - zwraca ciag znakow z wszystkimi literami alfabetu przekonwertowanymi na duże.
  122.  
  123. echo "Macierz ".strtoupper($p);
  124.  
  125. echo "<table style=\"border: 1px solid black; width: 150px; text-align: center;\">";
  126.  
  127. for($i=1;$i<=3;$i++) {
  128.  
  129. echo "<tr>";
  130.  
  131. echo "<td>".$M[$p.$i.'1']."</td><td>".$M[$p.$i.'2']."</td><td>".$M[$p.$i.'3']."</td>";
  132.  
  133. echo "</tr>";
  134.  
  135. }
  136.  
  137. echo "</table>";
  138.  
  139. }
  140.  
  141.  
  142.  
  143. wyswietlMacierz($A, 'a');
  144.  
  145. wyswietlMacierz($L, 'l');
  146.  
  147. wyswietlMacierz($U, 'u');
  148.  
  149.  
  150.  
  151.  
  152.  
  153. ?>
  154. <br>
  155. <br>
  156. <br>
  157. <br>
  158. <br>
  159. <br>
  160.  
  161. <footer>Stworzone na podstawie przykładu z Wikipedia.pl</footer>
kudlaty12
Wielkie dzieki. Mówiłem ze kilka błędów małych bo tak to reszta była dobrze.

Poprawiłem sobie jeszcze wedlug siebie ale i tak działa winksmiley.jpg
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.