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)))
使我的根更多位数?

4

2 回答 2

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说法:

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

于 2012-07-25T12:09:24.757 回答
0

试试这个,看看print()ofab

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)))
}

有一个回合。

于 2012-07-25T12:06:26.413 回答