AUTO-07p

편집 역사 토론
소프트웨어 수치해석 계산물리 마지막 수정: 2026-08-19 04:21:09

1. 개요[편집]

AUTO-07p
종류연속화 · 분기 해석 소프트웨어
원저자Eusebius J. Doedel (1981년 최초 발표)
공동 유지Bart E. Oldeman 외 (Concordia Univ.)
언어Fortran 90 코어 + Python 명령행 인터페이스 (방정식은 F90/C)
연속화의사호장 연속법 (적응 보폭)
이산화직교 배치법 — NTST 구간 × NCOL 가우스 점
확장HomCont (호모클리닉·헤테로클리닉) · BPcont
입력c.xxx (상수) + xxx.f90 (방정식)
출력fort.7/8/9 → b.xxx · s.xxx · d.xxx

1980년대에 태어난 Fortran 코드가 아직도 이 분야의 기준점이다. 이유가 있다.

AUTO매개변수가 들어간 대수계·상미분방정식·경계값 문제의 해 가지를 연속화하고 그 위의 분기를 검출·추적하는 소프트웨어이며, AUTO-07p는 그 계보의 현행 판본이다. 유세비우스 되델(Eusebius J. Doedel)이 1981년에 처음 발표했고1, 이후 AUTO86 · AUTO94 · AUTO97 · AUTO2000 을 거쳐 2007년의 AUTO-07p로 이어졌다. 현재는 되델과 바트 올드먼이 유지하며, 알란 챔프니스 · 유리 쿠즈네초프 · 비외른 산트슈테데 · 랜디 파펜로스 등이 주요 모듈을 얹었다.

이 도구의 설계 철학은 한 문장으로 요약된다. 모든 것을 경계값 문제로 쓴다. 정상해든 주기해든 호모클리닉 연결이든, AUTO 안에서는 전부 “1계 상미분방정식 + 경계조건 + 적분 구속 + 자유 매개변수”라는 같은 틀이고, 그것을 직교 배치법으로 이산화한 뒤 의사호장 연속법으로 미는 단일 엔진이 처리한다. 문제 종류마다 별도 알고리즘을 짜는 대신 하나의 틀을 극한까지 다듬은 결과가 주기해·연결궤도 계산의 사실상 표준이라는 지위다.

연속화 알고리즘 일반론은 수치 연속법에, GUI와 정규형 계수 자동 계산 쪽 경쟁 도구는 MatCont에 정리돼 있다. 이 문서는 AUTO가 실제로 무엇을 이산화하고, 상수들이 무엇을 조작하며, 어디서 사람을 괴롭히는가를 다룬다.

2. 모든 것이 경계값 문제[편집]

AUTO가 푸는 표준형은 다음과 같다. 미지 함수 u:[0,1]RNDIM\mathbf u : [0,1] \to \mathbb{R}^{\text{NDIM}} 과 매개변수 벡터 μ\boldsymbol\mu 에 대해

u(τ)=f(u(τ),μ),b(u(0),u(1),μ)=0,01q(u(τ),μ)dτ=0\mathbf u'(\tau) = \mathbf f(\mathbf u(\tau), \boldsymbol\mu), \qquad \mathbf b(\mathbf u(0), \mathbf u(1), \boldsymbol\mu) = \mathbf 0, \qquad \int_0^1 \mathbf q(\mathbf u(\tau), \boldsymbol\mu)\,d\tau = \mathbf 0

이다. 경계조건 개수 NBC 와 적분 구속 개수 NINT 를 사용자가 정하고, 자유 매개변수의 개수를 거기에 맞춰 열면 해의 집합이 1차원 곡선이 된다. 대수계는 미분항이 없는 특수한 경우로, 주기해는 u(0)=u(1)\mathbf u(0)=\mathbf u(1) 에 위상 조건을 얹은 경우로, 호모클리닉 궤도는 양 끝에 사영 경계조건을 건 경우로 전부 이 틀에 들어온다.

문제 유형은 상수 IPS 가 고른다. 대표적인 값만 보면 IPS=1 이 상미분방정식의 정상해(호프 분기 검출 포함), IPS=2 가 주기해, IPS=4 가 일반 경계값 문제, IPS=9 가 HomCont 를 통한 호모클리닉 분기, IPS=11·12·14 가 포물형 편미분방정식의 공간 균일해·진행파·시간 발전이다.

3. 이산화 — NTST와 NCOL[편집]

