当前位置:文档之家› 线性方程组数值解法

线性方程组数值解法

.计算法实验题目:班级:学号::目录计算法实验 (1)1 实验目的 (3)2 实验步骤 (3)2.1环境配置: (3)2.2添加头文件 (3)2.3主要模块 (3)3 代码 (3)3.1主程序部分 (3)3.2多项式程部分 (3)3.3核心算法部分 (3)3.4数据结构部分 (3)4运行结果 (3)4.1列主元高斯消去法运行结果 (3)4.2LU三角分解法运行结果 (3)4.3雅克比迭代法运行结果 (3)边界情况调试 (3)5总结 (3)输入输出 (3)列主元高斯消元法 (3)雅克比迭代法 (3)6参考资料 (3)1 实验目的1.通过编程加深对列主元高斯消去法、LU三角分解法和雅克比迭代法等求解多项式程法的理解2.观察上述三种法的计算稳定性和求解精度并比较各种法利弊2 实验步骤2.1环境配置:VS2013,C++控制台程序2.2添加头文件#include "stdio.h"#include "stdlib.h"#include "stdafx.h"#include<iostream>2.3主要模块程序一共分成三层,最底层是数据结构部分,负责存储数据,第二层是交互部分,即多项式程部分,负责输入输出获得数据,最上层是核心的算法部分,负责处理已获得的数据。

具体功能如下:●数据结构部分数据结构部分是整个程序的最底层,负责存储部分。

因数组作为数据元素插入和删除操作较少,而顺序表空间利用率大且查看便,故此程序选用二维顺序表保存系数。

数据结构文件中写的是有关其的所有基本操作以供其他文件调用。

●多项式程部分多项式程部分是程序的第二层,容是有关程组的所有函数、构建程、输出程等等,同时在此文件中获得程系数并储存,同时此文件还负责显示菜单部分。

算法部分此文件负责核心算法,处于整个程序最上层部分,负责列主元高斯消去法、LU三角分解法和雅克比迭代法的具体实现过程。

通过调用程文件的函数,将获得的数据进行处理运算,可以得到结果返回给程主函数和输出的第二层。

总结:主函数负责获取程系数并显示,算法和程作为后台程序,顺序表作为存储手段。

3 代码3.1主程序部分// Solutionoflinearquations.cpp : 定义控制台应用程序的入口点。

