• 二分法与牛顿迭代法求方程根


    1.二分法求方程根

    二分法求根基于二分查找的思想。

    比如求根号2的近似值,猜测它在1到2之间,则将1作为left,2作为right,反复二分比较f(mid)的平方与2的大小,直到(right-left)的精度eps控制在一定范围以内。

    代码:

    #include <iostream>
    using namespace std;
    
    const double eps = 1e-5;
    
    double f(double x)
    {
    	return x * x;
    }
    
    double calSqrt()
    {
    	double left = 1, right = 2, mid;
    	while (right - left > eps)
    	{
    		mid = (left + right) / 2;    //避免溢出 mid = left + (right - left)/2;
    		if (f(mid) > 2)
    			right = mid;
    		else
    			left = mid;
    	}
    	return mid;
    }
    
    int main()
    {
    	cout << calSqrt();
    
    	return 0;
    }
    

    2.牛顿迭代法求方程根

    例如求f(x)=0,画图如下,求方程根即求f(x)与x轴交点的值。假设这个点叫Xn好了。

    牛顿迭代法的思想是,首先取一个与Xn相近的点,假定为X0

    作X0在f(x)上的切线,切线与X轴相交于X1。注意此时X1比X0更接近我们最终要找的Xn

    按同样的方式,继续作X1对应的f(x)的切线,与X轴相交于X2。反复这样做,X轴交点就会越来越逼近Xn。这就是迭代的过程,预设的精度就是循环终止的条件。

    既然是迭代,自然有迭代公式,我们要寻找Xn与Xn-1之间的关系。比如说就找X1与X0,其实就是X0对应的切线方程,令y=0。

    切线方程

    y = f(X0)+f'(X0)(x-X0

    令y = 0,得 X1 = X0-f(X0)/f'(X0

    所以也有

    Xn = Xn-1-f(Xn-1)/f'(Xn-1

    举个例子,求根号6的近似值。

    代码:

    #include <iostream>
    using namespace std;
    
    const double eps = 1e-5;
    
    double f(double x)
    {
    	return x * x - 6;
    }
    
    double calSqrt()
    {
    	double x_0 = 6 / 2;
    	double x_1 = x_0 - f(x_0) / (2 * x_0);
    	while ((x_0 - x_1) > eps)    
    	{
    		x_0 = x_1;
    		x_1 = x_0 - f(x_0) / (2 * x_0);
    	}
    	return x_1;
    }
    
    int main()
    {
    	cout << calSqrt();
    
    	return 0;
    }
    

    输出

    2.44949
    
  • 相关阅读:
    记录使用cx_Freeze打包Python成exe可执行程序
    jquery plug-in DataTable API中文文档参考
    java.lang.UnsatisfiedLinkError: dlopen failed: /data/app/xxx/lib/arm/liblame.so: has text relocations
    CocoaPods的安装及使用
    Android 贝塞尔曲线的浅析
    GUI学习中错误Exception in thread "main" java.lang.NullPointerException
    线程
    12月13日
    今天开始学习java编程
    UVA10140 Prime Distance
  • 原文地址:https://www.cnblogs.com/banmei-brandy/p/14406204.html
Copyright © 2020-2023  润新知