算法不难,只要理解Jacobi的算法另外两种就很简单了,因为他们都是建立在Jacobi迭代的基础上.
首先讲一下程序,主要是由输入功能,和迭代方式调用功能实现块构成的.
点击这里下载源码.
提取码:mlpb
程序变量
int m; //m*n的系数矩阵
int max_times;// z最大迭代次数
int times = 0;//当前迭代次数
//int mx_mis = 99999999;
string choice;//功能选择
double mis;//误差范围
double mtrx[sz][sz];//系数矩阵
double b[sz];//常数矩阵
double init[sz];//初始向量
double ans[sz];//答案
//double max_mis[sz];//
主程序
int main()
{
input();
func();
return 0;
}
输入功能
这里就是输入计算需要的系数矩阵,常数矩阵等基本条件.
void input()
{
cout<<"请输入迭代方式(J,GS,SOR)"<<endl;
cin>>choice;
cout << "请输入m" << endl;
cin >> m;
cout << "请输入系数矩阵m*n(m)" << endl;
for ( int i = 0; i < m; i++ )
{
for ( int j = 0; j < m; j++ )
{
cin >> mtrx[i][j];
}
}
cout << "请输入常数矩阵b:" << endl;
for ( int i = 0; i < m; i++ )
{
cin >> b[i];
}
cout << "请输入初始向量" << endl;
for ( int i = 0; i < m; i++ )
{
cin >> init[i];
ans[i] = init[i];
}
cout << "请输入最大迭代次数:" << endl;
cin >> max_times;
// cout << endl << "请输入最大误差:"<<endl;
// cin>>mis;
}
输出功能
迭代结束后进行输出
void output()
{
cout << "迭代" << times+1 << "次,答案是" << endl;
for ( int i = 0; i < m; i++ )
{
// cout << init[i] << endl;
printf ( "%.4f\t", init[i] );
}
printf ( "\n" );
}
迭代调用功能
为了main函数里干净点,把功能函数统统放进func里
void func()
{
if(choice=="J")
Jacobi();
else if(choice=="GS")
GS();
else
SOR();
}
Jacobi迭代
首先确立迭代截止条件,就是迭代次数达到所设(或及误差满足条件,但我这里么有实现).然后在while里进行具体迭代.
形如:
[ 10 − 1 − 2 − 1 10 − 2 − 1 − 1 5 ] [ x 1 x 2 x 3 ] = [ 7.2 8.3 4.2 ] \left[ \begin{matrix} 10 & -1 & -2 \\ -1 & 10 & -2 \\ -1 & -1 & 5 \end{matrix} \right] \left[ \begin{matrix} x_1\\ x_2 \\ x_3 \end{matrix} \right] = \left[ \begin{matrix} 7.2\\ 8.3\\ 4.2 \end{matrix} \right] ⎣⎡10−1−1−110−1−2−25⎦⎤⎣⎡