2014-06-10 1 views
0

Newton-Raphson 반복 방법을 사용하여 비선형 시스템 방정식을 풀려고하고 있으며 내 변수의 매개 변수 공간을 탐색하기 위해 이전 솔루션을 저장하는 것이 유용합니다. 내가 처음 유치한 추측으로 사용하여 내가 유역에 머무르게하십시오.논리 인덱스 및 배정 밀도 숫자

나는 현재에 대한 이런 식으로 나는 .mat 파일에 저장하는 구조 배열 내 솔루션을 저장합니다

load('solutions.mat','sol'); 
str = struct('a',Param1,'b',Param2,'solution',SolutionVector); 
sol=[sol;str]; 
save('solutions.mat','sol'); 

을 지금, 또 다른 실행을하는 나는 다른에 대해 위의 솔루션이 필요합니다 매개 변수 NewParam1 및 NewParam2. Param1을 = NewParam1-deltaParam1, 및과 Param2 = NewParam2 경우 - 다음 deltaParam2,

load('solutions.mat','sol'); 
index = [sol.a]== NewParam1 - deltaParam1 & [sol.b]== NewParam2 - deltaParam2; 
% logical index to find solution from first block 
SolutionVector = sol(index).solution; 

가끔 그런 솔루션이 존재하지 않는 없다는 오류 메시지가 표시됩니다. Matlab에서 2-1 ~ = 1이 발생할 수 있기 때문에 문제는 내 매개 변수의 이중 정밀도에 있습니다. 그러나 동일한 결과를 얻는 다른 방법을 찾을 수 없습니다. 저장 프로세스에서 숫자 매개 변수를 문자열로 변경하려고했지만 문자열로 논리적 색인을 생성 할 때 문제가 발생했습니다.

이상적으로, 필자의 매개 변수에 10의 거듭 제곱을 곱하여 정수로 만드는 것을 피하고 싶습니다. 이는 매개 변수의 수로 인해 코드를 이해하기가 어렵게 만듭니다. 그것 이외에, 어떤 도움도 크게 감사하겠습니다. 감사!

+1

대신'=='을 사용하십시오. 왜 작은 여백을 유지하지 않으시겠습니까? 1e-10 (또는 'eps')라고 말하십시오. –

답변

1

MATLAB에서 배정도 수를 비교할 때는 ==을 절대로 사용하지 마십시오. 그 이유는 여러분이 질문 할 때, 1/3이 십진수를 사용하여 정확히 쓰여지는 것과 같은 방식으로 이진수를 사용하여 일부 숫자를 정확하게 표현할 수 없다는 것입니다. 그것이 실제로 어떤 상황에서 실패 할 수 있습니다 너무 작아서 나는 실제로 eps를 사용하지 않는 것이 좋습니다

index = abs([sol.a] - (NewParam1 - deltaParam1)) < 1e-10 & ... 
     abs([sol.b] - (NewParam2 - deltaParam2)) < 1e-10; 

: 당신이 무엇을해야

이 같은 것입니다. 그러나 매우 높은 정확도가 필요한 경우 1e-10보다 작은 수를 사용할 수 있습니다 (단, 1e-10 이하의 숫자로 얼마나 자주 작업합니까).