gauss.gms : 전체 피벗을 사용한 행렬 반전

설명

이 예는 루프 및 동적 정의의 사용을 보여줍니다.
Gaussian Elimination을 사용한 기본 변환의 집합
전체 피벗 선택.

소형 모델 유형 :슬롯 나라


카테고리 : 슬롯 나라 모델 라이브러리


메인 파일 : gauss.gms

$title 완전 피벗을 사용한 행렬 반전(GAUSS,SEQ=71)

$onText
이 예에서는 루프 및 동적 정의의 사용을 보여줍니다.
Gaussian Elimination을 사용한 기본 변환의 집합
전체 피벗 선택.

슬롯 나라 Development Corporation, 공식화 및 언어 예제.

키워드: 행렬 반전, 가우스 제거, 전체 피벗팅
$offText

세트
   i '행 레이블' / 행-1 * 행-3 /
   j '열 레이블' / col-1 * col-3 /;

별칭 (i,ip), (j,jp);

테이블 a(i,j) '원래 행렬'
              열-1 열-2 열-3
   행-1 1 2 3
   행-2 1 3 4
   행-3 1 4 3;

매개변수
   b(j,i) 'a의 역수'
   bp(i,j) 'a의 역순열 및 전치'
   pair(i,j) '피벗 시퀀스 및 순열'
   순위 '행렬 a의 순위'
   adet '행렬 a의 행렬식의 절대값'
   피브
   큰
   톨;

세트
   r(i) '피벗 행 후보'
   npr(i) '비 피벗 행'
   s(j) '피벗 열 후보'
   nps(j) '비 피벗 열';

r(i) = 그렇습니다;
s(j) = 그렇습니다;
bp(i,j) = a(i,j);
순위 = 0;
아데트 = 1;
톨 = 1e-5;

루프(j,
   big = smax((r,s), abs(bp(r,s)));
   big$(큰 < 톨) = 0;
   npr(i) = 예;
   nps(jp) = 예;
   루프((r,s)$(큰 및 큰 = abs(bp(r,s))),
      순위 = 순위 + 1;
      쌍(r,s) = 순위;
      piv = 1/bp(r,s);
      큰 = 0;
      adet = adet/piv;
      npr(r) = 아니오;
      nps(들) = 아니요;

      bp(r,nps) = bp(r,nps)*piv;
      bp(npr,nps) = bp(npr,nps) - bp(r,nps)*bp(npr,s);
      bp(npr,s) = -bp(npr,s)*piv;
      bp(r, s) = piv;
   );
   r(r) = npr(r);
   s(들) = nps(들);
);

b(j,i) = sum((ip,jp)$(pair(i,jp) 및 pair(ip,j)), bp(ip,jp));
adet = 절대(adet);

a, 순위, adet, 쌍, bp, b를 표시합니다.

매개변수
   ir(i,ip) 'a 곱하기 b'
   ic(j,jp) 'b 곱하기 a';

ir(i,ip) = sum(j, a(i,j)*b(j,ip));
ic(j,jp) = 합계(i, b(j,i)*a(i,jp));

ir, ic를 표시합니다.