当前位置:编程学习 > C/C++ >>

迭代法解方程:牛顿迭代法、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];  
        } &nb
补充:软件开发 , C++ ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,