2

以下は、レイノルズ数が 249 で、2 刻みで 0.1 から 2 の間の波数 (アルファ) に対して実行したい場合に、関数 oscalcpcf を使用して、波速度 (c) の虚数部を生成する私の 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'];

私の意見では、上記のコードはまったく難しくありませんが、私のラップトップはレイノルズ数とアルファのいくつかのペアで不機嫌になりました。それらの1つに名前を付けるだけでReynolds number = 249alpha = 0.3.

上記のコードを実行すると、 と が得られc1 = 6.06002472332094E-08ますc2 = 0.0000010870344982811

ここで問題です。から2まで0.1のステップを実行すると-0.1、 と が得られc1 = -0.337584041016646ますc2 = 0.0000364854401656638

AND を使用して手動でチェックした場合oscalcpcf、つまりoscalcpcf(249,0.3,100)andoscalcpcf(249,0.3,200)を取得するc1 = -0.337583911335139と、 and が得られc2 = -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.12

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

OMG、なぜ私のコンピューターは、0.1私がそうするように指示したときに正確なステップを示さないのですか. この関数oscalcpcfは の小さな変化に非常に敏感でalphaあり、スクリプトで使用するこれらの値を確認すると、 で手動で行うと一致しoscalcpcfます。私のコンピュータが の正確なステップを表示する方法を教えていただけます0.1か? ありがとうございました。

4

2 に答える 2

2

コロンで生成され0.1:0.1:2たベクトルが原因で、浮動小数点エラーが発生したと思います。

の値が不正確になります。これはalpha、倍精度などの固定ストレージ サイズが与えられた場合、コンピューターはすべての数値を正確に表すことができないためです。これは特にコロン演算子の場合に当てはまり、不正確さがベクトル要素全体に伝播します。

さて、これで結果が改善されるかどうかはわかりませんが、COLON演算子の仕組みに基づいて、次のようにループを実行することをお勧めします(私のこの回答と同様):

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

また、oscalcpcf()改ざんが許可されている関数の場合は、それを調べて、入力の小さな変化に対する堅牢性/感度を改善することをお勧めします。10 ~ 14 % の不正確さが結果に大きな影響を与えることは決してありません。

于 2012-09-01T09:10:21.167 に答える
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 

結果は、倍精度標準に対して正確になります。また、matlab シンボリック ツールボックスsymvpa関数が あれば役立つ場合があります。

于 2012-09-01T10:18:24.113 に答える