e-10은 0으로 충분히 작습니까? e-16입니까? 아니면 다른 값입니까?숫자 반환을 0으로 간주하는 임계 값이 있습니까?
아니면 소프트웨어 패키지 또는 응용 프로그램에 의존합니까? 아래의 수치 해 결에는 출력을 0보다 유익하다고 생각할 필요가없는 일반적인 한계가 있습니까?
편집 : 여기
이 문제의 원인 : 내가 MathSE에 this을 게시하고, 무슨 일이 널 공간의 "싼 계산 증명"해야했는데 이런 식으로 나온 : 매트랩:
A = [1 3; 1 2; 1 -1; 2 1];
rank(A);
[U,S,V] = svd(A);
left_null_A = transpose(U);
rows = (rank(A) + 1): size(left_null_A,1);
left_null_A = left_null_A(rows,:)
(left_null_A(1,:) + left_null_A(2,:)) * A
%ans =
% -7.2164e-016 5.5511e-017
및
파이썬에서:
import numpy as np
A = np.matrix([[1,3], [1,2], [1, -1], [2,1]])
rank = np.linalg.matrix_rank(A)
U, s, V = np.linalg.svd(A, full_matrices = True)
t_U_A = np.transpose(U)
nrow = t_U_A.shape[0]
left_null_A = t_U_A[rank:nrow,:]
np.dot((left_null_A[0,:] + left_null_A[0,:]), A)
# Out[2]: matrix([[ -4.44089210e-16, -2.10942375e-15]])
및 R에서
B = np.transpose(A)
rank = np.linalg.matrix_rank(B)
U, s, V = np.linalg.svd(B, full_matrices = True)
t_V_B = np.transpose(V)
ncols = t_V_B.shape[1]
right_null_B = t_V_B[:,rank:ncols]
np.dot(B, (right_null_B[:,0] + right_null_B[:,1]))
# Out[3]:
# matrix([[ -2.77555756e-16],
# [ -1.38777878e-15]])
:
A = matrix(c(1,1,1,2,3,2,-1,1), ncol = 2)
r = qr(A)$rank # Rank 2
SVD.A = svd(A, nu = nrow(A))
SVD.A$u
t.U.A = t(SVD.A$u)
(left_null = t.U.A[(r + 1):nrow(t.U.A),])
colSums(left_null) %*% A
# [,1] [,2]
#[1,] 1.110223e-16 1.054712e-15
및
B = t(A)
r = qr(B)$rank # Naturally it will also have rank 2.
SVD.B = svd(B, nv = ncol(B))
SVD.B$v
(right_null = SVD.B$v[ ,(r + 1):ncol(B)])
B %*% rowSums(right_null)
# [,1]
#[1,] 1.110223e-16
#[2,] 1.665335e-16
매우 작은 숫자 실제로, 계산 뒤에있는 수학에 의지하지 않고도 0이라고 말할 수 있습니까?
엡실론은 값에 따라 달라집니다 [float 및 double 비교에 가장 효과적인 방법은 무엇입니까?] (http://stackoverflow.com/q/17333/995714). 고정 된 엡실론을 사용하면 안됩니다. http://floating-point-gui.de/errors/comparison/ –