欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

原生js数值开根算法

程序员文章站 2022-04-15 15:12:59
不借助Math函数求开根值 1、二分迭代法求n开根后的值 思路: left=0 right=n mid=(left+right)/2 比较mid^2与n大小 =输出; >改变范围,right=mid,mid重新计算; <改变范围,left=mid,mid重新计算; 如此循环,不过只能是逼近,并不能完 ......

不借助math函数求开根值

1、二分迭代法求n开根后的值

思路: left=0 right=n mid=(left+right)/2

  比较mid^2与n大小

  =输出;

  >改变范围,right=mid,mid重新计算;

  <改变范围,left=mid,mid重新计算;

  如此循环,不过只能是逼近,并不能完全正确,常识

2、牛顿迭代法求n开根后的值

  1)理论上来讲,开根后的值为x,那么x^2=n,即可以将其转换为数学问题

  2)令y=x^2-n,那么只需要求方程与x轴正方向的焦点就可以得出想要的结果

  3)我们作x=a与方程交于(a^2-n),求得他的切线与x轴的交点(a,a^2-n),a一般从n开始

  4)然后求得该点切线与x轴交点,此处需要了解切线公式:记曲线为y=f(x),则在点(a,f(a))处的切线方程为:y=f'(a)(x-a)+f(a),

  5)重复步骤3,令x=步骤4的x值,如此循环即可逼近

  有点绕,简单来讲就是设开根后的值为x,然后转换成方程,通过求切线与x轴交点值不断逼近方程的解,一般从x=n与方程交点的切线开始求,原因嘛:求根肯定是小于等于它自身的值,那么从n开始就没有疑问了,而且方程是曲线,方程一侧所有点切线与x轴交点的值一定是全部大于或者小于解的,迭代下去只会逼近解

<!doctype html>
<html>
<head>
  <meta charset="utf-8">
  <title></title>
  <script>
  // 普通迭代法,initnum要开根的值 , 保留savenum位小数,
  function sqr(initnum,savenum){
    var leftnum=0;
    var rightnum=initnum;
    var middlenum=(leftnum+rightnum)/2;
    for(var i=0;i<20;i++){
      var result=middlenum*middlenum;
      if(initnum===result){
        middlenum=middlenum.tofixed(savenum);
        document.getelementbyid("result").value=middlenum;
      }
      else if (initnum>result){
        leftnum=middlenum;
        middlenum=(leftnum+rightnum)/2;
      }
      else{
        rightnum=middlenum;
        middlenum=(leftnum+rightnum)/2;
      }
    }
    middlenum=middlenum.tofixed(savenum);
    document.getelementbyid("result").value=middlenum;
  }

  /*记曲线为y=f(x),则在点(a,f(a))处的切线方程为:y=f'(a)(x-a)+f(a)*/
  //牛顿迭代法
  function sqrt(initnum,savenum) {
    //当n>=1时,从n开始迭代;当n<1时,从1开始迭代
    let result = initnum >= 1 ? initnum : 1;
    // 当迭代值^2与原值之差满足一个很小的差值时,即可认为逼近开根值
    while(result * result - initnum > 1e-8)
    result = 0.5 * (result + initnum / result);
    result=result.tofixed(savenum);
    document.getelementbyid("result").value=result;
  }
</script>
</head>
<body>
<div class="mui-input-row">
  <label>请输入</label>
  <input type="text" placeholder="开根值" id="inuptnum">
</div>

<div class="mui-input-row">
  <label>保留</label>
  <input type="text" placeholder="几位小数" id="savenum">
</div>

<div class="mui-input-row">
  <label>结果</label>
  <input type="text" id="result">
</div>
<button type="button" class="mui-btn mui-btn-blue mui-btn-block" onclick="sqrt(parseint(document.getelementbyid('inuptnum').value),parseint(document.getelementbyid('savenum').value))">计算</button>

</body>
</html>