소프트웨어 수치해석 마지막 수정: 2026-08-05 04:23:47

1. 개요[편집]

SLEPc
Scalable Library for Eigenvalue Problem Computations
개발발렌시아 공과대학교 (UPV), Jose E. Roman 등
기반PETSc (객체 모델·옵션 데이터베이스 공유)
언어C (Fortran · slepc4py 바인딩)
솔버 클래스EPS · SVD · PEP · NEP · MFN · LME
기본 알고리즘크릴로프-슈어 (EPSKRYLOVSCHUR)
보조 클래스ST · BV · DS · RG · FN
라이선스BSD 2-clause

PETScAx=bAx = b 담당이라면, SLEPc는 Ax=λxAx = \lambda x 담당이다. 같은 회사의 다른 부서라고 보면 된다.

SLEPc(Scalable Library for Eigenvalue Problem Computations)는 대규모 희소행렬고유값 문제와 그 사촌들을 병렬로 푸는 라이브러리로, PETSc 위에 얹혀 그 객체 모델·행렬 타입·전처리기·선형 솔버를 전부 그대로 물려받는다. 스페인 발렌시아 공과대학교에서 개발했고, 2002년 첫 공개 이후 PETSc 릴리스 주기에 맞춰 같이 버전이 올라간다.1

물려받는다는 말이 곧 사용법이다. PETSc 코드를 쓰던 사람이라면 EPSCreateEPSSetOperatorsEPSSetFromOptionsEPSSolveEPSGetEigenpair 라는 흐름이 이미 익숙할 것이고, -eps_nev 10 -eps_type krylovschur 같은 런타임 옵션 문법도 완전히 동일하다. SLEPc를 배우는 비용의 대부분은 PETSc를 배우는 비용이고, 나머지는 스펙트럼 변환을 이해하는 비용이다.

2. 여섯 개의 문제 클래스[편집]

SLEPc가 “고유값 라이브러리”라고 불리면서도 그것보다 넓은 이유는 문제 유형별로 최상위 클래스가 따로 있기 때문이다.

  • EPS — 표준 문제 Ax=λxAx = \lambda x 와 일반화 문제 Ax=λBxAx = \lambda Bx. 에르미트·비에르미트, 실·복소 전부 지원.
  • SVD특이값 분해. ATAA^T A 를 만들지 않고 란초스 이중대각화나 교차곱 방식을 선택할 수 있다.
  • PEP — 다항 고유값 문제 P(λ)x=0P(\lambda)x = 0. 대표가 감쇠 진동의 이차 문제 (λ2M+λC+K)x=0(\lambda^2 M + \lambda C + K)x = 0 다.
  • NEPλ\lambda 에 대해 임의로 비선형인 T(λ)x=0T(\lambda)x = 0. 시간 지연계나 경계요소 문제에서 나온다.
  • MFN — 행렬 함수 작용 y=f(A)by = f(A)b. 대표가 행렬 지수 etAbe^{tA}b 이고, 지수 적분기가 이걸 쓴다.
  • LME — 리아푸노프·실베스터 같은 선형 행렬 방정식.

핵심은 이들이 전부 크릴로프 계열 부분공간 위에서 돌아간다는 점이다. 예컨대 리아푸노프 방정식이 고유값 라이브러리에 들어 있는 것이 이상해 보이지만, 저계수 근사해를 만드는 방식이 결국 같은 부분공간 기계를 쓴다.

3. EPS와 크릴로프-슈어[편집]

기본 솔버는 크릴로프-슈어 방법(EPSKRYLOVSCHUR)이다. 아놀디 알고리즘으로 부분공간을 키운 뒤 투영 행렬을 슈어 형식으로 만들고, 원하는 리츠 값이 앞쪽에 오도록 슈어 형식을 재정렬한 다음 뒤쪽을 잘라 두꺼운 재시작(thick restart)을 한다. 대칭이면 자동으로 두꺼운-재시작 란초스 알고리즘과 동등해진다.

ARPACK의 암묵적 재시작이 원하지 않는 리츠 값을 시프트로 삼아 QR 스텝으로 걸러내는 방식이었다면, 크릴로프-슈어는 그냥 슈어 형식을 잘라낸다. 수렴한 쌍의 잠금(locking)과 원치 않는 성분의 정화(purging)가 훨씬 안정적으로 구현된다는 것이 이 교체의 실질적 동기였고, SLEPc가 ARPACK에 의존하지 않고 자체 구현을 기본값으로 삼은 이유이기도 하다.

