让我们说f(x) = (4x^2-9)/(2x-3)
。 f(x)
处未定义函数x=3/2
。请注意,可以将函数计算为f(x)=2x+3
,但让我们检查第一个等式。在x=1.5
时的以下脚本中,函数f(x=1.5)=4.0
clear all
clc
x = 0:0.3:2;
for i = 1:length(x)
if x(i) == 1.5 % this line for some reasons is ignored.
y(i) = 6;
else
y(i) = (4*x(i)^2-9)/(2*x(i)-3);
end
end
x
y
前面脚本的输出是
x = 0 0.3000 0.6000 0.9000 1.2000 1.5000 1.8000
y = 3.0000 3.6000 4.2000 4.8000 5.4000 4.0000 6.6000
y=4.0000
时为何x=1.5000
?现在让我们运行没有for循环的代码,
clear all
clc
x = 0:0.3:2
y = (4*x.^2-9)/(2*x-3)
上述代码的结果是
x = 0 0.3000 0.6000 0.9000 1.2000 1.5000 1.8000
y = 3.6000
f(x)
只有一个值。任何人都可以解释发生了什么吗?
答案 0 :(得分:2)
关于你的第一个问题,是的,你遇到浮点精度错误。您可以通过检查它应该是1.5和1.5的x
值之间的差异来检查这一点。
x(6)-1.5
%ans=
% -2.2204e-16
特别是在你的情况下,它来自使用0.3来构造向量x
,因为该值无法精确保存为二进制,see here for a deeper explanation
以下任何一项都可以解决您的问题
x=0:3:20; %Create the vector based on values that can be represented
x=x/10;
x=[0, 0.3, 0.6, 0.9, 1.2, 1.5, 1.8]; %Directly input the values
abs(x(i)-1.5) < tol %Instead of directly comparing values, compare the difference to a determined tolerance (very small compared to the values at hand)
至于你的第二个问题@Phill已经给你答案,你正在使用/
矩阵除法,你想要./
元素明智的划分。
答案 1 :(得分:0)
当我在Octave中使用for循环运行你的第一个例子时,我没有看到x = 1.5 if语句被忽略的问题。也许这是Matlab和Octave之间的微妙差异,尽管我会感到惊讶。
对于数组表示法第二个例子
clear all
clc
x = 0:0.3:2
y = (4*x.^2-9)/(2*x-3)
您选择了matrix division operator /
而不是element by element division operator ./