比方说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.6000f(x)只有一个值。有人能解释一下发生了什么事吗?
发布于 2016-08-14 06:09:17
至于你的第一个问题,是的,你遇到了一个浮点精度错误。您可以通过检查x值(它应该是1.5和1.5 )之间的差异来检查这一点。
x(6)-1.5
%ans=
% -2.2204e-16特别是在您的例子中,它来自于使用0.3构造向量x,因为该值不能精确地保存到二进制文件请看这里有更深入的解释。中。
下列任何一项都可以解决您的问题
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已经给出了答案,您使用的是/矩阵除法,您需要./元素明智的除法。
发布于 2016-08-14 03:55:43
当我在Octave中使用for循环运行您的第一个示例时,我不认为x=1.5 if语句会被忽略。也许这是Matlab和Octave之间的细微差别,尽管我会感到惊讶。
数组表示法的第二个示例
clear all
clc
x = 0:0.3:2
y = (4*x.^2-9)/(2*x-3)您选择了矩阵除法算子 /而不是元素除法算子 ./。
https://stackoverflow.com/questions/38938876
复制相似问题