迭代法解方程:牛顿迭代法、Jacobi迭代法
牛顿迭代公式
设已知方程f(x)=0的近似根x0 ,则在x0附近f(x)可用一阶泰勒多项式近似代替.因此, 方程f(x)=0可近似地表示为p(x)=0。用x1表示p(x)=0的根,它与f(x)=0的根差异不大.
设 ,由于x1满足解得
重复这一过程,得到迭代公式:
这就是著名的牛顿迭代公式,它相应的不动点方程为
Jacobi迭代公式解线性方程组
线性方程组基本解法:
若方程组可同解变形为
Jacobi迭代法的计算公式:
即
算法代码
[cpp]
/*简单迭代法的代码实现*/
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
double e=2.718281818284;
double f(double x){
return pow(e,-1*x);
}
void SimpleDiedai(double x,double d){
double a=x;
double b=f(a);
int k=0;//记录循环的次数
while(((a-b)>d) || ((a-b)<-1*d)){
cout<<a<<endl;
a=b;
b=f(a);
k++;
if(k>100){
cout<<"迭代失败!(可能是函数不收敛)"<<endl;
return ;
}
}
cout<<b<<endl;
return;
}
int main(){
cout<<"请输入初始值x0和要求得结果的精度:";
double x,d;
cin>>x>>d;
SimpleDiedai (x,d);
return 0;
} www.zzzyk.com
/*牛顿迭代法的代码实现*/
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
double e=2.718281818284;
double f(double x){
double a=pow(e,-1*x);
return x-(x-a)/(1+a);
}
void NewtonDiedai(double x,double d){
double a=x;
double b=f(a);
int k=0; //记录循环的次数
while(((a-b)>d) || ((a-b)<-1*d)){
cout<<a<<endl;
a=b;
b=f(a);
k++;
if(k>100){
cout<<"迭代失败!(可能是函数不收敛)"<<endl;
return ;
}
}
cout<<b<<endl;
return;
}
int main(){
cout<<"请输入初始值x0和要求得结果的精度:";
double x,d;
cin>>x>>d;
NewtonDiedai(x,d);
return 0;
}
/*雅可比算法的代码实现*/
#include<iostream>
#include<iomanip>
#include<string>
#include<vector>
using namespace std;
//函数求数组中的最大值
double MaxOfList(vector<double>x){
double max=x[0];
int n=x.size();
for(int i=0;i<n;i++)
if(x[i]>max) max=x[i];
return max;
}
//雅可比迭代公式
void Jacobi(vector<vector<double> > A,vector<double> B,int n){
vector<double> X(n,0);
vector<double> Y(n,0);
vector<double> D(n,0);
int k=0; //记录循环次数
do{
X=Y;
for(int i=0;i<n;i++){
double tem=0;
for(int j=0;j<n;j++){
if(i!=j) tem += A[i][j]*X[j];
}
Y[i]=(B[i]-tem)/A[i][i];
cout<<left<<setw(8)<<Y[i]<<" ";
}
cout<<endl;
k++;
if(k>100){
cout<<"迭代失败!(可能是函数不收敛)"<<endl;
return ;
}
for(int a=0;a<n;a++){
D[a]=X[a]-Y[a];
}
}while( MaxOfList(D)>0.00001 || MaxOfList(D)<-0.00001);
return ;
}
int main(){
int n;
cout<<"请输入方程组未知数的个数n:";
cin>>n;
cout<<endl;
vector<vector<double> >A(n,vector<double>(n,0));
vector<double>B(n,0);
cout<<"请输入方程组的系数矩阵:"<<endl;
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>A[i][j];