非常简单的MATLAB代码,结果不合逻辑
下面是我的MATLAB代码,用于生成波速(c)的虚部,当雷诺数为249时,使用函数oscalcpcf,我希望以2的步长运行波数(α)在0.1到2之间非常简单的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);
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