Skocz do zawartości
Zamknięcie Forum PC LAB

Szanowny Użytkowniku,

Informujemy, że za 30 dni tj. 30 listopada 2024 r. serwis internetowy Forum PC LAB zostanie zamknięty.

Administrator Serwisu Forum PC LAB - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie: wypowiada całość usług Serwisu Forum PC LAB z zachowaniem miesięcznego okresu wypowiedzenia.

Administrator Serwisu Forum PC LAB informuje, że:

  1. Z dniem 29 listopada 2024 r. zakończy się świadczenie wszystkich usług Serwisu Forum PC LAB. Ważną przyczyną uzasadniającą wypowiedzenie jest zamknięcie Serwisu Forum PC LAB
  2. Dotychczas zamowione przez Użytkownika usługi Serwisu Forum PC LAB będą świadczone w okresie wypowiedzenia tj. do dnia 29 listopada 2024 r.
  3. Po ogłoszeniu zamknięcia Serwisu Forum od dnia 30 października 2024 r. zakładanie nowych kont w serwisie Forum PC LAB nie będzie możliwe
  4. Wraz z zamknięciem Serwisu Forum PC LAB, tj. dnia 29 listopada 2024 r. nie będzie już dostępny katalog treści Forum PC LAB. Do tego czasu Użytkownicy Forum PC LAB mają dostęp do swoich treści w zakładce "Profil", gdzie mają możliwość ich skopiowania lub archiwizowania w formie screenshotów.
  5. Administrator danych osobowych Użytkowników - Ringier Axel Springer Polska sp. z o.o. z siedzibą w Warszawie zapewnia realizację praw podmiotów danych osobowych przez cały okres świadczenia usług Serwisu Forum PC LAB. Szczegółowe informacje znajdziesz w Polityce Prywatności

Administrator informuje, iż wraz z zamknięciem Serwisu Forum PC LAB, dane osobowe Użytkowników Serwisu Forum PC LAB zostaną trwale usunięte ze względu na brak podstawy ich dalszego przetwarzania. Proces trwałego usuwania danych z kopii zapasowych może przekroczyć termin zamknięcia Forum PC LAB o kilka miesięcy. Wyjątek może stanowić przetwarzanie danych użytkownika do czasu zakończenia toczących się postepowań.

Temat został przeniesiony do archiwum

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

Soulburner

[c++] Metoda Gauss'a - rozwiązanie równania trójkątnego

Rekomendowane odpowiedzi

Witam!

 

Jest sobie taki kodzik:

 

#include <cstdlib>
#include <iostream>
#include <math.h>
#include <iomanip>
#include <fstream>
#include <cmath>

using namespace std;


int gauss(int r, double t[100][101], double x[100])
{			  
  for(int i=1;i<r;i++)		 //eliminacja zmiennych
  {
 for(int k=i;k<r;k++)
 {							   
   for(int j=i;j<r+1;j++)		   
	  {	
		t[k][j]=t[k][j]-(t[i-1][j]*(t[k][i-1]/t[i-1][i-1]));
	  }
   t[k][i-1]=0;
 }						
  }

//wypisanie ukladu po eliminacji			   
  for(int i=0;i<r;i++)
  {
 for(int j=0;j<r;j++)
 {
	cout << t[i][j] << " ";		
 }		
 cout << t[i][r] << endl;
  }
  cout << "--------------------------" << endl;

  //rozwiązanie równ. trójkątnego tu winno się znaleźć...
  return 1;
}

//------------------------------------------------------------------------------
int main(int argc, char *argv[])
{
int n;
double x[100];
double tab[100][101];

//wyzerowanie tablicy na wszelki wypadek, bo podczas eksperymentow pokazywaly sie wyniki z kosmosu, dajac nadzieje na to, ze cos sie liczy;)
for (int i=0; i<=100; i++)
	x[i]=0;

ifstream wejscie("gauss_in.txt");
wejscie >> n;
for(int i = 0; i < n; i++)
{
  for(int j = 0; j <= n; j++) 
  {	  
	wejscie >> tab[i][j];
  }
}

cout << "Wczytana macierz:" << endl;
for(int i=0;i<n;i++)
{
  for(int j=0;j<n;j++)
  {
		  cout << tab[i][j] << "  ";
  }
  cout << " = " << tab[i][n] <<"  ";
  cout << endl;
}
cout << "--------------------------------" << endl;


gauss(n,tab,x)
  cout <<"Rozwiazanie trojkatnego rownania:\n";
//tu sie powinno znalezc, ino trzeba pierw iksy skads wziac :/	 
system("PAUSE");
return EXIT_SUCCESS;
}

 

