Linear Algebra with Sage~~ Quick Reference

 

 (Updated on Mar 16, 2010)

 

 dia_bluve.gif  Sage 퀵 레퍼런스: 선형대수학

Robert A. Beezer, 박진영, 이상구, Sage Version 4.1

http://wiki.sagemath.org/quickref

GNU Free Document License, extend for your own use

Based on work by Peter Jipsen, William Stein

한글화: 성균관대학교 수학과

벡터 생성

주의: 인덱스는 0부터 시작

u = vector(QQ, [1, 3/2, -1]) 원소가 세 개인 유리수

벡터

v = vector(QQ, {2:4, 95:4, 210:0})

크기가 210인 유리수 벡터. 3번째와 96번째 원소가 4이다.

벡터 연산

u = vector(QQ, [1, 3/2, -1])

v = vector(ZZ, [1, 8, -2])

2*u - 3*v 일차 결합

u.dot_product(v) u, v 내적

u.cross_product(v) u, v 외적

u.inner_product(v) u, v 내적

u.pairwise_product(v) 인덱스에 맞춰서 곱

u.norm() == u.norm(2) 유클리드 norm u = pPi u2i

u.norm(1) 원소들의 합 ||u||1 = Pi ui

u.norm(Infinity) 최대 원소값 ||u||= max(ui)

행렬 생성

주의: 행, 열의 인덱스는 0부터 시작

A = matrix(ZZ, [[1,2],[3,4],[5,6]])

3 × 2 정수 행렬

B = matrix(QQ, 2, [1,2,3,4,5,6])

2 × 3 유리수 행렬

C = matrix(CDF, 2, 2, [[5*I, 4*I], [I, 6]])

53-bit precision을 가지는 2 × 2 복소수 행렬

Z = matrix(QQ, 2, 2, 0) 영행렬

D = matrix(QQ, 2, 2, 8)

대각원소가 모두 8인 2 × 2 대각행렬

I = identity_matrix(5) 5 × 5 단위행렬

J = jordan_block(-2,3)

3 × 3 행렬, −?2 on diagonal, 1’s on super-diagonal

var(’x y z’); K = matrix(SR, [[x,y+z],[0,x^2*z]])

x, y, z를 미지수로 가지는 2 × 2 symbolic 행렬

L=matrix(ZZ, 20, 80, {(5,9):30, (15,77):-6})

20 × 80, 5행 9열은 30, 15행 77열은 -6이고 나머지는 모두 0인 정수행렬

행렬 곱

u = vector(QQ, [1,2,3]), v = vector(QQ, [1,2])

A = matrix(QQ, [[1,2,3],[4,5,6]])

B = matrix(QQ, [[1,2],[3,4]])

u*A, A*v, B*A, B^6, B^(-3) 모두 가능

B.iterates(v, 6) == vB0, vB1, . . . , vB5

rows = False moves v to right of matrix powers

f(x)=x^2+5*x+3 이고 f(B) 도 가능

B.exp() 행렬 exponential, i.e. P∞k=0

Bk

k!

행렬 공간

M = MatrixSpace(QQ, 3, 4)

차원이 12인 3 × 4 행렬 공간

A = M([1,2,3,4,5,6,7,8,9,10,11,12])

M의 원소인 3 × 4 행렬

M.basis() 기저

M.dimension() 차원

M.zero_matrix() M의 원소인 3 × 4 영행렬

행렬 연산

5*A+2*B 일차결합

A.inverse(), A^(-1), ~A

A의 역행렬, 만약 A가 singular면 ZeroDivisionError

발생

A.transpose() 전치행렬

A.antitranspose() 전치행렬에 역순서 정렬을 취한 행렬

A.adjoint() 수반행렬

A.conjugate() 켤레행렬

A.restrict(V) 벡터공간 V 로 제한을 둔 행렬

행 연산

Row Operations: (change matrix in place)

주의: 행의 인덱스는 0부터 시작

A.rescale_row(i,a) a*(row i)

A.add_multiple_of_row(i,j,a) a*(row j) + row i

A.swap_rows(i,j)

열 연산도 가능 row→col

새로운 행렬을 만들자면, B = A.with_rescaled_row(i,a)

Echelon Form

A.echelon_form(), A.echelonize(), A.hermite_form()

주의: ring에 따라 결과가 다름

A = matrix(ZZ,[[4,2,1],[6,3,2]])

B = matrix(QQ,[[4,2,1],[6,3,2]])

