【问题标题】:Matlab numerical error and how to get the correct answerMatlab数值错误以及如何得到正确答案
【发布时间】:2014-11-28 12:10:09
【问题描述】:

我以某种方式在 Matlab 中获得了以下表达式(R2014a on W7, 64b)

1/1034591578977116160000*prod(1:19)*(29576428208904825-17729494921579950*k - 20479697577410832*k^2 + 13867226524449248*k^3 - 836937224095392*k^4 - 869194297188672*k^5 + 163710902234880*k^6 + 2589894827520*k^7 - 2476912838400*k^8 + 144848704000*k^9) 

其中 k 最初是一个符号变量。然后我设置 k=10 并使用 LONGG 输出格式得到结果 370371188237528。但是,如果我对 Mathematica 使用相同的表达式(用 19 代替 prod(1:19)!),我会得到 370371188237525,我相信这是正确的答案。这似乎是本网站多次描述的舍入错误(是否正确?)。使用或不使用 Matlab 符号工具箱如何避免它?

【问题讨论】:

    标签: matlab rounding-error symbolic-computation


    【解决方案1】:

    High Precision Float 类。将其添加到路径后,您可以在评估表达式之前简单地编写k = hpf(10);。结果将是

    370371188237525.0106290979251578332118698122510380699168308638036
    

    使用符号数学工具箱我会写

    syms k
    expr = 1/1034591578977116160000*prod(1:19)*(29576428208904825-17729494921579950*k - 20479697577410832*k^2 + 13867226524449248*k^3 - 836937224095392*k^4 - 869194297188672*k^5 + 163710902234880*k^6 + 2589894827520*k^7 - 2476912838400*k^8 + 144848704000*k^9);
    subs(expr, k, 10);
    

    计算结果为3150006955960150124/8505 = 370371188237525

    【讨论】:

    • 天哪!我不知道这存在!我希望我能 +10。
    • 在我重新启动 Matlab 之前,我无法重复结果(我从 subs(expr, k, 10) 得到 2962969505900221/8)。我想知道为什么..但现在很好。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    相关资源
    最近更新 更多