Voglio scrivere una routine Java che controlli se è fattibile o meno un sistema di equazioni lineari. Ho più variabili che equazioni, quindi il sistema è sottodeterminato.
Esiste un qualche tipo di algoritmo standard per questo? E se sì, qual è la sua complessità temporale?
risposte:
1 per risposta № 1Credo che sarebbe quello che stai cercando (per scrivere il risolutore completo) Eliminazione gaussiana. Per aver solo verificato se è risolvibile, Ipensi di poter semplicemente verificare di avere almeno tante equazioni linearmente indipendenti quante sono le variabili da risolvere (l'indipendenza lineare significa sostanzialmente che i vettori formati dai coefficienti delle equazioni non sono paralleli). Per un video di entrambe le spiegazioni di indipendenza lineare e attraversando un esempio di eliminazione gaussiana, vedi Qui.
Per quanto riguarda la complessità temporale, dirigerò la tua attenzione questa discussione, anche se dubito che avrà il minimo senso fino a quando non ti sarai presentato al processo di eliminazione gaussiana.
Ci scusiamo per la mancanza di informazioni specifiche su Java, "Sono più un tipo C ++, e per lo più ti sto solo indicando come creare il tuo.
1 per risposta № 2
Quello che stai cercando è chiamato il metodo simplex. Basta eseguire a risolutore di programmazione lineare (Strumento di programmazione lineare / Librerie per Java) sul problema impostando la funzione obiettivo su zero (o qualsiasi altra costante arbitraria).
La complessità temporale prevista è polinomiale. La complessità del caso peggiore è però esponenziale, ma lo è molto molto raro; solo esempi artificiali sono noti per richiedere così tanto tempo.