埃特金迭代加速法
思想
(1)[https://max.book118.com/html/2017/0422/101728681.shtm]
注意
- 相当于一次进行两次不动点迭代,为不动点迭代的加速方法
- 也可以用于加速其他方式
代码实现
对比不动点迭代法
#include<iostream>
#include<vector>
#include<cmath>
#include <iomanip>
using namespace std;
//不动点迭代法求根
double fx1(double x){
//迭代函数 x = fx x = ((x+1)/2)^()1/3
return pow((x+1)/2, 1.0/3);
}
double fx2(double x){
return 2*(pow(x, 3)) - 1;
}
double fx3(double x){
return 3 + 2*sin(x);
}
double FixedPointIteration(double x0, int n, double esp){
//x0:迭代初值 n:迭代次数 esp:精度
double temp = 0;
int Iter = 1;
while(abs(fx1(x0) - x0) > esp){
x0 = fx1(x0);
Iter++;
if(Iter > n){
break;
}
cout << x0 << endl;
}
cout << Iter << endl;
return x0;
}
/*
Aitken迭代加速
迭代: x(k+1) = g(x(k));
再迭代: x(k+2) = g(x(k+1));
加速: ^x = x(k+2)-[(x(k+2)-x(k+1))^2]/[x(k+2)-2*x(k+1)+x(k)]
*/
double Itekin(double x0, int n, double esp){
double x1,x2,x_new;
int Iter = 0;
for(int i = 0; i < n; i++){
Iter++;
if(Iter > n){
break;
}
x1 = fx1(x0);
x2 = fx1(x1);
cout << setprecision(10) << x1 << " " << x2 << endl;
x_new = x2 - pow(x2-x1, 2)/(x2-2*x1+x0);
cout << setprecision(10) << x_new << endl;
if(abs(x_new-x0) < esp){
cout << Iter << endl;
return x_new;
}
x0 = x_new;
}
cout << "求解失败" << endl;
return x0;
}
int main(){
cout << setprecision(10) << FixedPointIteration(0, 10, 0.0000001) << endl;
cout << setprecision(10) << Itekin(0, 10, 0.0000001);
return 0;
}