Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 8 odgovora
  • 5.367 pregleda

Najnovija ↓

Programski kod za inverz matrice..... 08.03.2005. u 20:26 · pre 263 meseca #1
Želio bih zamoliti za pomoć u vezi ovog zadatka.Naime zadata je kvadratna matrica(nXn),gdje se n i elementi njeni unose.Treba napisati algoritam koji će izbaciti inverz te matrice.Imama dojam da bih znao riješit zadatke za pojedinačne slučajeve n=2 ili3....ali za n........teško....

Hvala!

p.s.nekima će se ovo učinit lagano.....ali pomozite!
Re: Programski kod za inverz matrice..... 08.03.2005. u 22:43 · pre 263 meseca #4
Mozes da uradis preko Gausovog algoritma za odredjivanje inverzne matrice.
Ideja algoritma je vrlo jednostavna. Radi se sa dve matrice pocetnom i jedinicnom (cije su dimenzije jednake onim od pocetne matrice).
Od pocetne matrice treba da dobijes jedinicnu (dovoljan uslov da je determinanta razlicita od 0) primenom dozvoljenih operacija (pomocu kojih se dobija ekvivalentna matrica). Istovremenom primenom ovih operacija na polaznu jedinicnu matricu dobices inverznu kada pocetnu svedes na jedinicnu.
Potpis
Owl
Re: Programski kod za inverz matrice..... 09.03.2005. u 00:03 · pre 263 meseca #5
Da, to jeste dobro resenje ali treba pronaci dobitnu kombinaciju elementarnih transformacija nad kolonama. (na papiru jeste lako ali nisam siguran bas kako bi se to moglo iskodirati, a da slozenost algoritma ne bude eksponencijalna - mada verovatno i postoji neko resenje za to)

Ipak, ukoliko su matrice manje mozes probati pomocu:
A^{-1} = \frac 1 {detA} \cdot adjA
Potpis
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
Re: Programski kod za inverz matrice..... 09.03.2005. u 15:39 · pre 263 meseca #6
Citat:
Goran Rakić:
Da, to jeste dobro resenje ali treba pronaci dobitnu kombinaciju elementarnih transformacija nad kolonama. (na papiru jeste lako ali nisam siguran bas kako bi se to moglo iskodirati, a da slozenost algoritma ne bude eksponencijalna - mada verovatno i postoji neko resenje za to)

U stvari, te kombinacije ne moraju da se traže, dovoljno je u svakom koraku pomnožiti i oduzeti tekuću vrstu od svih narednih tako da se anuliraju svi elementi ispod trenutnog položaja na dijagonali (doduše, uz jednu malu kvačicu). Zatim isto to krećući se odozdo, da se anulira sve iznad dijagonale. Tako da složenost ispadne kubna.

Citat:

Ipak, ukoliko su matrice manje mozes probati pomocu:
A^{-1} = \frac 1 {detA} \cdot adjA

Uh, ovo je ne samo eksponencijalne složenosti (što možda nije ni bitno, jer mi se čini da je ovde neka obrazovna potreba), nego je, rekao bih, i dobrano zeznuto za implementaciju u odnosu na Gausov algoritam (koga čine, u suštini, tri ugnježdene petlje).
Re: Programski kod za inverz matrice..... 09.03.2005. u 17:01 · pre 263 meseca #7
Da sada sam skapirao kako se implementira gausov metod. Hvala na razjasnjenju. :) Jeste mnogo brze i lakse za implementaciju.

Sto se implementacije tice, resenje za determinantu postoji na ovom forumu, a za adjungovanu matricu pa to je samo m^2 determinanti. (naravno poslednja recenica je ironija, i svakako da je gausov metod jednostavniji)
Potpis
http://sr.libreoffice.org — slobodan kancelarijski paket, obrada teksta, tablice,
prezentacije, legalno bez troškova licenciranja
Re: Programski kod za inverz matrice..... 16.03.2005. u 17:57 · pre 263 meseca #9
Moze li mi neko ovaj kod prebacit u pascal...bio bih jako zahvalan...

#include <iostream>
#include <cstdio>
#include <cmath>
#include <climits>

using namespace std;

#define MAX 100

struct matrica
{
float data[MAX][MAX];
int m, n;
};

float det(matrica &a)
{
float res = INT_MAX;
if (a.m != a.n)
{
printf("Ovo nije kvadratna matrica!");
}
else if (a.m == 1)
{
res = a.data[0][0];
}
else
{
res = 0;
for (int i = 0; i < a.m; i++)
{
matrica b;
b.m = a.m - 1;
b.n = a.n - 1;
int mcur = 0, ncur = 0;
for (int m = 0; m < a.m; m++)
for (int n = 0; n < a.n; n++)
{
if (m != i && n != 0)
{
b.data[mcur][ncur] = a.data[m][n];
ncur++;
mcur += ncur / b.n;
ncur %= b.n;
}
}
res += (i % 2 == 0?1:-1) * a.data[0] * det(b);
}
}
return res;
}

int main()
{
matrica a;
matrica trans;
matrica adj;
matrica inv;
scanf("%i", &a.m);
a.n = a.m;
trans.n = adj.n = inv.n = a.n;
trans.m = adj.m = inv.m = a.m;
for (int i = 0; i < a.m; i++)
for (int j = 0; j < a.n; j++)
{
scanf("%f", &a.data[j]);
trans.data[j] = a.data[j];
}
float c = 1.0 / det(a);
int maxw = 0;
for (int i = 0; i < adj.m; i++)
for (int j = 0; j < adj.n; j++)
{
matrica b;
b.m = trans.m - 1;
b.n = trans.n - 1;
int mcur = 0, ncur = 0;
for (int m = 0; m < trans.m; m++)
for (int n = 0; n < trans.n; n++)
{
if (m != i && n != j)
{
b.data[mcur][ncur] = trans.data[m][n];
ncur++;
mcur += ncur / b.n;
ncur %= b.n;
}
}
adj.data[j] = ((i + j) % 2 == 0?1:-1) * det(b);
inv.data[j] = c * adj.data[j];
}
for (int i = 0; i < inv.m; i++)
{
for (int j = 0; j < inv.n; j++)
{
printf("%+.2f\t", inv.data[j]);
}
printf("\n");
}
system("pause");
}

Hvala!
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme