二次方程matlab中的等次识别

时间:2014-03-16 11:12:46

标签: matlab floating-point

我有下一个二次方程的代码:

if b^2-4*a*c<0 
    disp('No real solutions')
elseif a==0
    x=-c/b
elseif abs(b)==sqrt(b^2-4*a*c)
   w = b+sign(b)*sqrt(b^2-4*a*c);
   x1 = -w/(2*a)
   x2 = -(2*c)/w
else
   x1=(-2*c)/(b+sqrt(b^2-4*a*c))
   x2=(-2*c)/(b-sqrt(b^2-4*a*c))
end

但是在某些情况下b等于sqrt(b^2-4*a*c)时,Matlab并不认识我,例如x^2 -100000001+1,但等式是真的:abs(-100000001)= sqrt((-100000001)^2-4*1*1)

我应该改变什么因为Matlab在这些极端情况下认识到我是平等的?

1 个答案:

答案 0 :(得分:0)

由于数值精度有限,Matlab可能会引入一些小错误。因此,通常更好的是包含一些容差。例如,

tol = 1e-5;
...
if abs(b-sqrt(b^2-4*a*c))<tol,
% It is considered that both are equal
...
end