Wszystko pięknie, tylko jak napisać funkcję rozwiązującą równanie trójkątne? Głowa mi już pęka (z bólem zatok nie ma żartów ;)) i proszę o pomoc Was. W jaki sposób zapisać wzór? Jak wygląda w ogóle ten wzór? :P

 

Z góry dzięki za wszelkie porady.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zakladam, ze chodzi o eliminacje gaussa.

Ogolnie chodzi o przeksztalcenie macierzy [A] w macierz trojkatna, czyli:

 

| x1 y1 z1 t1 |

| x2 y2 z2 t2 | =>

| x3 y3 z3 t3 |

| x4 y4 z4 t4 |

 

| 1 y1 z1 t1 |

| 0 1 z2 t2 |

| 0 0 1 t3 |

| 0 0 0 1 |

 

I pozniej podstawiasz sobie kolejno wiadome pod niewiadome.

Macierz w takiej postaci uzyskuje sie wlasnie dzieki metodzie eliminacji gaussa.

Na angielskiej wiki dot. metody gaussa mozesz znalesc tez przykladowa implementacje tego algorytmu w pseudokodzie.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
I pozniej podstawiasz sobie kolejno wiadome pod niewiadome.

 

A numerycznie wygląda to w ten sposób, że odejmujesz od wszystkich wierszy najpierw ostatni (oczywiście przeskalowany) - wtedy na ostatniej kolumnie wskoczą zera. Potem przedostatni itd aż do osiągnięcia macierzy diagonalnej

 

A BTW - wydaje mi się (nie czytałem kodu dokładnie), że nie przekształcasz sobie ostatniej kolumny ("prawej strony") ani nie zapisujesz nigdzie współczynników. Bez tego nie odtworzysz rozwiązania :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kiedys pisałem na zajeciach. kod jest w php. moze sie przyda

 

$wsp[0][0] = 2;
$wsp[0][1] = 3;
$wsp[0][2] = (-1);
$wsp[1][0] = 1;
$wsp[1][1] = 1;
$wsp[1][2] = 1;
$wsp[2][0] = 1;
$wsp[2][1] = 0;
$wsp[2][2] = (-2);

$wyn[0] = 15;
$wyn[1] = 3;
$wyn[2] = 6;

$n = 3;

//zadeklarowane wspołczynniki

for ($a = 0; $a < $n; $a++)
{
$lambda = 1 / $wsp[$a][$a];
for($b = 0; $b < $n; $b++) { $wsp[$a][$b] = $wsp[$a][$b] * $lambda; }
$wyn[$a] = $wyn[$a] * $lambda;
for ($b = $a+1; $b < $n; $b++)
{
$alfa = (-1) * $wsp[$b][$a];
for($c = 0; $c < $n; $c++) { $wsp[$b][$c] = $wsp[$b][$c] + ($wsp[$a][$c] * $alfa); }
$wyn[$b] = $wyn[$b] + ($wyn[$a] * $alfa);
}
}

//zakoncznie tworzenia macierzy

$x[$n-1] = $wyn[$n-1];


for ($a = $n-2; $a >= 0; $a--)
{
$wyr = 0;
for ($b = $a+1; $b < $n; $b++) { $wyr = $wyr - ($wsp[$a][$b] * $x[$b]); }
$x[$a] = $wyn[$a] + $wyr;
}


//wyswietlanie wynikow
for ($a = 0; $a < $n; $a++)
{
echo $x[$a] . " ";
}

 

pozdrawiam

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ogólnie chodzi o to, że jak jest układ równań, to jak któreś z równań pomnożymy,podzielimy,(tutaj nie mam pewności: dodamy lub odejmiemy) od innego, to wartości zmiennych się nie zmienią. W ten sposób dąży się do tzw. trójkątku Gaussa poprzez np.

I. 2x+5y+1z=0

II. x-3y-3z=0

III. 4x+1y-z=0

 

III->III+I //Równanie III podmnieniamy sumą równań III+I

4x+1y-z=0

+

2x+5y+z=0

=

6x+6y=0

I tak się pozbyłem z i potem robisz tak dalej, aż osiągniesz np. taki trójkąt:

 

x=5

x+y=10

x+y+z=15

 

czyli

x=5

y=10-5=5

z=15-5-5=5

Czyli jak widać, jak już będziemy mieli ten trójkąt, wszystkie niewiadome mamy jak na dłoni.

Opisałem mniej więcej jak to się liczy, a tobie pozostawiać implementację w c++.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...