ImageVerifierCode 换一换
格式:DOCX , 页数:19 ,大小:127.32KB ,
资源ID:7702295      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/7702295.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(线性方程组数值解法.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

线性方程组数值解法.docx

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