Możemy teraz wybierać stopień wielomianu interpolacyjnego
używanego do wyznaczenia lepszego czynnika skalującego: -snes_eq_ls
[quadratic,cubic], to znaczy, odpowiednio, funkcją kwadratową
lub sześcienną. Więcej szczegółów Czytelnik znajdzie u Kelley'a [11]
oraz w [14]. Dodatkowo, możliwy jest
także wariant
-snes_eq_ls basic. Taki wybór oznacza rezygnację z techniki
line search i pozostanie przy klasycznej metodzie Newtona.
Metody wyszukiwania kierunkowego wymagają ustawienia
pewnych parametrów relaksacyjnych,
-snes_eq_ls_alpha <alpha>, -snes_eq_ls_maxstep <max>,
-snes_eq_ls_steptol <tol>, gdzie oznaczenia są zgodne z [4].
Na szczęście, predefiniowane wartości tych parametrów są zazwyczaj rozsądne
dla wielu zagadnień.
ierr = SNESSetTolerances(SNES snes,double rtol,double atol,double stol, int maxits,int maxfcts);
lub z linii komend: -snes_atol <atol>, -snes_rtol
<rtol>, -snes_stol <stol>,
-snes_max_it <maxits> oraz -snes_max_funcs <maxfcts>.
Zmianę opcji SLESu wykorzystywanego przez SNES możemy uzyskać z programu, wyłuskując kontekst SLESu funkcją int SNESGetSLES( SNES MojSnes, SLES * MojSnesSles ) a następnie używając procedur typu SLESGetKSP() lub SLESGetPC(). Naturalnie, to samo uzyskamy podając odpowiednie opcje w linii komend.
Zazwyczaj programy (w początkowym stadium) nie są wolne od błędów. Można się w szczególności obawiać, że zaprogramowana przez nas macierz jakobianu nie jest idealna. Na szczęście, możemy porównać działanie programu z naszą macierzą jakobianu i programu, w którym zostanie użyta jej aproksymacja metodą różnic skończonych. W wypadku, gdy używamy macierzy typu powłokowego, możemy naszą funkcję Jakobian(), realizującą działanie jakobianu, zastąpić jej aproksymacją generowaną wewnętrznie przez PETSc metodą różnic skończonych: wystarczy uruchomić program z opcją -snes_mf. Podobny skutek można uzyskać (ale już tylko dla niepowłokowej macierzy jakobianu) stosując opcję -snes_fd. Nie znamy bliżej różnic między tymi opcjami. Po co stosować te opcje? Na pewno przydadzą się one tym, którzy nie potrafią (lub nie mają czasu) implementować funkcji Jakobian(). Czasem macierz jakobianu może być skomplikowana! Autorzy oficjalnego manuala twierdzą ponadto, że możemy w ten sposób łatwo sprawdzić, czy poprawnie zaimplementowaliśmy jakobian: bo jeśli nie, to, rozwiązując zagadnienie raz z własnym jakobianem, a drugi raz z opcją -snes_mf, powinniśmy dostać istotnie różniące się wyniki. To prawda, ale od razu chcielibyśmy ostrzec wszystkich pesymistów: jeśli postępując w wyżej opisany sposób, rzeczywiście dostaniecie różne wyniki (rozwiązania, liczbę iteracji, itp.) nie wpadajcie w desperację. Jest bardzo prawdopodobne, że po prostu rozwiązujecie swoje zadanie z niedobrymi parametrami! Pamiętajcie, że wyznaczenie aproksymacji jakobianu jest numerycznie bardzo kosztowne (wymaga za każdym razem obliczania wielu wartości Funkcji()) a jednym z ograniczeń ustawianym w SNESie jest właśnie liczba wywołań funkcji!
SNES Object: method: ls line search variant: SNESCubicLineSearch alpha=0.0001, maxstep=1e+08, steptol=1e-12 maximum iterations=50, maximum function evaluations=1000 tolerances: relative=1e-08, absolute=1e-50, truncation=1e-12, solution=1e-08 total number of linear solver iterations=13 total number of function evaluations=6 KSP Object: method: gmres GMRES: restart=30, using Modified GramSchmidt Orthogonalization maximum iterations=10000, initial guess is zero tolerances: relative=1e-05, absolute=1e-50, divergence=10000 left preconditioning PC Object: method: none linear system matrix = precond matrix: Matrix Object: type=MATSHELL, rows=343, cols=343