2012-09-01 4 views
2

다음은 Reynolds 수가 249 일 때 함수 oscalcpcf를 사용하여 wavepeed (c)의 허수 부 생성을위한 MATLAB 코드이며 0.1에서 2 단계 사이의 파단 수 (알파)로 실행하고 싶습니다.비논리적 결과가있는 매우 단순한 MATLAB 코드

c1holder = []; 
c2holder = []; 
reyholder = []; 
alphaholder = []; 
wantedrey = []; 
wantedalpha = []; 
for Rey = 249 
    for alpha = 0.1:0.1:2 
     c1=oscalcpcf(Rey,alpha,100); 
     c2=oscalcpcf(Rey,alpha,200); 
     c1holder = [c1holder c1]; 
     c2holder = [c2holder c2];  
     reyholder = [reyholder Rey]; 
     alphaholder = [alphaholder alpha];  
    end 
end 
vectors = [c1holder' c2holder' reyholder' alphaholder']; 

위의 코드 2. 내 의견으로는 전혀 어려운 일이 아니다하지만 내 노트북은 레이놀즈 수와 알파의 일부 쌍에 대한 불안했다. 그 중 하나의 이름을 지정하면 Reynolds number = 249alpha = 0.3입니다.

위의 코드를 실행하면 c1 = 6.06002472332094E-08c2 = 0.0000010870344982811이 표시됩니다.

이제 문제가 있습니다. 2에서 0.1까지 단계를 -0.1으로 실행하면 c1 = -0.337584041016646c2 = 0.0000364854401656638이 표시됩니다. 내가 수동으로 oscalcpcf, 즉 oscalcpcf(249,0.3,100)oscalcpcf(249,0.3,200)를 사용하여 확인한다면

는 AND, 나는 c1 = -0.337583911335139c2 = -0.337577395716528 얻을.

나는 여기에 무슨 일이 일어나고 있는지 전혀 모르므로 누군가 도와주세요! 내가 그렇게 할 말했을 때

편집

alpha: 2.000000000000000000000000000000 
alpha: 1.899999999999999900000000000000 
alpha: 1.800000000000000000000000000000 
alpha: 1.700000000000000000000000000000 
alpha: 1.600000000000000100000000000000 
alpha: 1.500000000000000000000000000000 
alpha: 1.399999999999999900000000000000 
alpha: 1.299999999999999800000000000000 
alpha: 1.200000000000000000000000000000 
alpha: 1.100000000000000100000000000000 
alpha: 1.000000000000000000000000000000 
alpha: 0.899999999999999910000000000000 
alpha: 0.799999999999999820000000000000 
alpha: 0.699999999999999960000000000000 
alpha: 0.599999999999999870000000000000 
alpha: 0.500000000000000000000000000000 
alpha: 0.399999999999999910000000000000 
alpha: 0.299999999999999820000000000000 
alpha: 0.199999999999999960000000000000 
alpha: 0.099999999999999867000000000000 

0.1에 대한

OMG 2

alpha: 0.100000000000000010000000000000 
alpha: 0.200000000000000010000000000000 
alpha: 0.300000000000000040000000000000 
alpha: 0.400000000000000020000000000000 
alpha: 0.500000000000000000000000000000 
alpha: 0.599999999999999980000000000000 
alpha: 0.700000000000000070000000000000 
alpha: 0.800000000000000040000000000000 
alpha: 0.900000000000000020000000000000 
alpha: 1.000000000000000000000000000000 
alpha: 1.100000000000000100000000000000 
alpha: 1.200000000000000200000000000000 
alpha: 1.300000000000000300000000000000 
alpha: 1.400000000000000100000000000000 
alpha: 1.500000000000000200000000000000 
alpha: 1.600000000000000100000000000000 
alpha: 1.700000000000000200000000000000 
alpha: 1.800000000000000300000000000000 
alpha: 1.900000000000000100000000000000 
alpha: 2.000000000000000000000000000000 

에, 왜 내 컴퓨터는 0.1의 정확한 단계를 제공하지 않습니다. oscalcpcf 함수는 alpha의 작은 변경에 매우 민감하며 내 스크립트에서 사용하는이 값을 확인하면 수동으로 oscalcpcf을 입력하면 일치합니다. 제 컴퓨터가 0.1의 정확한 단계를 제공 할 수있는 방법을 제안 해 주시겠습니까? 고맙습니다.

+1

'oscalcpcf'가 무엇을하는지 모른 채만 우리는 추측 할 수 있습니다. 함수가 입력에 얼마나 민감한 지에 따라 문제가 정확해질 수 있습니다. 'disp ([ 'alpha :'sprintf ('% .30f', alpha)]);'를 내부 for-loop에 추가하여'alpha '의 실제 값을 확인하십시오. – Deve

+0

사실, 완벽하게 논리적 인 결과입니다. 일단 컴퓨터가 어떻게 산술을하는지 이해하면됩니다. –

답변

2

콜론으로 생성 된 0.1:0.1:2 벡터 때문에 부동 소수점 오류가 발생했다고 생각합니다.

컴퓨터가 배정도와 같은 고정 저장 장치 크기를 정확히 준 모든 숫자를 나타낼 수 없기 때문에 alpha에 대한 값이 정확하지 않습니다. 특히 colon operator의 경우 벡터 요소를 통해 부정확 한 전파가 발생합니다. 또한

for alpha = ((1:20)/10) 

:

지금, 나는 당신이 (비슷한 this answer of mine에) 다음과 같은 루프를 실행하려고 할 것을 제안,이 how the COLON operator works에 따라 결과를 향상 여부,하지만 여부를 확실하지 않다 , oscalcpcf()이 변조 될 수있는 함수 인 경우 입력 내용의 작은 변화에 대한 견고성/민감성을 조사해 보시기 바랍니다. A 10 -14 정확도는 결코 결과에 큰 영향을 미치지 않습니다.

+0

제안을 주셔서 고마워하지만 부정확성은 여전히 ​​존재합니다 ... 단계 크기 0.1의 정확한 벡터를 만들 수있는 방법이 있는지 궁금합니다. – matlablearner

+0

불행히도 아닙니다. 'oscalcpcf'에 대해 덜 민감하게 작업 할 것을 제안합니다. –

+3

NO. 응답을 읽으십시오. 부동 소수점 연산에서는 0.1을 정확하게 나타낼 수 없습니다. –

1

이 시도 :

alpha = ((1:20) *1e-1). you should get : 

0.100000000000000005551115123126 
0.200000000000000011102230246252 
0.300000000000000044408920985006 
0.400000000000000022204460492503 
0.500000000000000000000000000000 
0.600000000000000088817841970013 
0.700000000000000066613381477509 
0.800000000000000044408920985006 
0.900000000000000022204460492503 
1.000000000000000000000000000000 
1.100000000000000088817841970013 
1.200000000000000177635683940025 
1.300000000000000044408920985006 
1.400000000000000133226762955019 
1.500000000000000000000000000000 
1.600000000000000088817841970013 
1.700000000000000177635683940025 
1.800000000000000044408920985006 
1.900000000000000133226762955019 
2.000000000000000000000000000000 

결과는 배정 밀도 표준에 정확한 것입니다. 또한 symvpa의 기능이 matlab symbolic toolbox 인 경우 도움이 될 수 있습니다.