线性方程组数值解法_第1页
线性方程组数值解法_第2页
线性方程组数值解法_第3页
线性方程组数值解法_第4页
线性方程组数值解法_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、计算方法实验题目:班级:学号:目录计算方法实验仁1实验目的3.2实验步骤3.2.1环境配置:3.2.2添加头文件3.2.3主要模块3.3代码4.3.1主程序部分4.3.2多项式方程部分4.3.3核心算法部分8.3.4数据结构部分1.24运行结果144.1列主元高斯消去法运行结果 144.2LU三角分解法运行结果 154.3雅克比迭代法运行结果 16边界情况调试165总结1.8输入输出18列主元高斯消元法1.8雅克比迭代法186参考资料181实验目的1. 通过编程加深对列主元高斯消去法、LU三角分解法和雅克比迭代法等求解多 项式方程方法的理解2. 观察上述三种方法的计算稳定性和求解精度并比较各种

2、方法利弊2实验步骤2.1环境配置:VS2013, C+控制台程序2.2添加头文件#i nclude "stdio.h"#i nclude "stdlib.h"#include "stdafx.h"#in clude<iostream>2.3主要模块程序一共分成三层,最底层是数据结构部分,负责存储数据,第二层是交互 部分,即多项式方程部分,负责输入输出获得数据,最上层是核心的算法部分, 负责处理已获得的数据。具体功能如下:数据结构部分数据结构部分是整个程序的最底层,负责存储部分。因数组作为数据元素插 入和删除操作较少,而顺序

3、表空间利用率大且查看方便,故此程序选用二维 顺序表保存系数。数据结构文件中写的是有关其的所有基本操作以供其他文 件调用。多项式方程部分多项式方程部分是程序的第二层,容是有关方程组的所有函数、构建方程、 输出方程等等,同时在此文件中获得方程系数并储存,同时此文件还负责显 示菜单部分。算法部分此文件负责核心算法,处于整个程序最上层部分,负责列主元高斯消去法、LU三角分解法和雅克比迭代法的具体实现过程。 通过调用方程文件的函数, 将获得的数据进行处理运算,可以得到结果返回给方程主函数和输出的第二总结:主函数负责获取方程系数并显示,算法和方程作为后台程序,顺序表 作为存储手段。3代码3.1主程序部分/

4、 Solutionoflinearquations.cpp :定义控制台应用程序的入口点。/#include "stdio.h"#i nclude "stdlib.h"#include "stdafx.h"#i nclude "sque ncelist.h"#i nclude "equati on .h"#in clude "algorithm.h"#in clude<iostream>int _tmain(int argc, _TCHAR* argv)while

5、 (Exflag)GetEquatio n(); ShowMe nu();return 0;3.2多项式方程部分方程部分头文件#ifndef _EQUATION_H#defi ne _EQUATION_H #include "stdio.h"#i nclude "stdlib.h" #in clude "sque ncelist.h" extern int Xnumbers; extern int Fnumber; extern int Exflag;extern datacoa *A;void GetEquation(void);v

6、oid 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<iostr

7、eam>#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 << &

8、quot;方程个数: " << endl;cin >> Fnumber;cout << "输入方程系数 ,输入00结束(如输入 2 1 5 或者2 1 5 3 4 1 00 "<< endl;cout << "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)ex

9、it(0); cin >> x;j = 1;printfunction(A);if (Xnumbers = Fnumber+1)flag = 0;elsecout << "方程可能无解 " << endl;A->m = 0;A->n = 0;/ 显示交互 / void ShowMenu(void)int x;cout << "选择求解方程根的方法: " << endl;cout << "1.列主元高斯消去法 " << endl;cout &

10、lt;< "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 << &

11、quot;矩阵=" << endl;for (i = 1; i <= A->m; i+)for (j = 1; j <= A->n; j+)cout <<setw(12)<< A->dataij;cout << endl;/ 打印结果 /void printresx(datacoa *A)int i;for (i = 1; i <= A->m; i+)cout << "X" << i << "=" << se

12、tw(12) << A->dataiXnumbers+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

13、.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 "

14、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(d

15、atacoa *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->datai2i)>(fabs(A->dataflagci) flagc = i2;if (flagc != i)for (k = i; k <= Xnumbers; k+)temp

16、= A->dataik;A->dataik = A->dataflagck; A->dataflagck = temp;for (i2 = i + 1; i2 <= Fnumber; i2+)temp = A->datai2i/A->dataii;for (j2 = i; j2 <= Xnumbers; j2+) A->datai2j2 = A->datai2j2 - temp*A->dataij2;for (i = Fnumber; i >= 1; i-)for (j = Fnumber; j >= i + 1;

17、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,q;float temp=0.0;L = InitStruct();U = InitStruct();for (i = 1; i <

18、;= 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->data1j, 1, j);for (i = 2; i <= Fnumber; i+)Insert(L, A->datai1 / A->data11, i, 1);for (k = 2; k <= Fnumber; k+)for (j = k; j <= Xnumbers; j+)for (q =

19、1; q < k; q+)temp = temp + L->datakq * U->dataqj;Insert(U, A->datakj - temp, k, j);temp = 0;for (i = k + 1; i <= Fnumber; i+)for (q = 1; q < k; q+)temp = temp + L->dataiq * U->dataqk;temp = A->dataik - temp;Insert(L, temp / U->datakk, i, k);temp = 0;Insert(U, U->data

20、FnumberXnumbers / U->dataFnumberXnumbers - 1, Fnumber, Xnumbers + 1);for (k = Fnumber - 1; k >= 1; k-)for (q = k + 1; q < Xnumbers; q+)temp = temp + U->datakq * U->dataqXnumbers + 1;temp = U->datakXnumbers - temp;Insert(U, temp / U->datakk, k, Xnumbers + 1); temp = 0; printresx(

21、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->dataij * A->datajXnumbers + 1;temp =

22、 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 <= Fnumber; i+)temp = temp + fabs(A->dataiXnumbers + 1 - A->dataiXnumbers 2);if (temp < 0.000001) | k > max)break;temp

23、 = 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 namesp

24、ace std;#define maxsize 1024*sequenlist*/ typedef float datatype;typedef structdatatype 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文件#includ

25、e "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

26、(L->m >= maxsize - 1) | (L->n >= maxsize - 1)cout << "表已满 " << endl;return 0;for (k = L->n; k >= j; k-)L->dataik + 1 = L->dataik;L->dataij = 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 (

27、j<1) | (j>L->n)cout << "非法删除位置 " << endl;for (i = 1; i <= L->m; i+)for (k = j; k <= L->n; k+)L->dataij = L->dataij + 1; L->n-; void DeleteL in e(datacoa*L, int i)int k,j;if (i<1) II (i>L->m)cout << "非法删除位置"<< endl;for (j = 1; j <= L->n; j+)for (k = i; k <= L->m; k+) L->dataij = L->datai+1j;L->m-;4运行结果4.1列主元高斯消去法运行结果5H匸:vi nd owssyste m32c md .e<e谕入方程系数输入。醛束(如输入2 1 S3 4 1或者Z 15 3 4L7?:L.93 :

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论