【问题标题】:algorithm quadratic equation MATLAB算法 二次方程 MATLAB
【发布时间】:2014-03-14 19:58:01
【问题描述】:

我应该在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

非常感谢您的帮助

【问题讨论】:

  • roots 会给你一个更好的答案。它使用基于矩阵的方法。
  • 如果你不想完全使用符号(你的标签表明你对数值方法感兴趣),你可以试试variable precision arithmetic
  • 我对您用于根的公式表示怀疑。不应该是(-b+sqrt(b^2-4ac)) / 2a(-b-sqrt(b^2-4ac)) / 2a
  • 是的,但是我想分析一下matlab造成的经典公式之间的小数差异

标签: algorithm matlab equation numerical-methods numerical-analysis


【解决方案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

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


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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 那么,我可以更正一些程序以使舍入正确吗?
    • @OriolPrat 您使用公式计算的答案在工作精度范围内已经“正确”,只是浮点算术四舍五入导致二次方程在您插入您找到的解决方案。因此,您无法做任何事情来使解的“四舍五入正确”,但是当您检查解时,您当然可以设置一个像 10^(-50) 这样的容差,如果方程的绝对值返回解是正确的插入解决方案时小于 10^(-50)。
    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2017-06-13
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    • 2015-03-12
    • 1970-01-01
    相关资源
    最近更新 更多