//#include "stdio.h"#include "stdlib.h"#include "stdafx.h"#include "squencelist.h"#include "equation.h"#include "algorithm.h"#include<iostream>int _tmain(int argc, _TCHAR* argv[])while (Exflag){GetEquation();ShowMenu();}return 0;}3.2多项式程部分 程部分头文件#ifndef _EQUATION_H #define _EQUATION_H#include "stdio.h"#include "stdlib.h"#include "squencelist.h"extern int Xnumbers; extern int Fnumber; extern int Exflag; extern datacoa *A;void GetEquation(void);void ShowMenu(void);void printfunction(datacoa *A); void printresx(datacoa *A); void Tip(void);#endif程部分CPP文件#include "stdafx.h"#include "equation.h"#include "math.h"#include "algorithm.h"#include "stdio.h"#include "stdlib.h"#include<iostream>#include <iomanip>using namespace std;//全局变量int Xnumbers = 0;int Fnumber = 0;int Exflag = 1;datacoa *A;////////////////////////多项式函数系数/////////////////////////void GetEquation(void){int i, j,flag=1;float x;A = InitStruct();while (flag){cout << "程未知量和解总个数:" << endl;cin >> Xnumbers;cout << "程个数:" << endl;cin >> Fnumber;cout << "输入程系数,输入00结束(如输入2 1 5 或者2 1 5 3 4 1 00 " << endl;cout << " 3 4 1 00 ):" << endl;cin >> x;while (x != 00){for (i = 1; i <= Fnumber; i++){for (j = 1; j <= Xnumbers; j++){if (!Insert(A, x, i, j))exit(0);cin >> x;}}}j = 1;printfunction(A);if (Xnumbers == Fnumber+1)flag = 0;else{cout << "程可能无解" << endl;A->m = 0;A->n = 0;}}}//////////////////////////显示交互/////////////////////////////void ShowMenu(void){int x;cout << "选择求解程根的法:" << endl;cout << "1.列主元高斯消去法" << endl;cout << "2.三角分解法" << endl;cout << "3.迭代法" << endl;cin >> x;switch (x){case 1:ColumnGaussmethod(A);Tip();break;case 2:LUmethod(A);Tip();break;case 3:ISODATAmethod(A);Tip();break;default:break;}}////////////////////////打印输出函数/////////////////////////// void printfunction(datacoa *A){int i,j;cout << "矩阵=" << endl;for (i = 1; i <= A->m; i++){for (j = 1; j <= A->n; j++){cout <<setw(12)<< A->data[i][j];}cout << endl;}}////////////////////////打印结果/////////////////////////// void printresx(datacoa *A){int i;for (i = 1; i <= A->m; i++){cout << "X" << i << "=" << setw(12) << A->data[i][Xnumbers+1];cout << endl;}}////////////////////////返回提示///////////////////////////void Tip(void){int flag;cout << "输入000退出,其余返回:" << endl;cin >> flag;if (flag == 000)Exflag = 0;}3.3核心算法部分算法部分头文件#ifndef _ALGORITHM_H#define _ALGORITHM_H#include "stdio.h"#include "stdlib.h"#include "stdafx.h"int Judge(double x1, double x0, double e); void ColumnGaussmethod(datacoa *A); void LUmethod(datacoa *A);void ISODATAmethod(datacoa *A);#endif算法部分CPP文件#include "algorithm.h"#include "stdafx.h"#include "squencelist.h"#include "equation.h"#define max 100//////////////////////////误差判别////////////////////////////inline int Judge(double x1, double x0, double e){if (e == 0)return 0;if (x1 == 0){if (fabs(x0) < e)return 1;else return 0;}if (x0 == 0){if (fabs(x1) < e)return 1;else return 0;}if (fabs(x1 - x0) < e)return 1;else return 0;}//////////////////////////列主元高斯消元法//////////////////////////// void ColumnGaussmethod(datacoa *A){cout << "///////////////////列主元高斯消元法///////////////////" << endl; int i, j, i2, flagc, k, j2;float temp, res;for (i = 1; i < Fnumber; i++){flagc = i;for (i2 = i + 1; i2 <= Fnumber; i2++)if ((fabs(A->data[i2][i]))>(fabs(A->data[flagc][i])))flagc = i2;if (flagc != i)for (k = i; k <= Xnumbers; k++){temp = A->data[i][k];A->data[i][k] = A->data[flagc][k];A->data[flagc][k] = temp;}for (i2 = i + 1; i2 <= Fnumber; i2++){temp = A->data[i2][i]/A->data[i][i];for (j2 = i; j2 <= Xnumbers; j2++)A->data[i2][j2] = A->data[i2][j2] - temp*A->data[i][j2];}}for (i = Fnumber; i >= 1; i--){for (j = Fnumber; j >= i + 1; j--)A->data[i][Xnumbers] = A->data[i][Xnumbers] - A->data[i][j]*A->data[j][Xnumbers + 1];res = A->data[i][Xnumbers] / A->data[i][i];Insert(A, res, i, Xnumbers+1);}printresx(A);}//////////////////////////直接三角分解法////////////////////////////void LUmethod(datacoa *A){datacoa *L, *U;int i, j, k,q;float temp=0.0;L = InitStruct();U = InitStruct();for (i = 1; i <= Fnumber; i++){for (j = 1; j <= Xnumbers; j++){Insert(L, 0, i, j);Insert(U, 0, i, j);}}for (j = 1; j <= Xnumbers; j++)Insert(U, A->data[1][j], 1, j);for (i = 2; i <= Fnumber; i++)Insert(L, A->data[i][1] / A->data[1][1], i, 1);for (k = 2; k <= Fnumber; k++){for (j = k; j <= Xnumbers; j++){for (q = 1; q < k; q++)temp = temp + L->data[k][q] * U->data[q][j];Insert(U, A->data[k][j] - temp, k, j);temp = 0;}for (i = k + 1; i <= Fnumber; i++){for (q = 1; q < k; q++)temp = temp + L->data[i][q] * U->data[q][k];temp = A->data[i][k] - temp;Insert(L, temp / U->data[k][k], i, k);temp = 0;}}Insert(U, U->data[Fnumber][Xnumbers] / U->data[Fnumber][Xnumbers - 1], Fnumber, Xnumbers + 1);for (k = Fnumber - 1; k >= 1; k--){for (q = k + 1; q < Xnumbers; q++)temp = temp + U->data[k][q] * U->data[q][Xnumbers + 1];temp = U->data[k][Xnumbers] - temp;Insert(U, temp / U->data[k][k], k, Xnumbers + 1);temp = 0;}printresx(U);}//////////////////////////迭代法////////////////////////////void ISODATAmethod(datacoa *A){int i=1, j, k=0;float x0 = 0, x1 = 1, temp = 0;for (i = 1; i <= Fnumber; i++)Insert(A, 0, i, Xnumbers + 1);while (1){for (i = 1; i <= Fnumber; i++){for (j = 1; j <= Fnumber; j++){if (j == i)continue;temp = temp + A->data[i][j] * A->data[j][Xnumbers + 1];}temp = A->data[i][Xnumbers] - temp;temp = temp / A->data[i][i];Insert(A, A->data[i][Xnumbers + 1], i, Xnumbers + 2);Insert(A, temp, i, Xnumbers + 1);temp = 0;}k++;for (i = 1; i <= Fnumber; i++)temp = temp + fabs(A->data[i][Xnumbers + 1] - A->data[i][Xnumbers + 2]);if ((temp < 0.000001) || k > max)break;temp = 0;}DeleteLie(A, Xnumbers + 2);printfunction(A);cout << endl;printresx(A);cout << k << endl;}3.4数据结构部分数据结构头文件#ifndef _SQUENCELIST_H#define _SQUENCELIST_H#include "stdio.h"#include "stdlib.h"#include "stdafx.h"#include<iostream>using namespace std;#define maxsize 1024/***sequenlist*/typedef float datatype;typedef struct{datatype data[maxsize][maxsize];int m, n;}datacoa;datacoa *InitStruct();int Length(datacoa*);int Insert(datacoa*, datatype, int ,int);void DeleteLie(datacoa*L, int j);void DeleteLine(datacoa*L, int i);#endif数据结构CPP文件#include "stdafx.h"#include "squencelist.h"///////////////////////////////////数据结构部分//////////////////////////////////////////////////////////////////////////////sequenlist/////////////////////////////////////////// datacoa *InitStruct(){datacoa*L = (datacoa*)malloc(sizeof(datacoa));L->m = 0;L->n = 0;return L;// datacoa*L = new datacoa;}int Length(datacoa*L){return L->m*L->n;}int Insert(datacoa*L, datatype x, int i,int j){int k;if ((L->m >= maxsize - 1) || (L->n >= maxsize - 1)) {cout << "表已满" << endl;return 0;}for (k = L->n; k >= j; k--)L->data[i][k + 1] = L->data[i][k];L->data[i][j] = x;if (i > L->m)L->m++;if (j > L->n)L->n++;return 1;}void DeleteLie(datacoa*L,int j){int k,i;if ((j<1) || (j>L->n)){cout << "非法删除位置" << endl;}for (i = 1; i <= L->m; i++){for (k = j; k <= L->n; k++)L->data[i][j] = L->data[i][j + 1];}L->n--;}void DeleteLine(datacoa*L, int i){int k,j;if ((i<1) || (i>L->m)){cout << "非法删除位置" << endl;}for (j = 1; j <= L->n; j++){for (k = i; k <= L->m; k++)L->data[i][j] = L->data[i+1][j];}L->m--;}4运行结果4.1列主元高斯消去法运行结果4.2LU三角分解法运行结果4.3雅克比迭代法运行结果边界情况调试超定程等可能无解的情况迭代法迭代次数超出100次的情况5总结这次的程序设计题看似简单实则临界代码区很多,调试时很容易出错。

相关主题