2012-07-25 24 views
1

这里是我的代码来解决方程:解方程,奇怪的结果

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

当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:数字的非空值指定最小nu需要打印的数位有效数字。缺省值NULL使用getOption(数字)。 (有关复数的解释请参阅signif。)非整数值将向下舍入,只接受大于等于1且不大于22的值。

0

试试看,并看看abprint()

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 
    print(a,digits=20) 
    print(b,digits=20) 
    return(list(root=myroot,value=fx(myroot))) 
} 

有一轮。