Published
Edited
Apr 27, 2020
Insert cell
md`#牛顿法求平方根`
Insert cell
md来`>自《计算机程序的构造和解释》(第二版) page14`
Insert cell
md`## 比较误差的方法`
Insert cell
md`good-enough:**当猜测值与实际值相差很小时结束**`
Insert cell
{
// 成功的条件:一个合理的误差
const isGoodEnough = (guess,x)=>{
return Math.abs(Math.pow(guess,2) - x) < 0.001;
}
// 求平均数
const average = (x,y)=>{
return (x+y)/2;
}
// 根据牛顿法继续计算guess
improve = (guess,x)=>{
return average(x/guess,guess);
}
// 递归计算
sqrtIter = (guess,x)=>{
if(isGoodEnough(guess,x)){
return guess;
}else{
sqrtIter(improve(guess,x),x);
}
}
// guess 都从1开始
const sqrt = (x)=>{
return sqrtIter(1,x);
}
console.log(sqrt(2)); // =>1.414213562373095
}
Insert cell
md`## 监测迭代值变化的方法`
Insert cell
md`good-enough:**当改变值对于猜测值的比率很小时就结束**`
Insert cell
md`比较误差的方法的缺陷:</br>
1. 对于确定的非常小的数平方根而言很不好
2. 算术运算总是以一定的有限精确度进行的,比较误差的方法不适合非常大的的数的计算
`
Insert cell

{
// 监测方法的改变
const isGoodEnough = (current,pre)=>{
return Math.abs((current-pre))/current < 0.000001;
}

const average = (x,y)=>{
return (x+y)/2;
}

const improve = (guess,x)=>{
return average(x/guess,guess);
}

// 迭代变化
const sqrtIter = (current,pre,x)=>{
if(isGoodEnough(current,pre)){
return current;
}else{
return sqrtIter(improve(current,x),current,x);
}
}
// current pre初始化时差值要大于设置误差值
const sqrt = (x)=>{
return sqrtIter(1.5,1,x);
}
console.log(sqrt(2)); // => 1.414213562373095
}

Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more