A.echelon_form() B.echelon_form()

2 1 0

0 0 1 ! 1 1

2 0

0 0 1 !

A.pivots() 열공간에서 대표인자들을 선택

A.pivot_rows() 행공간에서 대표인자들을 선택

부분 행렬

주의: 행, 열의 인덱스는 0 부터 시작

A = matrix(ZZ,[[4,2,1],[6,3,2]])

A.nrows() 행 개수

A.ncols() 열 개수

A[i,j] 행i 열j의 원소

주의: 가능: A[2,3] = 8, 불가능: A[2][3] = 8

A[i] Python 튜플(tuple)형식의 행 i

A.row(i) Sage 벡터(vector)형식의 행 i

A.column(j) Sage 벡터(vector)형식의 행 j

A.list() 행 우선 순서로 하나의 Python 리스트(list)

A.matrix_from_columns([0,1,0])

A의 0, 1, 0번째 열벡터를 순서대로 하여 새로운 행렬생성

A.matrix_from_rows([1, 0, 0])

A의 1, 0, 0번째 행벡터를 순서대로 하여 새로운 행렬생성

A.matrix_from_rows_and_columns([0,1,0],[1,0])

A의 0, 1, 0번째 행벡터의 1번, 0번째 원소로 새로운 행렬 생성

A.rows() 모든 행벡터를 tuple로 한 리스트

A.columns() 모든 열벡터를 tuple로 한 리스트

A.submatrix(i,j,nr,nc)

행과 열 (i,j)에서 시작하여 nr 행과 nc 열만큼으로 새로운 행렬 생성

A[0:1,1:2], A[0:2:2,1::-1] Python 스타일 리스트 슬라이싱 행렬 결합

A.augment(B) A 행렬 오른쪽에 B 행렬을 붙인 첨가행렬

A.stack(B) A 행렬 아래에 B 행렬을 붙인 첨가행렬

A.block_sum(B) A 행렬을 왼쪽 위에, B 오른쪽 아래에 넣은 대각행렬

A.tensor_product(B) Multiples of B, arranged as in A

스칼라 값을 내놓은 행렬

A.rank() 행렬 A의 rank

A.nullity() == A.left_nullity() 행렬 A의 nullity.

Sage에서는 left nullity와 동일.

A.right_nullity() 행렬 A의 right nullity. 현대 선형대

수학 교재에서 nullity는 이것을 얘기함.

A.determinant() == A.det() 행렬 A의 행렬식

A.permanent()

A.trace() 행렬 A의 대각합

A.norm() == A.norm(2) 유클리드 norm

A.norm(1) 열벡터 원소들 합 중 가장 큰 것.

A.norm(Infinity) 행벡터 원소들 합 중 가장 큰 것.

A.norm(’frob’) Frobenius norm

행렬 속성

.is_zero() (영행렬?), .is_one() (단위행렬?),

.is_scalar() (단위행렬의 스칼라곱?),

.is_square() (정사각행렬?),

.is_symmetric() (대각행렬?),

.is_invertible() (가역행렬?),

.is_nilpotent() (Nilpotent 행렬?)

고유값

