zoukankan      html  css  js  c++  java
  • 二分和牛顿法实现开根号

    二分法:

    二分的思想很直观,就不断做折半,但这里注意需要设置一个精度来替代0,由于开根号并不一定保证能够开方取尽。这里取limit = 0.00002。

    牛顿法:

    设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。

    过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。

    根据牛顿迭代的原理,可以得到以下的迭代公式:X(n+1)=[X(n)+p/Xn]/2

     https://blog.csdn.net/leviopku/article/details/82811478

    代码:

     1 #include<iostream>
     2 #include<vector>
     3 #include<deque>
     4 #include<string>
     5 #define limit 0.0002
     6 using namespace std;
     7 
     8 // 二分法
     9 double my_sqrt(double n)
    10 {
    11     double start = 0;
    12     double end = n;
    13     double mid = (start+end)/2;
    14     while(mid*mid>n+limit || mid*mid<n-limit)
    15     {
    16         mid = (start+end)/2;
    17         if(mid*mid>n)
    18             end = mid-1;
    19         else
    20             start = mid+1;
    21     }
    22     return mid;
    23 }
    24 
    25 // 牛顿法
    26 double new_sqrt(double n)
    27 {
    28     double k = n;
    29     while(1)
    30     {
    31         if(k*k<n+limit && k*k>n-limit)
    32         {
    33             break;
    34         }
    35         k = 0.5*(k+n/k);
    36     }
    37     return k;
    38 }
    39 int main(){
    40     double a = 81;
    41     cout<<my_sqrt(a)<<endl;
    42     cout<<new_sqrt(a)<<endl;
    43     return 0;
    44 }
  • 相关阅读:
    Kafka学习笔记(五、Kafka偏移量)
    web-备份是个好习惯
    web-Web5
    web-web4
    web-flag就在index里
    C++日期类、时间类、日期时间类的设计
    蒙提霍尔问题简单粗暴的理解掉
    sql分组操作符与聚集函数
    sql增删改
    sql简单查询
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11221424.html
Copyright © 2011-2022 走看看