这是解决方程式的代码:
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)))
让我的根更多数字?
答案 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
有一轮。