1、线性方程组数值解法计算方法实验 题目: 班级: 学号: 姓名:1 实验目的1.通过编程加深对列主元高斯消去法、LU三角分解法和雅克比迭代法等求解多项式方程方法的理解2.观察上述三种方法的计算稳定性和求解精度并比较各种方法利弊2 实验步骤2.1环境配置: VS2013,C+控制台程序2.2添加头文件 #include stdio.h#include stdlib.h#include stdafx.h#include2.3主要模块 程序一共分成三层,最底层是数据结构部分,负责存储数据,第二层是交互部分,即多项式方程部分,负责输入输出获得数据,最上层是核心的算法部分,负责处理已获得的数据。具体功能如
2、下:数据结构部分数据结构部分是整个程序的最底层,负责存储部分。因数组作为数据元素插入和删除操作较少,而顺序表空间利用率大且查看方便,故此程序选用二维顺序表保存系数。数据结构文件中写的是有关其的所有基本操作以供其他文件调用。多项式方程部分多项式方程部分是程序的第二层,内容是有关方程组的所有函数、构建方程、输出方程等等,同时在此文件中获得方程系数并储存,同时此文件还负责显示菜单部分。算法部分此文件负责核心算法,处于整个程序最上层部分,负责列主元高斯消去法、LU三角分解法和雅克比迭代法的具体实现过程。通过调用方程文件的函数,将获得的数据进行处理运算,可以得到结果返回给方程主函数和输出的第二层。总结:
3、主函数负责获取方程系数并显示,算法和方程作为后台程序,顺序表作为存储手段。3 代码3.1主程序部分/ Solutionoflinearquations.cpp : 定义控制台应用程序的入口点。/#include stdio.h#include stdlib.h#include stdafx.h#include squencelist.h#include equation.h#include algorithm.h#includeint _tmain(int argc, _TCHAR* argv) while (Exflag) GetEquation(); ShowMenu(); return
4、0;3.2多项式方程部分方程部分头文件#ifndef _EQUATION_H#define _EQUATION_H#include stdio.h#include stdlib.h#include squencelist.hextern 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(voi
5、d);#endif方程部分CPP文件#include stdafx.h#include equation.h#include math.h#include algorithm.h#include stdio.h#include stdlib.h#include#include 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(); w
6、hile (flag) cout 方程未知量和解总个数: Xnumbers; cout 方程个数: Fnumber; cout 输入方程系数,输入00结束(如输入 2 1 5 或者2 1 5 3 4 1 00 endl; cout 3 4 1 00 ): x; while (x != 00) for (i = 1; i = Fnumber; i+) for (j = 1; j x; j = 1; printfunction(A); if (Xnumbers = Fnumber+1)flag = 0; else cout 方程可能无解 m = 0; A-n = 0; /显示交互/void Sho
7、wMenu(void) int x; cout 选择求解方程根的方法: endl; cout 1.列主元高斯消去法 endl; cout 2.三角分解法 endl; cout 3.迭代法 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 矩阵= e
8、ndl; for (i = 1; i m; i+) for (j = 1; j n; j+) cout setw(12)dataij; cout endl; /打印结果/void printresx(datacoa *A) int i; for (i = 1; i m; i+) cout X i = setw(12) dataiXnumbers+1; cout endl; /返回提示/void Tip(void) int flag; cout 输入000退出,其余返回: flag; if (flag = 000)Exflag = 0;3.3核心算法部分算法部分头文件#ifndef _ALGOR
9、ITHM_H#define _ALGORITHM_H#include stdio.h#include stdlib.h#include stdafx.hint 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 equati
10、on.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 /列主元高斯
11、消元法/ endl; int i, j, i2, flagc, k, j2; float temp, res; for (i = 1; i Fnumber; i+) flagc = i; for (i2 = i + 1; i2 datai2i)(fabs(A-dataflagci) flagc = i2; if (flagc != i) for (k = i; k dataik; A-dataik = A-dataflagck; A-dataflagck = temp; for (i2 = i + 1; i2 datai2i/A-dataii; for (j2 = i; j2 datai2j2
12、 = A-datai2j2 - temp*A-dataij2; for (i = Fnumber; i = 1; i-) for (j = Fnumber; j = i + 1; j-) A-dataiXnumbers = A-dataiXnumbers - A-dataij*A-datajXnumbers + 1; res = A-dataiXnumbers / A-dataii; Insert(A, res, i, Xnumbers+1); printresx(A);/直接三角分解法/void LUmethod(datacoa *A) datacoa *L, *U; int i, j, k
13、,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 data1j, 1, j); for (i = 2; i datai1 / A-data11, i, 1); for (k = 2; k = Fnumber; k+) for (j = k; j = Xnumbers; j+) for (q = 1; q dat
14、akq * U-dataqj; Insert(U, A-datakj - temp, k, j); temp = 0; for (i = k + 1; i = Fnumber; i+) for (q = 1; q dataiq * U-dataqk; temp = A-dataik - temp; Insert(L, temp / U-datakk, i, k); temp = 0; Insert(U, U-dataFnumberXnumbers / U-dataFnumberXnumbers - 1, Fnumber, Xnumbers + 1); for (k = Fnumber - 1;
15、 k = 1; k-) for (q = k + 1; q datakq * U-dataqXnumbers + 1; temp = U-datakXnumbers - temp; Insert(U, temp / U-datakk, 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 +
16、1); while (1) for (i = 1; i = Fnumber; i+) for (j = 1; j dataij * A-datajXnumbers + 1; temp = A-dataiXnumbers - temp; temp = temp / A-dataii; Insert(A, A-dataiXnumbers + 1, i, Xnumbers + 2); Insert(A, temp, i, Xnumbers + 1); temp = 0; k+; for (i = 1; i dataiXnumbers + 1 - A-dataiXnumbers + 2); if (t
17、emp 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#includeusing namespace std;#define maxsize 1024/*sequenlist*/typedef float datat
18、ype;typedef struct datatype datamaxsizemaxsize; 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 *In
19、itStruct() 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 表已满 n; k = j; k-) L-dataik + 1 = L-dataik; L-dat
20、aij = 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 (jL-n) cout 非法删除位置 endl; for (i = 1; i m; i+) for (k = j; k n; k+) L-dataij = L-dataij + 1; L-n-;void DeleteLine(datacoa*L, int i) int k,j; if (iL-m) cout 非法删除位置 endl; for (j = 1; j n; j+) for (k = i; k m;
21、k+) L-dataij = L-datai+1j; L-m-;4运行结果4.1列主元高斯消去法运行结果4.2LU三角分解法运行结果4.3雅克比迭代法运行结果边界情况调试超定方程等可能无解的情况迭代法迭代次数超出100次的情况5总结 这次的程序设计题看似简单实则临界代码区很多,调试时很容易出错。输入输出使用二维顺序表存储数据对于此题更加方便,也解决了C+/C语言数组下标从0 开始的不便,将下标转换成习惯下标。在迭代法的时候。将两次的x值分别存储在二维表后面,不需要另开空间,节省变量。列主元高斯消元法 1. 循环的顺序很重要2. 边界条件单独处理雅克比迭代法1.设置最大循环次数不能进入死循环。6参考资料计算方法与实习孙志忠等著 第五版-东南大学出版社软件技术基础周大为等著 第一版-西安电子科技大学出版社
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1