구간 [0,1][0,1]NTST 개의 부분구간으로 나누고, 각 부분구간에서 차수 NCOL 의 다항식을 쓰되 가우스 점에서만 방정식을 만족시킨다. 이것이 직교 배치법이며, NCOL 은 2 이상 7 이하로 제한되고 대부분의 예제가 쓰는 4가 권장값이다.

왜 4인가. 배치법의 초수렴 때문이다. 요소 폭을 hh 라 하면 구간 전체 오차는 O(hNCOL+1)O(h^{\text{NCOL}+1}) 인데 요소 경계점에서는 O(h2NCOL)O(h^{2\,\text{NCOL}}) 로 차수가 두 배로 뛴다. NCOL=4 면 격자점에서 8차이므로, NTST 를 40 정도만 줘도 웬만한 주기해가 기계 정밀도 근처까지 간다. 요소를 늘리는 것보다 차수를 챙기는 쪽이 압도적으로 싸다는 계산이 이 기본값의 근거다.

여기에 적응 격자가 붙는다. IAD 스텝마다 오차 감시량을 요소별로 균등 배분(equidistribution)하도록 격자를 재분배하는데, 이완 진동처럼 시간척도가 몇 자리씩 갈리는 주기해가 잡히는 것이 순전히 이 기능 덕이다. NTST 자체는 한 번의 실행 중에는 고정이고, 재시작할 때만 바꿀 수 있다.

이산화 결과의 야코비 행렬은 요소마다 블록이 하나씩 붙은 띠 구조에 매개변수 열이 몇 개 덧대어진 모양이다. AUTO는 이 구조를 그대로 활용해 요소별 국소 미지수를 먼저 소거(condensation)한 뒤 훨씬 작은 축약계를 푼다. NTST·NCOL·NDIM 을 곱한 미지수 개수가 수만이어도 견디는 이유다. 덤으로 이 소거 과정에서 플로케 이론의 승수를 궤도를 다시 적분하지 않고 직접 뽑을 수 있다.

4. 주기해 — 위상 조건과 주기라는 미지수[편집]

주기해에는 두 가지 성가심이 있다. 첫째, 주기 TT 를 모른다. 둘째, 주기해는 시간 이동에 대해 한 매개변수 족을 이루므로 그냥 풀면 야코비가 반드시 특이해진다.

AUTO의 처방은 시간을 τ=t/T[0,1]\tau = t/T \in [0,1] 로 정규화해 주기를 미지 매개변수 PAR(11) 로 승격시키고, 자유도 하나를 적분 조건으로 죽이는 것이다.

dudτ=Tf(u,μ),u(0)=u(1),01u(τ), u˙old(τ)dτ=0\frac{d\mathbf u}{d\tau} = T\,\mathbf f(\mathbf u, \boldsymbol\mu), \qquad \mathbf u(0) = \mathbf u(1), \qquad \int_0^1 \big\langle \mathbf u(\tau),\ \dot{\mathbf u}_{\text{old}}(\tau)\big\rangle\,d\tau = 0

마지막 줄이 적분 위상 조건이다. “직전 해의 시간 도함수와 직교하도록 위상을 고정하라”는 뜻이고, 이 한 줄이 없으면 뉴턴이 매 스텝 특이 행렬을 만난다.

주기가 미지수가 되면 부작용도 생긴다. 호모클리닉에 가까워지는 주기해 가지에서는 TT \to \infty 로 발산하는데, 의사호장 구속에 TT 가 그대로 들어가면 보폭이 주기에 끌려가 사실상 멈춘다. 그래서 AUTO의 주기해 계산은 THL={11: 0.0} 을 기본값으로 두어 호장 계산에서 PAR(11) 의 가중치를 0으로 만든다. THL·THU 는 각각 매개변수·상태변수가 호장 정의에 기여하는 가중치이지 상·하한이 아니라는 점을 기억해 두면 매뉴얼이 훨씬 잘 읽힌다.

주기해의 안정성은 플로케 승수로 판정하고, 승수 하나는 항상 1이어야 한다(궤도를 따라가는 방향). 출력에서 이 값이 1에서 얼마나 벗어났는지가 그 계산의 정확도 지표로 쓰인다.

5. 상수 파일 — c.xxx 를 읽는 법[편집]

AUTO에 익숙해진다는 것은 사실상 상수 목록에 익숙해진다는 뜻이다. 자주 만지는 것만 추리면 다음과 같다.

