求解方程,奇怪的结果

时间:2012-07-25 11:26:44

标签: r

这是解决方程式的代码:

fx=function(x){ x^3-x-3}  
solve=function(a,b,eps){
    if(abs(fx(a))<0.00001)  return(list(root=a,fun=fx(a)))    
    else if(abs(fx(b))<0.00001)  return(list(root=b,fun=fx(b)))  
    else if (fx(a)*fx(b)>0)  return(list(root="failed to find"))  
    if (a>b){
        c<-a
        a<-b
        a<-b}       
    while( b-a>eps ){ 
        x=(a+b)/2
        if (fx(x)==0) {return(list(root=x,fun=fx(x))) } 
        else if (fx(a)*fx(x)<0) {b=x }           
        else  {a=x}}
    myroot=(a+b)/2
    return(list(root=myroot,value=fx(myroot)))
}

> solve(1,3,1e-8)
$root
[1] 1.6717

$value
[1] 2.674228e-08

> fx(1.6717)
[1] 8.73813e-07

为什么fx(1.6717) != $value,我想知道原因
8.73813e-07!=2.674228e-08

我该如何修改:return(list(root = myroot,value = fx(myroot)))
让我的根更多数字?

2 个答案:

答案 0 :(得分:2)

当R打印一个值时,它默认使用digits=3,即打印3位有效数字。这意味着您在查看结果时会出现解释错误。

试试这个:

 x <- solve(1,3,1e-8)

print(x[[1]], digits=9)
[1] 1.67169989

现在将实际返回的值替换为您的函数:

fx(x[[1]])
[1] 2.674228e-08

现在值匹配。

总之,在解释函数的打印结果时,您出现了舍入错误。


您可以在R帮助文件中跟踪此行为,如下所示:

?print

会指向

?print.default

关于digits论证有哪些说法:

digits:数字的非空值指定要在值中打印的最小有效位数。默认值NULL使用getOption(数字)。 (有关复数的解释,请参阅signif。)非整数值将向下舍入,只接受大于或等于1且不大于22的值。

答案 1 :(得分:0)

试试这个并查看print()a的{​​{1}}。

b

有一轮。