2017-05-11 8 views
1

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이라고 말할 수 있습니까?

+1

엡실론은 값에 따라 달라집니다 [float 및 double 비교에 가장 효과적인 방법은 무엇입니까?] (http://stackoverflow.com/q/17333/995714). 고정 된 엡실론을 사용하면 안됩니다. http://floating-point-gui.de/errors/comparison/ –

답변

1

귀하의 질문에 대한 일차 최적 측정(최적화 첫 번째 순서 유도체 (들)) 경우, 당신이 작업하는 확장 된 대답은 크게 의존한다는 것을 말할 것입니다.

x = -1. + endogenous_gdp/exogenous_gdp 
을 다음과 같이 주위 1.e12하고 수치 해상도, 말, endonous_gdp를 생성하는 endogeneizing 시스템을 만들기로 구성되어 있음을, exogenous_gdp에 동일 할 수있다 수치 constaint, 같은 exogenous_gdp로 작업하는 가정

이 상대 (비율) 균등화에서 하나는 x=1.e-10이됩니다. 보시다시피이 경우 1.e-10endogenous_gdp1.e-10exogenous_gdp보다 큰 것을 의미하므로 좋지 않습니다. exogenous_gdp이 1.e12이면 비 상대 (차이) 스프레드는 1.e-10*1.e12=100이됩니다. 당신은

x = endogenous_gdp - exogenous_gdp 

로, 비 상대적 관점에서 직접 할 수 있었다 그리고 상대적 확산 1.e-10/1.e-12=1.e-22 때문에이 시간 x=1.e-10은 비 상대는, 그렇게 나쁘지 않은 것으로 간주 할 수있다.

반대의 경우에도 동일한 방법으로 1.e-8 주변의 값으로 작업 할 경우 최종 상대 비 상대 및 상대 차이는 각각 1.e-10*1.e-8=1.e-181.e-10/1.e-8=1%이됩니다. 이번에는 이것이 좋지 않은 후자입니다.

마지막으로 rescale the problem이 필요한지 궁금 할 것입니다. 예를 들어 Excel makes "small" numbers be 0 from ~1e-308은 실제로는 IEEE 754 표준을 따릅니다.

당신이 질문을하면 약 융합입니다, 다음, 예를 들어, 파이썬의 scipy.optimize fsolve 기능이 융합 임계 값으로 1.49012e-08를 사용하는 것을 알고있다. 이전 예를 재사용이 것이라고는

x(n+1) = -1. + endogenous_gdp(n+1)/exogenous_gdp 

최종적와 상대 오차를 계산 번째 반복 (N + 1)로,

x(n) = -1. + endogenous_gdp(n)/exogenous_gdp 

후 n 번째 반복으로, (상대 환산) 컴퓨팅 구성

y = abs(-1. + x(n+1)/x(n)) 

y이 1.49012e-08보다 낮 으면 수렴했다고 간주되는 것으로 간주됩니다.

+0

감사합니다! (+1). 나는 당신이 OP에 편집을 볼 수 있는지 궁금해. – Toni

2

어느 시점에서 10^-X를 0으로 처리해야합니다. 다음과 같이 입력하십시오 :

if (value == 0.0) 

아무 문제가 없습니다. 부동 소수점 비교를 위해 델타를 정의해야합니다.

델타의 크기는 응용 프로그램에 따라 다릅니다. 분자 모델링을하는 경우, 선거의 질량은 약 10^-30kg입니다. 이 경우 델타는 10^-30보다 훨씬 작아야합니다.

CAD 응용 프로그램에서 델타는 일반적으로 파일 단위로 구성 할 수 있습니다. 미터 단위로 측정 한 건물 모델을 수행하는 경우 델타는 0.0001 (1/10 mm) 일 수 있습니다. 동일한 애플리케이션을 사용하여 장난감을 미터 단위로 설계하면 델타는 0.000001이 될 수 있습니다.

CAD 파일에서 델타를 너무 크게 만들면 세부 정보가 삭제됩니다. 너가 너무 작 으면, 일치해야하는 점수는 그렇지 않다.

IEEE 이중 형식은 -1022 이하의 범위를 지원합니다. 따라서 많은 반올림 및 오류 전파가 있더라도 델타를 아주 작게 만들 수 있습니다.

+0

감사합니다! (+1). 나는 당신이 OP에 편집을 볼 수 있는지 궁금해. – Toni