상수하는 일
NDIM방정식 개수
IPS문제 유형 (정상해 · 주기해 · BVP · HomCont …)
IRS재시작 라벨. 0이면 새 실행, 아니면 그 라벨의 해에서 출발
ISW1 정상, −1 가지 전환, 2 두 매개변수 연속화
NTST · NCOL요소 개수와 요소당 가우스 점 개수
IAD몇 스텝마다 격자를 재분배할지
DS · DSMIN · DSMAX의사호장 보폭의 초기값·하한·상한 (DS의 부호가 진행 방향)
NMX한 가지에서 밟을 최대 스텝 수
ILP · ISP접힘점 검출 · 분기 검출 스위치
EPSL · EPSU · EPSS매개변수 · 해 · 특수점 위치 결정의 수렴 허용오차
NUZR사용자 정의 출력·정지 지점의 개수
THL · THU호장 정의에서 매개변수 · 상태변수의 가중치

방정식은 별도 파일 xxx.f90(또는 .f, .c)에 쓴다. 하위 루틴 이름이 고정돼 있어서 FUNC 에 벡터장을, STPNT 에 출발 해를, BCND 에 경계조건을, ICND 에 적분 구속을, FOPT 에 목적범함수를, PVLS 에 후처리로 뽑고 싶은 스칼라(예: 궤도의 최대값, 특정 노름)를 채워 넣는다. 실행하면 c.xxx 와 짝지어 돌아간다.

출력은 세 갈래다. fort.7 이 분기 다이어그램(가지 위 점들의 요약), fort.8 이 해 자체(재시작에 필요한 전체 데이터), fort.9 가 진단 로그다. 이름을 붙여 저장하면 각각 b.xxx · s.xxx · d.xxx 가 된다. 초심자가 가장 자주 겪는 사고가 s. 파일을 지워 놓고 재시작하려는 것인데, fort.7 만으로는 절대 재시작할 수 없다. 그림에 필요한 정보와 계산에 필요한 정보가 다른 파일에 있다.

라벨은 두 글자짜리 약어로 찍힌다.

  • BP 가지점 · LP 접힘(극한점) · HB 호프 분기
  • PD 주기배가 · TR 원환면(네이마크-사커) 분기
  • UZ 사용자 지정 지점 · RG 정규 출력점
  • EP 정상 종료 · MX 비정상 종료(뉴턴 수렴 실패)

MX 를 만났다는 것은 “보폭이 컸거나, 격자가 부족했거나, 가지가 진짜로 끝났다” 중 하나다. 셋을 구별하려면 d.xxx 를 열어 뉴턴 잔차의 추이를 봐야 한다.

현대 AUTO-07p 사용의 상당 부분은 Python 명령행 인터페이스로 이루어진다. run(e='ab', c='ab') 로 실행하고 반환된 객체를 파이썬 자료구조처럼 다루며, 여러 실행을 이어 붙이고 라벨을 재정렬하고 곧바로 그림을 그리는 스크립트를 짤 수 있다. 1980년대 Fortran 코어 위에 현대적 스크립트 층이 얹힌 이 이중 구조가 AUTO가 아직 살아 있는 실질적 이유다.2

6. HomCont — 연결궤도 확장[편집]

호모클리닉 궤도와 헤테로클리닉 궤도를 다루는 모듈이 HomCont 다. 챔프니스·쿠즈네초프·산트슈테데가 개발해 AUTO에 통합됐고, MatCont의 연결궤도 기능도 여기서 파생됐다.

원리는 안정 다양체 정리에 정리된 그대로다. 무한 구간을 유한 구간으로 절단하고, 양 끝점이 평형점의 불안정·안정 고유공간 위에 놓이도록 사영 경계조건을 건다. 절단 오차가 구간 길이에 대해 지수적으로 작기 때문에 구간을 조금만 키워도 정확도가 확 좋아진다는 것이 이 처방의 근거다.

전용 상수는 별도 파일에 둔다. 안정·불안정 고유값의 개수를 NSTAB·NUNSTAB 로 명시하고(자동 검출을 믿지 말라는 뜻이다), IEQUIB 로 평형점을 함께 풀 것인지 고정할 것인지를 정하며, ITWIST 로 뒤틀림 관련 부가방정식을 켜고, ISTART 로 출발 전략을 고른다. 여차원 2 사건 — 안장-초점 전이, 경사 뒤집힘(inclination flip), 궤도 뒤집힘(orbit flip), 공명 안장 — 을 시험함수로 감시하는 기능이 붙어 있어, 실니코프 분기 근방의 복잡한 구조를 손이 아니라 코드로 훑을 수 있다.

7. 이웃 도구와 비교하면[편집]

