V nejbližší době začnu rozjíždět projekt na vytvoření programového prostředí pro optimalizaci betonových konstrukcí. Součástí tohoto programy bude rozhraní pro statickou analýzu konstrukce. Právě tady budu potřebovat nějaký nástroj na řešení lineární rovnic.
Knihovna lapack
vypadá jako přesně to, co potřebuju. Díky své nadstavbě lapackpp
(dříve lapack++
) ji lze používat přímo ve zdrojovém kódu. V repozitáři Debianu jsem ji bohužel nenašel, instalace ze zdroje byla naštěstí bezproblémová (./configure –with-gnu-ld && make && make install). Jediný problém bylo v několika souborech, které includovaly vlastní knihovny pomocí #include , místo #include "", ačkoliv hledané soubory byly přímo v adresáři.
Příklad:
#include "lapackpp/lapackpp.h"
using namespace std;
// reseni soustavy lineárních rovnic
int main() {
int N = 2000;
// Matice koeficientu soustavy
LaGenMatDouble A(N,N);
// Vysledny vektor a vektor prave strany
LaVectorDouble x(N), b(N);
// Vygenerovnani nahodne matice a vektoru
for (int i = 0; i < N; i++) {
b(i) = i;
for (int k = 0; k < N; k ++) { A(i, k) = i * k + rand(); }
}
// ...a reseni.
LaLinearSolve(A,x,b);
return 0;
}
Řešení této soustavy o 2000 rovnicích trvá necelé 4s, pro N = 250 je potřebný čas 10ms, což dává docela dobré vyhlídky na interaktivitu grafického rozhraní programu.
Další informace je možné najít na webu lapackpp
.
V AV jsme používali ATLAS, http://math-atlas.sourceforge.net, implementaci BLASu a části LAPACKu s rozhraním v C a Fortran 77. Je výkonná, doporučuji se na ni podívat, možná je i v Debianu.
No poměrně dobrý je přímý řešič UMFPACK (pokud vím). Pokud to budeš řešit konečnými prvky, můžeš využít nějakou knihovnu, která se Ti postará o vše. Třeba Deal.II (www.dealii.org/)
Muzete kouknout i na uBLAS http://www.boost.org/doc/libs/1_39_0/libs/numeric/ublas/doc/index.htm, je soucasti Boost C++ libraries, programatori v C++ ji urcite znaji...
Nedalo mi to a podíval jsem se v googlu na další výsledky hledání. Těch aplikací je skutečně hodně než jsem si myslel, aneb úvod naivního C/C++ začátečníka do světa programovaní.
Zajímavě vypadá taky http://arma.sourceforge.net/.
Budu to muset všechno projít a vybrat nejvhodnější pro mé účely.
Ještě jednou dík za odkazy.
GNU Scientific Library
www.gnu.org/software/gsl
Najdete si repozitare Netlib, hafo matematickych funkci v C, Fortranu, Java....
A samozřejmě pokud netrváš na použití z C++, máš spoustu dalších možností. Např. GNU Octave umožňuje pohodlně použít jak LAPACK, tak UMFPACK.
Třeba tvůj příklad by vypadal takto:
N = 2000;
b = (0:N-1).';
A = b*b.' + rand (N);
x = A \ b; # použije se LAPACK.
Syntaxe řešení rovnic je úplně stejná (A \ b), i když je A řídká matice (pak se použije UMFPACK nebo CHOLMOD).
Moje zkušenost je taková, že na hustou (tj. ne řídké matice) lineární algebru je LAPACK (a jeho komerční akcelerace, např. ACML, Intel MKL) špička, pokud jde o rychlost, numerickou robustnost a state-of-the-art algoritmy.
http://www.oofem.org, co se matic týče, tak už vzpomínaný http://eigen.tuxfamily.org
Kašli na to. Co chceš optimalizovat na betonových konstrukcích? Ty se budeš trápit s nějakým programem, kterej možná někde posune nebo vypusí nějaký železo, ztenčí desku o centimetr a ty hovada na stavbě to pak stejně udělaj podle sebe (tj. úplně jinak), nahrnou tam hlínu a kde jaký swinstvo a stejně to bude držet....:o))
Nebol by nejaky odkaz na popis/ukazku takych rovnic/prikladov?
Nas v skole nutili kodit Simplexa, Gomory-ho atd. pre riesenie systemu linearnych podmienok(nerovnic) podla zadanej ucelovej funkcie, ktoru sa algoritmus snazi minimalizovat alebo maximalizovat - toto mi pride trochu flexibilnejsie, nenasli by ste preto pouzitie?
Resil jsem nedavno podobny problem, prosel jsem vetsinu zde zminenych projektu a nakonec jsem skoncil u IT++, http://itpp.sourceforge.net/.
Je to jen C++ obalka blasu, at uz od MKL, ACML nebo atlasu, ale ma syntaxi podobnou matlabu a je skvele podporovana. Navic je ve vsech vetsisch distribucich.
Hlavnim cilem jsou sice kodovaci algoritmy, ale da se velmi snadno prelozit bez nich.
alebo dalsia alternativa: http://flens.sourceforge.net/
pripadne pozri na specificke riesice zlatu kniznicu http://www.netlib.org/
[25] To zdaleka ne; zejmena byvaji potize s rychlosti operaci, ktere nejsou zapouzdrene v jedne funkci. Na druhou stranu, C a C++ knihovny se zpravidla nemuzou merit s Octave co do mnozstvi obsazenych "hotovych" algoritmu, at uz je to FLENS, Eigen nebo Boost (tedy jeho numericka cast), byt casto ty implementace v Octave jsou o neco pomalejsi. Totez plati o Matlabu. S Octave mate navic tu vyhodu, ze muzete kteroukoliv funkci vylepsit a poslat nam ji, v Matlabu to jde jen s m-funkcemi a teoreticky to podle EULA delat nesmite vubec (fakt!).
Nechci rejpat, ale v prvni rade bych si zjistil neco o numerickych metodach. Existuje spusta metod reseni soustav linearnich rovnic a kazda z nich se hodi na trochu jiny typ problemu. I lapack ma v sobe nekolik variant. V zasade se musi uvazovat dve veci, kolik rovnic je treba resit (pokud mas N rovnic matice problemu ma N^2 prvku, a treba Gauss-Jordanova eliminace ma slozitost O(N^3)!!!) a jaka je struktura matice problemu (plna, trojuhelnikova, pasova, obecne ridka, etc.). Pokud se clovek rozhodne pro vhodnou numerickou metodu/algoritmus, pak tepr resi, jakou knihovnu na to napasovat.
[27] Souhlasim. Ja jsem si jen naivne myslel, ze tech knihoven tolik nebude, takze jsem byl nadseny, kdyz jsem jednu nasel a hned jsme se do ni zacetl...
Ted resim algoritmus, az to bude hotove a budu v tom mit jasno, tak se zacnu divat, ktera knihovna je pro me vhodna.
…
Přečteno 9 981×
Přečteno 8 634×
Přečteno 7 971×
Přečteno 6 524×
Přečteno 6 074×