数值分析3.1 J迭代法&&GS迭代法
2015-05-08 20:43
274 查看
J迭代算法:
解向量我直接开了三维的数组,第三个分量表示第k次迭代的结果
可以开两个二维数组来相互赋值。
GS迭代算法:
其实实现起来比J迭代要舒服。
解向量我直接开了三维的数组,第三个分量表示第k次迭代的结果
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <math.h> using namespace std; typedef long long LL; const int MAXN = 501; double a[MAXN][MAXN];///系数矩阵 double b[MAXN],x[MAXN][MAXN];///右端项及解 int n,N;///n元方程组,最大迭代N次 double eps;///误差限 int main() { int ok,cur;///cur表示迭代结束所执行的最后一步 ///freopen("in.txt","r",stdin); while(scanf("%d%d%lf",&n,&N,&eps) != EOF){ ok = 0; for(int i = 0;i<n;i++){///输入系数矩阵 for(int j = 0;j<n;j++){ scanf("%lf",&a[i][j]); } } for(int i = 0;i<n;i++)scanf("%lf",&b[i]);///输入右端项 for(int i = 0;i<n;i++)scanf("%lf",&x[i][0]);///输入初始解向量 double maxs = 0; for(int k = 1;k<=N;k++){///最大循环步数 maxs = 0; for(int i = 0;i<n;i++){ x[i][k] = x[i][k-1]*a[i][i] + b[i]; for(int j = 0;j<n;j++){ x[i][k] -= x[j][k-1]*a[i][j]; } x[i][k] /= a[i][i]; if(maxs < fabs(x[i][k] - x[i][k-1]))maxs = fabs(x[i][k] - x[i][k-1]); } if(maxs < eps){ok = 1;cur = k;break;} } if(ok){ printf("solution :\n"); for(int i = 0;i<n;i++){ cout << x[i][cur] << endl; } } else cout << "failed" << endl; } return 0; }
可以开两个二维数组来相互赋值。
GS迭代算法:
其实实现起来比J迭代要舒服。
#include<iostream> #include<cmath> #include<fstream> #include<cstring> #include<algorithm> #include<queue> #define MAX(x,y) (((x)>(y))?(x):(y)) #define MIN(x,y) (((x)<(y))?(x):(y)) using namespace std; const int MAXN=10005; typedef long long LL; double a[MAXN][MAXN];///系数矩阵 double b[MAXN],x[MAXN];///右端项及解 int n,N;///n元方程组,最大迭代N次 double eps;///误差限 int main() { int ok,cur;///cur表示迭代结束所执行的最后一步 ///freopen("in.txt","r",stdin); while(scanf("%d%d%lf",&n,&N,&eps) != EOF){ ok = 0; for(int i = 0;i<n;i++){///输入系数矩阵 for(int j = 0;j<n;j++){ scanf("%lf",&a[i][j]); } } for(int i = 0;i<n;i++)scanf("%lf",&b[i]);///输入右端项 for(int i = 0;i<n;i++)scanf("%lf",&x[i]);///输入初始解向量 double maxs = 0,xx; for(int k = 1;k<=N;k++){///最大循环步数 maxs = 0; for(int i = 0;i<n;i++){ xx = x[i]; x[i] = b[i]; for(int j = 0;j<n;j++)if(i!=j){ x[i] -= x[j]*a[i][j]; } x[i] /= a[i][i]; if(maxs < fabs(x[i] - xx))maxs = fabs(x[i] - xx); } if(maxs < eps){ok = 1;cur = k;break;} } if(ok){ printf("solution :\n"); for(int i = 0;i<n;i++){ cout << x[i] << endl; } } else cout << "failed" << endl; } return 0; }
相关文章推荐
- 数值分析: 病态问题 & 算法稳定
- 【Unity&事件】事件监听响应的几种方法分析研究
- Predict Binding Sites of Transcription Factor && 富集分析
- 北航数值分析作业一
- undefined reference to "XX "的原因分析
- getopt_long(argc, argv, "", OPTIONS, NULL)分析
- GPIO驱动分析 & GPIO使用方法--S5PC110和S5PC210
- 数值分析-拉格朗日中值定理与积分中值定理
- x86 常见调用约定(cdecl,fastcall,stdcall) & x86和ARM调用约定的栈帧分析 & ARM ATPCS(ARM-THUMB procedure call standard)
- 【Todo】C++类 & 通用面试题分析记录 & 最难的bug
- <java API源码初体验>1---collection集合之ArrayList原理分析
- Spring3.1源码分析
- 【每日一题】 -1和1的数值比较
- POJ 1060 Post Office 分析&解题报告
- 风云CM - 算法分析 & genkey实现
- Launcher桌面点击&长按&拖动事件处理流程分析
- Android 开发之旅:深入分析布局文件&又是“Hello World!”
- 北航数值分析作业二
- mysqlsla 分析mysql慢查询日志
- 项目需求分析:使用 >> & 操作符实现混合匹配