我正在尝试在MATLAB中创建一个Euler近似函数。我应该在t = 0.1,0.2,0.3,0.4时进行评估,但由于某种原因,我的代码在0.3时没有评估。
这是我的代码:
clear; clc;
stepSizes = [0.1 0.05 0.025];
tInitial = 0;
yInitial = 1;
t = tInitial;
y = yInitial;
for step = 1:3
stepSize = stepSizes(step);
for tVal = 0:stepSize:0.4;
slope = 3+t-y;
yVal = y + slope*(tVal-t);
fprintf('%0.3f\n',tVal);
if tVal==0.1 || tVal==0.2 || tVal==0.3 || tVal==0.4
fprintf('Stepsize: %0.3f, tVal = %0.3f, yVal = %0.3f.\n',...
stepSize, tVal, yVal);
end
t = tVal;
y = yVal;
end
end
以下是我的一些打印输出,说明了我的问题。所有这些值都与我手工完成时得到的答案相符。
0.000
0.100
Stepsize: 0.100, tVal = 0.100, yVal = 1.200.
0.200
Stepsize: 0.100, tVal = 0.200, yVal = 1.390.
0.300
0.400
Stepsize: 0.100, tVal = 0.400, yVal = 1.744.
为什么tVal == 0.3的逻辑等于不起作用?
答案 0 :(得分:4)
您正在使用浮点数。使用浮子时3 * 0.1不等于0.3。
What Every Computer Scientist Should Know About Floating-Point Arithmetic
检查容差abs(tVal-.3)<eps
是否有简单的解决方法。
答案 1 :(得分:0)
您还可以使用round
修复循环增量并测试真值
for tVal = round( (0:stepSize:0.4)*1000 )/1000
if tVal==0.1 || tVal==0.2 || tVal==0.3 || tVal==0.4