물론 목록은 길다. EPSARNOLDI·EPSLANCZOS(재직교화 전략 선택 가능)·EPSSUBSPACE·EPSPOWER(RQI 포함)·EPSGD(데이비드슨 알고리즘EPSJD(야코비-데이비드슨 방법EPSLOBPCG(LOBPCGEPSCISS(등고선 적분) 등이 내장돼 있고, ARPACK·PRIMME·BLOPEX·ScaLAPACK·ELPA는 외부 솔버로 붙일 수 있다. 전부 같은 EPS 인터페이스 뒤에 숨으므로 비교는 -eps_type 만 바꾸면 끝난다.

무엇을 구할지는 EPSSetWhichEigenpairs 로 정한다. EPS_LARGEST_MAGNITUDE(기본값)·EPS_SMALLEST_REAL·EPS_TARGET_MAGNITUDE·EPS_TARGET_REAL·EPS_ALL 등이 있고, 개수는 nev, 작업 부분공간 크기는 ncv, 투영 문제의 최대 크기는 mpd로 조절한다. nev가 수백 개로 커질 때 mpd를 걸어 두지 않으면 조밀 투영 문제와 직교화 비용이 먼저 터진다.

4. 스펙트럼 변환 — ST가 진짜 주인공[편집]

SLEPc 사용자가 반드시 이해해야 하는 클래스가 ST(스펙트럼 변환)다. 크릴로프 방법은 스펙트럼 바깥쪽, 잘 분리된 고유값부터 수렴한다. 그래서 “0 근처 몇 개” 나 “특정 주파수 대역”처럼 스펙트럼 안쪽을 노리면 그냥은 거의 수렴하지 않는다.2

처방이 이동-역변환(shift-and-invert)이다. 목표값 σ\sigma 를 잡고

(AσB)1Bx=μx,μ=1λσ(A - \sigma B)^{-1} B \, x = \mu\, x, \qquad \mu = \frac{1}{\lambda - \sigma}

로 문제를 바꾸면, σ\sigma 에 가까운 λ\lambda 일수록 μ\mu 가 커진다. 즉 원래 문제의 내부 고유값이 변환된 문제의 최외곽 고유값이 되어, 크릴로프가 잘하는 영역으로 옮겨 온다. 켜는 법은 -st_type sinvert -eps_target 3.5 한 줄이다.

공짜는 아니다. 매 반복마다 (AσB)(A - \sigma B) 에 대한 선형계를 풀어야 하고, 이 해가 부정확하면 부분공간 자체가 오염되므로 보통은 반복 솔버가 아니라 희소 직접 분해를 쓴다.

-eps_target 0 -st_type sinvert \
-st_ksp_type preonly -st_pc_type lu \
-st_pc_factor_mat_solver_type mumps

-st_ksp_* 접두사에서 보이듯 ST 내부의 선형 솔버는 그냥 PETSc의 KSP다. PETSc를 알면 여기서 따로 배울 것이 없다는 점이 SLEPc 설계의 이득이다.3 ST 타입은 STSHIFT(기본, 단순 원점 이동)·STSINVERT·STCAYLEY·STFILTER(에르미트 문제용 다항식 필터, 분해 없이 내부 대역을 걸러낸다)·STPRECOND(전처리 기반 솔버용)가 있다.

분해가 감당 안 될 때의 대안이 하모닉 추출(-eps_harmonic)이다. 부분공간은 그대로 두고 리츠 값을 뽑는 방식만 바꿔 목표점 근처를 우선하게 만든다. 이동-역변환보다 약하지만 인수분해가 필요 없다. 반대로 대칭-양정치 일반화 문제에서 구간 안의 고유값을 전부 원한다면 스펙트럼 슬라이싱(-eps_interval)이 있다. 실베스터 관성 법칙으로 LDLTLDL^T 분해의 부호 개수를 세어 구간별 고유값 개수를 정확히 알아내고, 구간을 쪼개 프로세스 그룹에 분배한다. 하나도 놓치지 않았음을 셈으로 보증한다는 점이 이 방식의 강점이다.4

5. 수렴 판정과 실무 감각[편집]

기본 수렴 기준은 상대 잔차다. 근사쌍 (λ~,x~)(\tilde\lambda, \tilde x) 의 잔차를 r=Ax~λ~Bx~r = A\tilde x - \tilde\lambda B\tilde x 라 할 때, EPS_CONV_RELr/λ~\lVert r \rVert / \lvert \tilde\lambda \rvert 를 본다. 절대 기준 EPS_CONV_ABS, 노름 기준 EPS_CONV_NORM(A\lVert A \rVertB\lVert B \rVert 로 정규화)도 있다.

여기서 은근한 함정 두 가지.

  • 잔차는 변환된 문제 기준으로 측정될 수 있다. 이동-역변환을 켜면 μ\mu 공간에서의 잔차가 작다고 원래 λ\lambda 의 잔차가 그만큼 작다는 보장이 없다. 최종 확인은 EPSComputeError로 원래 문제에서 다시 재는 것이 안전하다.
  • 레일리 몫의 제곱 정확도 덕에, 대칭 문제에서는 고유벡터가 어설퍼도 고유값은 훨씬 정확하다. 모드 해석에서 고유진동수만 필요하다면 허용오차를 느슨하게 잡아 반복을 크게 줄일 수 있다. 반대로 모드 형상을 쓸 거라면 그 관대함이 그대로 오차로 돌아온다.

축퇴·군집 고유값은 여전히 조심할 대목이다. 대칭 구조물의 겹치는 모드처럼 같은 값이 여러 개면 nev를 필요한 수보다 넉넉히 잡고 ncv도 같이 키우는 것이 표준 요령이다. 비에르미트 문제에서 좌고유벡터까지 필요하면 EPSSetTwoSided로 양쪽 부분공간을 함께 키운다. 이건 비정규 행렬에서 고유값의 조건수를 평가할 때 특히 중요하다.

6. 다항·비선형 고유값과 행렬 함수[편집]

선형 고유값 문제만 다루는 라이브러리였다면 SLEPc는 ARPACK의 현대판에 그쳤을 것이다. 실제 공학 문제가 선형 형태로 오지 않는 경우가 많다는 점이 나머지 클래스의 존재 이유다.

PEP의 대표는 감쇠가 있는 구조물의 모드 해석에서 나오는 이차 문제

(λ2M+λC+K)x=0\left(\lambda^2 M + \lambda C + K\right)x = 0

이다. 교과서 처방은 보조 변수 y=λxy = \lambda x 를 도입해 크기 2n2n다항 고유값 문제 선형화(PEPLINEAR)로 바꾸는 것이지만, SLEPc의 기본값은 TOAR(PEPTOAR)다. 크릴로프 기저를 2n2n 차원 벡터로 통째로 저장하지 않고 nn 차원 블록의 저계수 표현으로 압축해 메모리를 절반 이하로 줄인다. 대칭 구조를 보존하는 STOAR, 야코비-데이비드슨 계열 PEPJD도 있다. 여기서 반드시 신경 써야 할 것이 스케일링인데, MM·CC·KK 의 노름이 몇 자릿수씩 차이 나는 것이 구조 문제의 일상이라 선형화 행렬의 조건수가 그대로 망가진다. -pep_scale 옵션이 그래서 있다.5

NEPλ\lambda 에 대한 의존이 다항식조차 아닌 경우 — 지연 미분방정식의 eτλe^{-\tau\lambda}, 경계요소법에서 나오는 파수 의존 커널, 흡수 경계가 붙은 도파관 문제 등이다. 솔버는 잇단 선형화(NEPSLP), 잔차 역반복(NEPRII), 유리함수 근사 기반 NEPNLEIGS, 등고선 적분 NEPCISS 가 있고, 함수 의존성은 FN 객체(유리·지수·제곱근 등)를 조합해 기술한다.

MFN은 고유값을 구하지 않는다. y=f(A)by = f(A)b 만 필요할 때 스펙트럼 전체를 구해 함수를 적용하는 대신, 크릴로프 부분공간에 투영해 작은 조밀 문제에서 ff 를 평가하고 되돌린다. 지수 적분기eΔtAbe^{\Delta t A}b 를 요구할 때 이 경로를 탄다.

응용 스펙트럼도 넓다. 모드 해석좌굴 고유치, 전자구조 계산에서 콘-샴 방정식의 최저 수백 개 상태(밴드 구조 계산), 축소차수모델의 POD 모드, 유동 안정성의 오어-조머펠트 방정식, 마르코프 연쇄의 정상분포(페론-프로베니우스 정리)까지, “큰 행렬의 스펙트럼 일부”라는 형태를 띠는 문제라면 대체로 여기로 온다.

7. 관련 문서[편집]

8. Footnotes[편집]

  1. 이름이 대놓고 PETSc 패러디다. PETSc가 “펫시”면 SLEPc는 “슬렙시”. 로고까지 같은 결이라, 처음 보면 아르곤 산하 프로젝트인 줄 알기 쉬운데 실제 개발은 스페인 발렌시아다. 의존 관계는 한 방향이라 PETSc는 SLEPc를 모른다.

  2. “왜 EPS_SMALLEST_MAGNITUDE가 안 끝나요”는 ARPACKwhich='SM' 함정과 정확히 같은 병이다. 답도 같다 — -eps_target 0 -st_type sinvert. 이 바닥에서 라이브러리는 바뀌어도 함정은 대물림된다.

  3. 다만 AA 가 특이하면 σ=0\sigma = 0 에서 분해가 터진다. σ\sigma 를 0에서 살짝 옮기거나, 자유-자유 구조물처럼 강체 모드가 있는 경우 시프트를 음수 쪽으로 주는 것이 관행이다. “0.0 대신 -1e-3” 이 한 줄로 살아나는 해석이 세상에 참 많다.

  4. 관성 세기는 값비싼 계산의 정직한 사용례다. 구간 안에 고유값이 몇 개인지 먼저 세고 그만큼 찾았는지 확인하니, “혹시 하나 빠뜨렸나” 하는 불안이 원리적으로 사라진다. 대신 LDLTLDL^T 분해가 여러 번 필요해서 메모리가 넉넉해야 한다는 대가를 치른다.

  5. 단위계를 SI로 통일한다고 문제가 사라지지 않는다. 질량행렬은 kg 단위, 강성행렬은 N/m 단위라 애초에 차원이 다르고, 실제 구조물에서는 K/M\lVert K \rVert / \lVert M \rVert101010^{10} 을 넘기도 한다. 고유값이 이상한 값으로 나올 때 알고리즘부터 의심하기 전에 스케일링을 먼저 보는 것이 정신건강에 좋다.