제어 시스템 도구 상자를 처음부터 순수하게 Python3 (shameless plug :)으로 작성했습니다 harold
. 과거의 연구에서 나는 care.m
기술적 / 관련이없는 이유로 Riccati 솔버 에 대해 항상 불만을 제기했습니다 .
따라서 나는 내 자신의 루틴 세트를 작성해 왔습니다. 내가 찾을 수없는 한 가지 방법은 적어도만큼 좋은 고성능 밸런싱 알고리즘을 얻는 것 balance.m
입니다. 언급하기 전에 xGEBAL
가족은 Scipy에 노출되며 기본적으로 다음과 같이 Scipy에서 호출 할 수 있습니다 .float type 2D array가 있다고 가정하십시오 A
.
import scipy as sp
gebal = sp.linalg.get_lapack_funcs(('gebal'),(A,)) # this picks up DGEBAL
Ab, lo, hi, scaling , info = gebal(A, scale=1 , permute=1 , overwrite_a=0 )
이제 다음 테스트 매트릭스를 사용하면
array([[ 6. , 0. , 0. , 0. , 0.000002],
[ 0. , 8. , 0. , 0. , 0. ],
[ 2. , 2. , 6. , 0. , 0. ],
[ 2. , 2. , 0. , 8. , 0. ],
[ 0. , 0. , 0.000002, 0. , 2. ]])
나는 얻다
array([[ 8. , 0. , 0. , 2. , 2. ],
[ 0. , 2. , 0.000002, 0. , 0. ],
[ 0. , 0. , 6. , 2. , 2. ],
[ 0. , 0.000002, 0. , 6. , 0. ],
[ 0. , 0. , 0. , 0. , 8. ]])
그러나 이것을에 전달 balance.m
하면
>> balance(A)
ans =
8.0000 0 0 0.0625 2.0000
0 2.0000 0.0001 0 0
0 0 6.0000 0.0002 0.0078
0 0.0003 0 6.0000 0
0 0 0 0 8.0000
순열 패턴을 확인하면 패턴이 동일하지만 스케일링이 해제됩니다. gebal
matlab은 다음과 같은 2의 제곱을 제공합니다 [-5,0,8,0,2]
.
따라서 분명히 동일한 기계를 사용하지 않습니다. 나는 Lemonnier, Van Dooren 양면 스케일링, 오리지널 Parlett-Reinsch와 같은 다양한 옵션을 시도했으며 밀도가 높은 버전과 같은 문헌에서 잘 알려지지 않은 다른 방법을 시도했습니다 SPBALANCE
.
내가 강조 할 수있는 한 가지 점은 내가 Benner의 작업을 알고 있다는 것입니다. 특히이 목적을 위해 특히 해밀턴 행렬 의 Symplectic Balancing . 그러나이 유형의 처리는 gcare.m
(일반화 된 Riccati 솔버) 내에서 수행 되며을 통해 직접 밸런싱이 수행됩니다 balance.m
. 따라서 누군가가 실제 구현을 지적 할 수 있다면 감사하겠습니다.
공개 : 나는 실제로 mathworks 코드를 리버스 엔지니어링하려고하지 않습니다. 실제로이 질문의 동기 부여를 포함하여 다양한 이유로 인해 코드에서 벗어나고 싶습니다. 하루의 시간. 내 의도는 정규 솔버 위에 Newton 반복 메소드를 구현할 수 있도록 CAREX 예제를 전달할 수있는 만족스러운 밸런싱 알고리즘을 얻는 것입니다.