【算法】牛顿迭代法的下山法改进

算法-牛顿迭代法的下山法改进


前置知识
  • 牛顿迭代法

思路

在牛顿迭代法一文中,我提到了牛顿迭代法的迭代不收敛问题。
在本文中,我们来讨论牛顿迭代法的改进方案之一——下山法。
让我们回顾一下牛顿迭代法的迭代式 x k + 1 = x k − f ( x k ) f ′ ( x k ) x_{k+1}=x_k-\frac{f(x_k)}{f'(x_k)} xk+1=xkf(xk)f(xk)
为什么上式存在迭代不收敛的问题呢?还是看一个例子。
【算法】牛顿迭代法的下山法改进_第1张图片
这是方程 x 3 = 0 \sqrt[3]{x}=0 3x =0 使用普通牛顿迭代的结果。离离原上谱
不难发现,该迭代不收敛的主要体现在 ∣ f ( x k + 1 ) ∣ > ∣ f ( x k ) ∣ |f(x_{k+1})|>|f(x_k)| f(xk+1)>f(xk)
这时,下山法登场了!
我们原式基础上加上一个变量 λ \lambda λ x k + 1 = x k − λ f ( x k ) f ′ ( x k ) x_{k+1}=x_k-\lambda\frac{f(x_k)}{f'(x_k)} xk+1=xkλf(xk)f(xk)
如果发现 ∣ f ( x k + 1 ) ∣ ≥ ∣ f ( x k ) ∣ |f(x_{k+1})|\ge|f(x_k)| f(xk+1)f(xk),则让 λ \lambda λ 减半。
我们可以证明下山法可以有效地解决迭代不收敛的问题,同时也解决了 x 0 x_0 x0 随机取值的不确定性


实现代码

其实是原来那一段的改版……
此程序用来处理整次数多项式方程的根。

void NewtonIterationMethod_DownHillMethod(){//f(x)=0
	ll k;long double a[6],x;
	cout<<"This code will help you solve f(x)=0(decimal solution)!\n";
	cout<<"Please type in the maxium power times k:";cin>>k;
	cout<<"please type in k+1 numbers, which is the coefficient of x^0 to x^k:";for (ll i=0;i<=k;i++) cin>>a[i];
	cout<<"Please type in the initial solution x0:";cin>>x;
	cout<<"We can use Newton iteration method's down-hill method to solve the equation\n";
	for (ll i=1;;i++){
		double lmd=1.000;
		Halve:printf("We use the folmula x%d=x%d-k*f(x%d)/f'(x%d) to calculate x%d\n",i,i-1,i-1,i-1,i);
		long double f1=0.000,f2=0.000;
		for (ll i=0;i<=k;i++) f1=f1+a[i]*pow(x,i);
		for (ll i=1;i<=k;i++) f2=f2+i*a[i]*pow(x,i-1);
		assert(fabs(f2)>eps);
		long double xp=x-lmd*f1/f2;
		printf("So, we can get that x%d=%.18Lf\n",i,xp);
        double f3=0.000;
		for (ll i=0;i<=k;i++) f3=f3+a[i]*pow(xp,i);
		if (fabs(f3)>fabs(f1)){
            lmd=lmd/2.000;
            printf("But we get |f(x%d)|>|f(x%d)|, so we halve k.\n",i,i-1);
            goto Halve;
        }
		x=xp;
		ll f;
		cout<<"Do you want another calculation?\ntype 1 for yes, or type any other for no:";cin>>f;
		if (f!=1) break;
	}
	printf("So the solution we get is: x=%.18Lf\n",x);
}

练习
  • Leetcode69 x 的平方根
  • 洛谷B3627 立方根
  • UVA10428 The Roots 原题链接 这才是牛顿迭代法该用的地方

你可能感兴趣的:(算法,#,牛顿迭代法,算法)