R语言,。。。如何写分半算法bisection algorithm和解释code

这算法开始用2个值,x1 & x2 是f(x1) & f(x2) 的相反值。如果f(x)是连续性,那就会有根在这2值之间。用来判断f(x)的中点,然后选择哪部分有根,之后重复计算,直到找到想要的答案。
Q1 : 用repeat loop 写分半算法找出 f(x) = x^3 +2 x^2 -7的根 ,精确到6位小数,已知根在[0,2]之间。。。

>Eratosthenes <- function(n) {
+ if( n>2) {
+ sieve <- seq(2,n)
+ primes <- c()
+ while ( length(sieve) >0 ) { #Q2:这个写>1可以吗,反正sieve 都是已经是seq(2,n)
+ p <- sieve[1] # Q3: 为什么不写sieve[0]呢
+ primes <- c ( primes, p)
+ sieve <- sieve [ (sieve %% p )!=0]
+ }
+ return (primes) # Q4: return 其他数会有什么影响
+ } else {
+ stop (" Input value >=2.") # Q5:stop什么作用。
+ }
+ }
Q6, 展示 在sieve 里 P>= sqrt(n) 的剩余数是prime,...什么意思?我也不明白这问题想问什么。。。
Q7, 用break 去优化这function的结果。。。那break加在哪里?
问题比较多,,,望见谅啊。。。。非常感谢先

你的code是找n以下所有的质数
Q2: 你的循环条件就是sieve不能是空,所以不能是>1,一旦sieve空了,也就是sieve里的元素都能被p整除,循环停止。
Q3:这是R语言,没有0的index
Q4:return是函数返回值,primes就是储存n以下所有质数的向量,不返回这个返回啥。
Q5:stop就是当不满足if里的条件n>2时,错误信息提示:你的input value 必须大于等于2
Q6: 感觉这是道English 的题目,你是不是直接翻译过来的。直接把原题贴上来。
Q7: break加在sieve <- sieve [ (sieve %% p )!=0]的后面,整个code 的思想是2到100(我假设n=100),把2拿出来放到primes里,然后去掉2的倍数;接着把3push到primes里,之后去掉3的倍数;为什么没有4直接到5?因为在第一步4就被抹掉了(2的倍数),接着5拿出来,然后去掉5的倍数。。。一直到最后一个数97 其实可以写个break条件,当p>=sqrt(100)就可以停止了,因为当时sieve里的2到100已经只剩下质数,为何你得自己想想。所以在第8行后面加:

if(p>=sqrt(n)) break #大大节省运算时间 原来是从2试到100,现在就2到10,快了好几倍
当然你输出的结果也得改一改 return(c(primes,sieve))

两分法求根你google一下不就有了,现在都2013年,还有维基百科追问

Q6原题 : show that once p >= sqrt(n) all remaining entries in sieve are prime.

追答

这就是我Q7说的:其实可以写个break条件,当p>=sqrt(100)就可以停止了,因为当时sieve里的2到100已经只剩下质数。

为何?就拿100来说,根号100=10,也就是说比10大的因子都无需考虑。
问:那11呢,比如77,99这些数都是11的倍数啊。
答:但由于77同样也是7的倍数,在之前就被抹掉了,99是3的倍数。

所以不会有任何一个数,既比n大,他的因子又都比根号n大,那些在根号n之后都存活下来的数,就都是质数了。

温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