本科课程参见:《软件学院那些课》
设 ,由于x1满足
解得
重复这一过程,得到迭代公式:
这就是著名的牛顿迭代公式,它相应的不动点方程为/*简单迭代法的代码实现*/ #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; } /*牛顿迭代法的代码实现*/ #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]; } } cout<<endl; cout<<"请输入方程组的值向量:"<<endl; for(int k=0;k<n;k++){ cin>>B[k]; } cout<<endl; cout<<"您输入的方程组为:"<<endl; for(int a=0;a<n;a++){ for(int b=0;b<n;b++){ cout<<A[a][b]<<" "; } cout<<" "<<B[a]<<endl; } cout<<endl; cout<<"由雅可比迭代公式求的方程组的解为:"<<endl; Jacobi(A,B,n); return 0; }