A.charpoly(’t’) 특성방정식, (t를 주지 않으면 x에 대

한 방정식을 구함

A.characteristic_polynomial() == A.charpoly()

A.fcp(’t’) 인수분해된 특성방정식

A.minpoly() 최소다항식(minimal polynomial)

A.minimal_polynomial() == A.minpoly()

A.eigenvalues() (중복도를 포함, 순서에 관계없음)

A.eigenvectors_right() 고유벡터를 구함

고유값 한 값에 대하여 다음을 구함:

e: 고유값

V: 고유공간의 기저 고유벡터

n: 대수적 중복도

A.eigenmatrix_right() 고유벡터로 구성된 행렬을 구함

(행렬의 닮음)

두 행렬값을 구함:

D: 고유값을 대각성분으로 가지는 대각행렬

P: 고유벡터를 열벡터로 가지는 행렬

만일 행렬이 대각화가능하지 않으면, P의 모든 열

벡터는 영벡터임

분해

Note: 행렬의 기본을 두는 공간에 따라 결과가 약간 다를

수 있음

A.jordan_form(transformation=True)

다음 두 행렬을 구함:

J: 행렬의 고유값에 따른 Jordan blocks

P: 가역행렬

so A == P^(-1)*J*P

A.smith_form() 다음 행렬들을 구함:

D: 대각성분에 elementary divisors를 포함한 행렬

U, V: unit determinant

so D == U*A*V

A.LU() 다음 행렬들을 구함:

P: 치환행렬(a permutation matrix)

L: 하삼각행렬(lower triangular matrix)

U: 상삼각행렬(upper triangular matrix)

so P*A == L*U

A.QR() 다음 두 행렬을 구함:

Q: 직교행렬(an orthogonal matrix)

R: 상삼각행렬(upper triangular matrix)

so A == Q*R

A.SVD() 다음 행렬들을 구함:

U: 직교행렬(an orthogonal matrix)

S: 특이값을 대각성분으로 가지는 행렬

V: 직교행렬(an orthogonal matrix)

so A == U*S*(V-conjugate-transpose)

A.symplectic_form()

A.hessenberg_form()

A.cholesky()

선형연립방정식의 해법

A.solve_right(B) _left too

A*X = B, 단 X는 벡터 또는 행렬도 가능

A = matrix(QQ, [[1,2],[3,4]])

b = vector(QQ, [3,4])

이라면 A\b의 답으로 (-2, 5/2)를 구한다.

벡터 공간

U = VectorSpace(QQ, 4) 4차원 유리수 공간

V = VectorSpace(RR, 4) 4차원 실수공간 (53-bit precision)

W = VectorSpace(RealField(200), 4)

4차원 실수공간(200 bit precision)

X = CC^4 4차원 복소수공간

Y = VectorSpace(GF(7), 4) 4차원의 GF(7)의 유한차원

공간

Y.finite()으로 확인하면 True

임을 알 수 있음 len(Y.list())를 통하여 총 74 =

2401개의 원소가 공간안에 존재

벡터 공간 속성

V.dimension()

V.basis()

V.echelonized_basis()

V.has_user_basis() 다른 기저를 가지는지 확인?

V.is_subspace(W) 만약 W가 V의 부분공간이라면 True

V.is_full() 기저의 개수가 차원과 같은지 확인(Module

에서 사용)?

Y = GF(7)^4, T = Y.subspaces(2)

T는 Y의 2차원 부분공간을 생성

부분공간 생성

span([v1,v2,v3], QQ)는 세개의 벡터에 의해 생성된 공

간을 의미

만약 V와 W가 부분공간이라면,

V.quotient(W) W의 부분공간으서 V 의 quotient를 구함

V.intersection(W) V과 W의 교집합

V.direct_sum(W) V과 W의 direct sum

V.subspace([v1,v2,v3]) [v1,v2,v3] 벡터들에 의해 생성

되는 부분공간

Dense와 Sparse

Note: 알고리즘이 일반적으로 알려진 것과 약간 다를 수

있다.

벡터와 행렬이 다음의 두가지에 따라 다르게 파악될 수 있

다.

Dense: 리스트(list)를 이용한 처리

Sparse: 파이슨(Python)의 사전배열순서

.is_dense(), .is_sparse()를 통해 체크할 수 있다.

A.sparse_matrix() A의 sparse 행렬을 구한다.

A.dense_rows() A의 행벡터를 이용하여 dense한 행렬을

구한다.

sparse 라는 키워드를 사용할 수 있다.

환(Rings)

Note: 많은 알고리즘이 환(ring)을 기반으로 구현되어 있

다.

<object>.base_ring(R): 벡터와 행렬을 해당하는 환

(ring)을 기반으로 만든다.

<object>.change_ring(R): 벡터와 행렬을 해당하는 환

(ring)을 기반으로 바꾼다.

R.is_ring(), R.is_field()

R.is_integral_domain(), R.is_exact()

대표적으로 사용하는 환(ring)과 체(field)

ZZ 정수, 환(ring)

QQ 유리수, 체(field)

QQbar 확장된 체(algebraic extension field)

RDF 실수, 체(field, inexact)

RR 실수, 체(53-bit, inexact)

RealField(400) 실수, 체(400-bit, inexact)

CDF, CC, ComplexField(400) 복소수, 체(field)

RIF 실수, 구간체(interval field)

GF(2) GF(2) (mod 2, 체, 특화된 구성)

GF(p) == FiniteField(p) p 소수 p로 구성된 체

(field)

Integers(6) mod 6로 만들어진 환(ring)

QuadraticField(-5, ’x’) rationals adjoin x=√−?5

SR symbolic expressions으로 만들어진 환(ring)

도움말이 필요한 경우

<command>? 명령에 대한 요약 및 예제

<command>?? 명령에 대한 코드소스