非常简单的MATLAB代码,结果不合逻辑

非常简单的MATLAB代码,结果不合逻辑,matlab,Matlab,下面是我的MATLAB代码,用于生成波速(c)的虚部,当雷诺数为249时,使用函数oscalcpcf,我希望以2的步长运行波数(α)在0.1到2之间 c1holder = []; c2holder = []; reyholder = []; alphaholder = []; wantedrey = []; wantedalpha = []; for Rey = 249 for alpha = 0.1:0.1:2 c1=oscalcpcf(Rey,alpha,100);

下面是我的MATLAB代码,用于生成波速(c)的虚部,当雷诺数为249时,使用函数oscalcpcf,我希望以2的步长运行波数(α)在0.1到2之间

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'];
在我看来,上面的代码一点也不难,但我的笔记本电脑在一些雷诺数和阿尔法对的情况下出现了问题。只要说出其中一个,
Reynolds number=249
alpha=0.3

当我运行上述代码时,我得到
c1=6.06002472332094E-08
c2=0.0000010870344982811

现在问题来了。如果我通过步骤
-0.1
2
运行到
0.1
,我会得到
c1=-0.337584041016646
c2=0.0000364854401656638

如果我使用
oscalcpcf
手动检查,即
oscalcpcf(249,0.3100)
oscalcpcf(249,0.3200)
,我得到
c1=-0.337583911335139
c2=-0.337577395716528

我真的不知道这里发生了什么有人能帮忙吗

编辑

对于
0.1
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
的精确步骤吗?谢谢。

我相信您有一个浮点错误,因为您的冒号生成了
0.1:0.1:2
向量

对于
alpha
,您会得到不准确的值,因为在给定固定存储大小(如双精度)的情况下,计算机无法准确地表示所有数字。尤其是对于,这使得不精确性通过向量元素传播

现在,我不确定这是否会改善您的结果,但基于此,我建议您尝试按以下方式运行循环(类似于):

另外,如果
oscalcpcf()
是一个允许篡改的函数,我建议您研究它,并提高它对输入中微小变化的鲁棒性/敏感性。10-14%的误差绝对不会对结果产生重大影响。

试试以下方法:

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 
结果将精确到双精度标准。
此外,如果您有
sym
vpa
功能,则中的功能可能会有所帮助

在不知道oscalcpcf正在做什么的情况下,我们只能猜测。根据函数对其输入的敏感程度,您的问题可能是精度。尝试添加行
disp(['alpha:'sprintf('%.30f',alpha)]到你的内部for循环,看看
alpha
的实际值是多少。事实上,一旦你了解了计算机是如何做算术的,就会得到完全合乎逻辑的结果。嘿,谢谢你的建议,但仍然存在不准确的情况。。。我想知道是否有任何方法可以创建步长为0.1的精确向量……不幸的是没有。我建议您使用
oscalcpcf
以降低敏感度。否。阅读回答。在浮点运算中不能精确表示数字0.1。
for alpha = ((1:20) / 10)
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