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引数について次のように述べています。

digits: digits の null 以外の値は、値に出力される有効桁数の最小数を指定します。デフォルトの NULL は getOption(digits) を使用します。(複素数の解釈については、signif を参照してください。) 非整数値は切り捨てられ、1 以上 22 以下の値のみが受け入れられます。

于 2012-07-25T12:09:24.757 に答える
0

これを試して、 と を見print()aくださいb

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 に答える