0

我应该在matlab代码中输入什么条件,以便使用这些公式获得二次的精确解:

x1=(-2*c)/(b+sqrt(b^2-4*a*c))
x2=(-2*c)/(b-sqrt(b^2-4*a*c))

直接实现这些公式在某些情况下我没有得到正确的解决方案,例如 x^2-1000001x+1

非常感谢您的帮助

4

2 回答 2

1

正确的公式集是

w = b+sign(b)*sqrt(b^2-4*a*c)

x1 = -w/(2*a)

x2 = -(2*c)/w

如果 b>=0,则 sign(b)=1,如果 b<0,则 sign(b)=-1。

您的公式以及标准公式导致 b 的一个根大 wrt 的灾难性取消。a和c。


如果你想走极端,你还可以在平方根下项的计算中防止上溢和下溢。

令 m 表示 |a| 的最大大小,|b| 和|c|,例如,它们的浮点表示中的指数的最大值,或者它们的绝对值......然后

w = b+sign(b)*m*sqrt( (b/m)*(b/m)-4*(a/m)*(c/m) )

在根下方有一个介于 -10 和 10 之间的项。如果此项为零,则这不是由下溢引起的。

于 2014-03-15T16:59:05.280 回答
0

您正在处理 matlab 中的浮点运算,因此不能保证精确的解决方案。(即,当您插入原始二次方程时,每个浮点值都可能导致舍入误差,给出非零答案)。检查您是否找到浮点方程的解的更好方法是使用容差,并检查答案的绝对值是否小于容差。

于 2014-03-14T20:11:37.617 回答