도구성격AUTO 대비
MatContMATLAB, GUI정규형 계수를 자동으로 뱉는다. 규모와 속도는 AUTO가 우위
COCOMATLAB, 조립식연속화 문제를 사용자가 조립. 유연하지만 학습 곡선이 가파름
PyDSToolPython모형 정의·적분·해석을 한 생태계에. 내부적으로 AUTO를 부르기도 함
pde2pathMATLAB유한요소 이산화된 PDE의 분기 전문
BifurcationKit.jlJulia대규모·자동미분 친화, 생태계가 젊음

선택 기준은 단순하다. 주기해와 연결궤도를 대량으로 정밀하게 밀어야 하면 AUTO, 분기의 종류와 방향(초임계인지 아임계인지)이 궁금하면 MatCont, 편미분방정식 이산화 결과를 다루면 pde2path 나 LOCA 다. 실제로는 병행이 흔하다 — MatCont로 분기 지도를 그리고 정규형 계수를 확인한 뒤, 정밀도가 필요한 가지만 AUTO로 다시 미는 식이다.

8. 실무에서 겪는 것들[편집]

  • 출발 해는 사람이 준다. 연속화는 해 하나를 이미 갖고 있어야 시작한다. STPNT 에 넣을 첫 해를 찾는 것이 실패의 대부분을 차지하며, 보통은 시간 적분으로 대충 끌고 와서 뉴턴-랩슨법으로 조인다.
  • 주기해는 HB에서 발사한다. 정상해 가지에서 HB 라벨을 만나면 그 라벨을 IRS 로 지정하고 IPS=2 로 재시작하는 것이 국룰이다. 진폭 0에서 갈라져 나오는 가지라 초기 주기가 호프 진동수의 역수로 자동 설정된다.
  • MX 가 뜨면 먼저 DSMAX 를 줄여라. 그 다음이 NTST 증가, 그 다음이 EPSL·EPSU 완화다. 순서를 바꾸면 시간만 날린다.
  • 입력 문법은 확실히 고풍스럽다. c. 로 시작하는 상수 파일과 고정 이름 하위 루틴은 1980년대의 흔적이며, 처음 만지면 시간여행한 기분이 든다. 다만 Python 인터페이스가 이 부분을 상당히 가려 준다.
  • 해석적 야코비안을 주면 이긴다. FUNC 에서 IJAC 인자에 따라 자코비안 행렬을 직접 채워 줄 수 있고, 이때 수렴 속도와 특수점 위치 정확도가 눈에 띄게 좋아진다. 자동 미분으로 이 코드를 생성하는 것이 요즘의 정석.
  • 정규형 계수는 사용자 몫이다. AUTO는 분기점의 위치를 잡아 주지만 초임계/아임계 판정을 대신 해 주지 않는다. 이것이 MatCont가 태어난 이유이기도 하다.
  • 대규모 문제는 이 도구의 영역이 아니다. 자유도가 수천을 넘으면 NTST·NCOL·NDIM 곱이 감당 불가로 커진다. 이산화된 편미분방정식 격자를 그대로 밀어 넣는 것은 도구가 나쁜 게 아니라 문제를 잘못 가져온 것이다.3

9. 관련 문서[편집]

10. Footnotes[편집]

  1. 1980년 전후에 쓰인 코드가 2020년대에도 현역이라는 사실 자체가 이 분야의 특성을 말해 준다. 알고리즘의 골격(배치법 + 의사호장)이 근본적으로 바뀔 이유가 없었고, 바뀐 것은 껍데기(입출력·스크립트·시각화)뿐이었다. 유행이 없다는 게 단점이 아니라 성숙의 증거인 분야도 있다.

  2. 그래서 요즘 AUTO를 처음 배우는 사람은 Fortran 을 거의 안 만진다. 방정식 파일만 F90 문법으로 스무 줄 쓰고 나머지는 파이썬으로 한다. 반대로 말하면 그 스무 줄에서 배열 인덱스를 1부터 세는 것을 깜빡해 하루를 날리는 통과의례가 아직 남아 있다는 뜻이기도 하다.

  3. 이 조언은 CFD 하는 사람에게 특히 아프다. 격자 백만 개짜리 정상해의 분기를 보고 싶다면 먼저 축소 모형을 만들거나, 아놀디 알고리즘 기반의 행렬 자유 연속화 도구로 갈아타야 한다. 그리고 축소 모형이 원래 계의 분기를 보존한다는 보장은 또 다른 논문거리다.