南京邮电大学 数值代数实验

合集下载

南邮数据结构实验一

南邮数据结构实验一

实验报告(2014 / 2015 学年第一学期)课程名称数据结构实验名称二叉树基本操作以及哈夫曼编码译码系统实验时间年月日指导单位指导教师学生姓名班级学号学院(系) 专业二叉树的基本运算:一、问题描述1.设计递归算法,实现二叉树的运算:删除一棵二叉树,求一棵二叉树的高度,求一棵二叉树中叶子节点数,复制一棵二叉树,交换一棵二叉树的左右子树2.设计算法,自上而下,自左向右即按层次遍历一棵二叉树3.设计main函数,测试上述每个运算二、系统分析和概要设计首先用maketree构造一棵二叉树,然后遍历二叉树,然后交换每个结点的左右子树,接着算出输得高度和叶子节点,最后删除。

三、详细设计2. 核心算法建立二叉树的void MakeTree(const T& x,BinaryTree<T>& left,BinaryTree<T>& right)和计算叶子节点的int Size();3. 算法分析删除一棵二叉树,求一棵二叉树的高度,求一棵二叉树中叶子节点数,复制一棵二叉树等都是用递归的方法实现。

四、程序代码流程图#include<iostream.h>template<class T>struct BTNode{BTNode(){lChild=rChild=NULL;}BTNode(const T &x){element=x;lChild=rChild=NULL;}BTNode(const T &x,BTNode<T>* l,BTNode<T>* r){element=x;lChild=l;rChild=r;}T element;BTNode<T>* lChild,* rChild;};template<class T>class BinaryTree{public:BinaryTree(){root=NULL;}~BinaryTree(){Clear();}void Copy(BinaryTree<T> &r) const;bool IsEmpty()const{return root == NULL;}void Clear();void Exchange();bool Root(T& x)const;int GetHeight();void MakeTree(const T& x,BinaryTree<T>& left,BinaryTree<T>& right);void BreakTree(T& x,BinaryTree<T>& left,BinaryTree<T>& right);void PreOrder(void (*Visit)(T &x));void LevelOrder(void (*Visit)(T& x));int Size();BinaryTree<T>(BinaryTree<T> &t)root=Copy(t.root);}// void InOrder(void (*Visit)(T &x));// void PostOrder(void (*Visit)(T &x));BTNode<T>* Copy(BTNode<T>* t);protected:BTNode<T> * root;private:static int number;void Clear(BTNode<T>* &t);void Exchange(BTNode<T>* t);int GetHeight(BTNode<T>* t);int Size(BTNode<T>* t);void PreOrder(void (*Visit)(T &x),BTNode<T>* t);void LevelOrder(void (*Visit)(T& x),BTNode<T>* t); // void InOrder(void (*Visit)(T &x),BTNode<T>* t);// void PostOrder(void (*Visit)(T &x),BTNode<T>* t); };template <class T>bool BinaryTree<T>::Root(T &x)const{if(root){x=root->element;return true;}elsereturn false;}template <class T>void BinaryTree<T>::Clear(){Clear(root);}template <class T>void BinaryTree<T>::Clear(BTNode<T>* &t){if(t)Clear(t->lChild);Clear(t->rChild);delete t;t=NULL;}}template <class T>void BinaryTree<T>::MakeTree(const T& x,BinaryTree<T>& left,BinaryTree<T>& right) {if(root||&left==&right)return;root=new BTNode <T>(x,left.root,right.root);left.root=right.root=NULL;}template <class T>void BinaryTree<T>::BreakTree(T& x,BinaryTree<T>& left,BinaryTree<T>& right) {if(!root||&left==&right||left.root||right.root)return;x=root->element;left.root=root->lChild;right.root=root->rChild;delete root;root=NULL;}template <class T>BTNode<T>* BinaryTree<T>::Copy(BTNode<T>* t){if(!t)return NULL;BTNode<T>*q=new BTNode<T>(t->element);q->lChild=Copy(t->lChild);q->rChild=Copy(t->rChild);return q;}template <class T>void Visit(T &x){cout<<x<<" ";}template <class T>void BinaryTree<T>::PreOrder(void (*Visit)(T& x)){PreOrder(Visit,root);}template <class T>void BinaryTree<T>::PreOrder(void (*Visit)(T& x),BTNode<T>* t) {if(t){Visit(t->element);PreOrder(Visit,t->lChild);PreOrder(Visit,t->rChild);}}template <class T>void BinaryTree<T>::Exchange(){Exchange(root);}template <class T>void BinaryTree<T>::Exchange(BTNode<T>* t){if(!t)return;BTNode<T>* temp;temp=t->lChild;t->lChild=t->rChild;t->rChild=temp;Exchange(t->lChild);Exchange(t->rChild);}template <class T>int BinaryTree<T>::GetHeight(){return GetHeight(root);}int BinaryTree<T>::GetHeight(BTNode<T>* t){int templ;int tempr;if(!t)return 0;templ=GetHeight(t->lChild);tempr=GetHeight(t->rChild);if(templ++>tempr++)return templ;elsereturn tempr;}template <class T>int BinaryTree<T>::number=0;template <class T>int BinaryTree<T>::Size(){Size(root);return number;}template <class T>int BinaryTree<T>::Size(BTNode<T>* t){if(t!=NULL){Size(t->lChild);if(t->lChild ==NULL&&t->rChild ==NULL)number++;Size(t->rChild);}return number;}template <class T>void BinaryTree<T>::LevelOrder(void (*Visit)(T& x)) {PreOrder(Visit,root);}void BinaryTree<T>::LevelOrder(void (*Visit)(T& x),BTNode<T>* t) {BTNode *quene[50],*p;int pre=1,rear=1;quene[++pre]=t;while(pre!=0){p=quene[++rear];cout<<p->element<<" ";if(p->lChild !=NULL)quene[++pre]=p->rChild ;if(p->rChild !=NULL)quene[++pre]=p->lChild ;}}void main(){BinaryTree <char> a,b,x,y,z;y.MakeTree('E',a,b);z.MakeTree('F',a,b);x.MakeTree('C',y,z);y.MakeTree('D',a,b);z.MakeTree('B',y,x);cout<<"二叉树z的先序遍历:"<<endl;z.PreOrder(Visit);cout<<endl;cout<<"层次遍历二叉树:";z.LevelOrder(Visit);cout<<endl;BinaryTree<char> q(z);cout<<"复制的二叉树q的先序遍历:"<<endl;q.PreOrder(Visit);cout<<endl;cout<<"树的高度:";cout<<z.GetHeight()<<endl;cout<<"叶子节点数量:";cout<<z.Size()<<endl;z.Exchange();cout<<"二叉树左右子树交换后的先序遍历:"<<endl;z.PreOrder(Visit);cout<<endl;}五、测试用例和运行结果测试用例如main函数中所示,结果如下图所示。

资料:数学实验(南邮)答案2

资料:数学实验(南邮)答案2

第二次题库1、 设⎪⎩⎪⎨⎧=+=+32/)7(11x x x x n n n ,数列}{n x 是否收敛?若收敛,其值为多少?精确到6位有效数字。

>> f=inline('(x+7/x)/2'); syms x; x0=3; for i=1:1:20 x0=f(x0);fprintf('%g,%g\n',i,x0); end 1,2.66667 2,2.64583 3,2.64575 4,2.64575 5,2.64575 6,2.64575 7,2.64575 8,2.64575 9,2.64575 10,2.64575 11,2.64575 12,2.64575 13,2.64575 14,2.64575 15,2.64575 16,2.64575 17,2.64575 18,2.64575 19,2.64575 20,2.64575本次计算运行到第三次结果稳定,可得: 数列}{n x 收敛,收敛到2.645752、 设 ,131211pp p n n x ++++= }{n x 是否收敛?若收敛,其值为多少?精确到17位有效数字。

学号为单号,取7=p >> s=0; for i=1:1:200 s=s+1/i^7;fprintf('%g,%20.17f\n',i,s); end1, 1.00000000000000000 2, 1.00781250000000000 3, 1.00826974737082750 4, 1.00833078252707750 5, 1.00834358252707750 6, 1.00834715477216210 7, 1.00834836903784100 8, 1.00834884587499920 9, 1.00834905495015730 10, 1.00834915495015730 …………………………… 181, 1.00834927738191870 182, 1.00834927738191890 183, 1.00834927738191920 184, 1.00834927738191940 185, 1.00834927738191960 186, 1.00834927738191980 187, 1.00834927738192000 188, 1.00834927738192030 189, 1.00834927738192050190, 1.00834927738192070 191, 1.00834927738192070 192, 1.00834927738192070 193, 1.00834927738192070 194, 1.00834927738192070 195, 1.00834927738192070 196, 1.00834927738192070 197, 1.00834927738192070 198, 1.00834927738192070 199, 1.00834927738192070 200, 1.00834927738192070运行至第190次后稳定,值为1.00834927738192070书上题库:(实验四) 1,2,4,7(1),8,12(改为:对例2,取 120,55,25,5.4=a 观察图形有什么变化.),13,14 。

南邮数据结构上机实验一线性表的基本运算和多项式的基本运算资料

南邮数据结构上机实验一线性表的基本运算和多项式的基本运算资料

实验报告(2015 / 2016学年第二学期)课程名称数据结构A实验名称线性表的基本运算和多项式的基本运算实验时间2016 年 3 月10 日指导单位计算机科学与技术系指导教师骆健学生姓名班级学号学院(系) 管理学院专业信息管理与信息系统实习题名:线性表的基本运算班级姓名学号日期2016.03.10一、问题描述深入理解线性表数据结构,熟练掌握顺序表的各种基本操作。

在顺序表类SeqList 中增加成员函数void Reverse(),实现顺序表的逆置;在顺序表类SeqList中增加成员函数bool DeleteX(const T &x),删除表中所有元素值等于x元素。

若表中存在这样的元素,则删除之,且函数返回true,否则函数返回false。

二、概要设计文件Inverse.cpp中定义了Linearlist类, SeqList类继承Linearlist类。

在顺序表类SeqList中通过函数void Reverse()实现顺序表的逆置,通过函数boolDeleteX(const T &x),删除表中所有元素值等于x元素。

三、详细设计1.类和类的层次设计程序使用了两个类, 线性表Linearlist类和顺序表SeqList类和一个主函数mian。

Linearlist类里包括常见的线性表运算,在类SeqList里面新增成员函数void Reverse()和bool DeleteX(const T &x)。

TLinearlist#int n+virtual bool IsEmpty() const = 0;+virtual int Length() const = 0;+virtual bool Find(int i,T& x) const = 0;+virtual int Search(T x) const = 0;+virtual bool Insert(int i,T x) = 0;+virtual bool Delete(int i) = 0;+virtual bool Update(int i,T x) = 0;+virtual void Output(ostream& out) const = 0;TSeqList-int maxLength;-T *elements;+IsEmpty() const;+Length() const;+Find(int i,T& x) const;+Search(T x) const;+Insert(int i,T x);+Delete(int i);+Update(int i,T x);+Output(ostream& out) const;+Reverse();+DeleteX(const T& x);2.核心算法顺序表SeqList类中,私有段封装了两个私有数据成员maxLength和elements,公有段封装了构造、析构、查找、删除、逆置等函数。

南邮电工电子实验复习与试卷

南邮电工电子实验复习与试卷

蒆南京邮电大学电工电子实验复习资料与试卷薃一、实验操作莄1、信号与系统操作实验请复习所做的实验。

膂主要掌握的要点:葿①由所给的电路转换出该电路的电压传输函数H(s)=V2(s)/V1(s),并能把传输函数化成Multisim所需的标准形式:薃(A)算子S在分子的幂次不高于分母的幂次。

薁(B)因需用积分器仿真,算子S应化成1/S。

蚀(C)分母的常数项化成1。

芈②能画出完整的系统模拟框图。

蚃③运用Multisim的模拟器件库中的积分器、比例放大器、加法器等模块组构系统模拟电路。

应遵循以下几个原则:羂(1)系统模拟电路输入端必用加法器模块对输入信号和反馈信号求和,加法器输出送积分器模块莁(2)根据S的最高幂次n,取出n个积分器模块串接。

羆(3)算子S的系数使用比例放大器模块肇(4)传输函数H(S)的分子是输出项,分子中各项比例放大器模块的输出用加法器求和后成为系统输出。

分母是负反馈项,其系数正、负异号后送输入端加法器。

莂(5)分母中为1的常数项不用任何运算模块蝿例如1:聿画出幅频和相频图膇例如2:螃画出幅频和相频图薁2、操作题如下图所示,写出该图的传输函数H(S)(V1是输入信号、V2是输出信号)。

画出题中电路对应的系统模拟框图。

(20分)螈写出传输函数H(S)(10分)芇画出题中电路对应的系统模拟框图(10?分)膄在Multisim2001环境中,测试该系统模拟电路的幅频特性相关参数。

(10分)(需包含半功率点与谐振频率点)罿频率点薇3.147KHz 芇3.715KHz芁4.474KHz蚁电压比莆0.707 莆0.9999 蚂0.707腿根据测试数据作出该电路的幅频特性曲线图。

(10分)荿有波形5分,每个参数1分.蒆3、D/A转换器操作实验请复习所做的实验。

肃掌握的要点:袁①根据输出电压选定数字输入端。

膈设计由DAC0832完成。

根据实验课题的要求输出正负斜率锯齿波上升或下降的台阶数大于或等于16个台阶,可用4位二进制数,根据输出电压选定数字输入端。

南邮数据结构实验三

南邮数据结构实验三

南邮数据结构实验三南京邮电大学数据结构实验三、链表的基本操作实验目的本次实验的主要目的是理解链表的概念,掌握链表的基本操作,包括链表的创建、插入、删除和遍历。

实验内容本次实验分为以下几个部分:1、链表的定义与创建1.1 链表的概念链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

链表可以分为单链表、双链表和循环链表等不同类型。

本次实验将创建一个单链表。

1.2 链表节点的定义链表节点包含两个成员变量,分别是数据域和指针域。

数据域用于存储节点的数据,指针域指向下一个节点。

1.3 链表的创建在主函数中创建一个空链表,并添加一些初始数据,用于后续的操作。

2、链表的插入操作2.1 插入节点的位置链表的插入操作需要指定节点插入的位置,可以在链表的头部、尾部或者中间插入新节点。

2.2 插入节点的操作根据所选位置,在链表中插入新节点,并更新相应的指针。

3、链表的删除操作3.1 删除节点的位置链表的删除操作需要指定节点删除的位置,可以删除头节点、尾节点或者中间节点。

3.2 删除节点的操作根据所选位置,删除链表中的节点,并更新相应的指针。

4、链表的遍历操作通过循环遍历链表的所有节点,并输出每个节点的数据。

附件说明本文档涉及以下附件:附件1:源代码附件2:实验报告法律名词及注释本文所涉及的法律名词及注释如下:1、数据结构:数据的存储方式和操作组成的集合。

在计算机科学中,数据结构是计算机中存储、组织数据的方式。

2、链表:链表是一种常见的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。

3、节点:链表中的一个元素,包含数据域和指针域。

4、数据域:节点中存储的数据。

5、指针域:节点中指向下一个节点的指针。

6、插入操作:在链表中插入一个新节点。

7、删除操作:从链表中删除一个节点。

8、遍历操作:按照一定的顺序访问链表中的所有节点。

全文结束。

南邮数学实验

南邮数学实验

第一次练习题1.求解下列各题:1)30sin lim x mx mx x ->->> limit((1834*x-sin(1834*x))/(x^3)) ans =3084380852/32)(10)cos ,1000.0xmx y e y =求>> diff(exp(x)*cos(1834*x/1000.0),10) ans =-4262767519435573449/9765625000000000*exp(x)*cos(917/500*x)+2969869727171403/1953125000000*exp(x)*sin(917/500*x)3)4224x dx m x+⎰ int(x^4/(1834^2+4*x^2),x) ans =1/12*x^3-840889/4*x+771095213/4*atan(1/917*x)40x =展开(最高次幂为8). >> taylor(sqrt(1834/1000.0+x),9,x) ans =1/50*4585^(1/2)+5/917*4585^(1/2)*x-625/840889*4585^(1/2)*x^2+156250/771095213*4585^(1/2)*x^3-48828125/7*4585^(1/2)*x^4+2441406250/92629354652051*4585^(1/2)*x^5-9/849411*4585^(1/2)*x^6+25177/5452373373*4585^(1/2)*x^7-10228125/499982363688330647123041*4585^(1/2)*x^82.求矩阵21102041A m -⎛⎫ ⎪= ⎪ ⎪-⎝⎭的逆矩阵1-A 及特征值和特征向量。

逆矩阵:>> A=[-2,1,1;0,2,0;-4,1,1834];inv(A) ans =-0.5005 0.2501 0.0003 0 0.5000 0 -0.0011 0.0003 0.0005 特征值:>> A=[-2,1,1;0,2,0;-4,1,1834];eig(A) ans =1.0e+003 * -0.0020 1.8340 0.0020 特征向量:>> A=[-2,1,1;0,2,0;-4,1,1834];[P,D]=eig(A) P =-1.0000 -0.0005 0.24250 0 0.9701 -0.0022 -1.0000 0.0000 D =1.0e+003 *-0.0020 0 0 0 1.8340 0 0 0 0.00203.已知221(),()2f x ex μσ=--分别在下列条件下画出)(x f 的图形: /600m σ=,μ分别为0,1,1-(在同一坐标系上作图);>> x=-2:1/50:2;y1=1/(sqrt(2*pi)*1834/600)*exp(-x.^2/(2*(1834/600)^2)); y2=1/sqrt(2*pi)*1834/600*exp(-(x+1).^2/(2*(1834/600)^2)); y3=1/sqrt(2*pi)*1834/600*exp(-(x-1).^2/(2*(1834/600)^2)); plot(x,y1,x,y2,x,y3)-6-4-20240.020.040.060.080.10.120.14xu=-1/u=1/u=04.画 (1)sin 020cos 02100x u t t y u t u t z m ⎧⎪=≤≤⎪=⎨≤≤⎪⎪=⎩>>t=0:pi/1000:20;u=0:pi/10000:2; x=u.*sin(t); y=u.*cos(t); z=100.*t/1834;plot3(x,y,z)(2)sin()03,03 z mxy x y=≤≤≤≤>>ezmesh('sin(1834*x*y)',[0,3],[0,3])(3)sin()(/100cos)02 cos()(/100cos)02 sinx t m uty t m uuz uππ=+⎧≤≤⎪=+⎨≤≤⎪=⎩>>[t,u]=meshgrid(0:.01*pi:2*pi,0:.01*pi:2*pi); x=sin(t).*(1834./100+cos(u));y=cos(t).*(1834./100+cos(u));z=sin(u);surf(x,y,z)5.对于方程50.10200mx x--=,先画出左边的函数在合适的区间上的图形,借助于软件中的方程求根的命令求出所有的实根,找出函数的单调区间,结合高等数学的知识说明函数为什么在这些区间上是单调的,以及该方程确实只有你求出的这些实根。

南京邮电大学算法设计实验报告——动态规划法

南京邮电大学算法设计实验报告——动态规划法
for(int j=1;j<=n;j++) {
if(a[i]==b[j]) {
c[i][j]=c[i-1][j-1]+1; s[i][j]=1; } else if(c[i-1][j]>=c[i][j-1]) { c[i][j]=c[i-1][j]; s[i][j]=2; } else { c[i][j]=c[i][j-1]; s[i][j]=3; } } } return c[m][n]; //返回最优解值 }
算法分析与设计 A
动态规划法
2009
年 11 月 20 日
计算机学院软件工程系
张怡婷
学生姓名 学院(系)
丁力琪 班级学号 计算机学院 专 业
B07030907 软件工程
实验报告
实验名称
动态规划法
指导教师 张怡婷
实验类型
验证
实验学时 2×2 实验时间 2009-11-20
一、 实验目的和任务
目的:加深对动态规划法的算法原理及实现过程的理解,学习用动态
6
8、输入序列 X={x1,x2,……,xm}={a,b,c,b,d,a,b}和 Y={y1,y2,……,yn}={b,d,c,a,b,a}作为测 试数据,测试程序是否能够正确运行?输出结果是什么? 运行正确,实验结果显示:4
bcba
9、分析该动态规划算法的两个主要成员函数 int LCSLength()和 void CLCS()的时间复杂 性。
#include<iostream> #include<string> using namespace std; #define maxlength 11 class LCS { public:

南京邮电大学数值代数实验

南京邮电大学数值代数实验

数值代数实验数值线性代数实验一一、实验名称:矩阵的LU分解.二、实验目的:用不选主元的LU分解和列主元LU分解求解线性方程组Ax=b, 并比较这两种方法.三、实验内容与要求(1)用所熟悉的计算机语言将不选主元和列主元LU分解编成通用的子程序,然后用编写的程序求解下面的84阶方程组将计算结果与方程组的精确解进行比较,并就此谈谈你对Gauss消去法的看法.(2)写出追赶法求解三对角方程组的过程,并编写程序求该实验中的方程组Gauss消去法:用消去法解方程组的基本思想是用逐次消去未知数的方法把原来方程组Ax=b化为与其等价的三角方程组,而求解三角方程组就容易了。

换句话说,上述过程就是用行的初等变换将原方程组系数矩阵化为简单形式,从而将求解原方程组的问题转化为求解简单方程组的问题。

利用Gauss消去法对线性方程组Ax=b进行求解。

用MATLAB建立m文件DelGauss.m,程序如下:function x=DelGauss(a,b)[n,m]=size(a);nb=length(b);det=1;x=zeros(n,1);for k=1:n-1for i=k+1:nif a(k,k)==0returnendm=a(i,k)/a(k,k);for j=k+1:na(i,j)=a(i,j)-m*a(k,j);endb(i)=b(i)-m*b(k);enddet=det*a(k,k);enddet=det*a(n,n);for k=n:-1:1for j=k+1:nb(k)=b(k)-a(k,j)*x(j);endx(k)=b(k)/a(k,k);End在matlab中输入如下:结果如下:方程组的精确解为x 1=x 2=…=x 84=1.0000,与Gauss 消去法求得的解差距很大,所得结果不够准确,计算简单但其消元过程有时不能进行到底而使求解出现解失真的情况。

数值线性代数实验二一、实验名称:实对称正定矩阵的A的Cholesky分解.二、实验目的:用平方根法和改进的平方根方法求解线性方程组Ax=b.三、实验内容与要求用所熟悉的计算机语言将Cholesky分解和改进的Cholesky分解编成通用的子程序,然后用编写的程序求解对称正定方程组Ax=b,其中(1)b随机的选取,系数矩阵为100阶矩阵(2)系数矩阵为40阶Hilbert矩阵,即系数矩阵A的第i行第j列元素为,向量b的第i个分量为(3)用实验一的程序求解这两个方程组,并比较所有的计算结果,然后评价各个方法的优劣。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值代数实验
数值线性代数实验一
一、实验名称:矩阵的LU分解.
二、实验目的:用不选主元的LU分解和列主元LU分解求解线性方程组Ax=b, 并比较这
两种方法.
三、实验内容与要求
(1)用所熟悉的计算机语言将不选主元和列主元LU分解编成通用的子程序,然后用编写的程序求解下面的84阶方程组
将计算结果与方程组的精确解进行比较,并就此谈谈你对Gauss消去法的看法.
(2)写出追赶法求解三对角方程组的过程,并编写程序求该实验中的方程组
Gauss消去法:
用消去法解方程组的基本思想是用逐次消去未知数的方法把原来方程组Ax=b化为与其等价的三角方程组,而求解三角方程组就容易了。

换句话说,上述过程就是用行的初等变换将原方程组系数矩阵化为简单形式,从而将求解原方程组的问题转化为求解简单方程组的问题。

利用Gauss消去法对线性方程组Ax=b进行求解。

用MATLAB建立m文件DelGauss.m,程序如下:
function x=DelGauss(a,b)
[n,m]=size(a);
nb=length(b);
det=1;
x=zeros(n,1);
for k=1:n-1
for i=k+1:n
if a(k,k)==0
return
end
m=a(i,k)/a(k,k);
for j=k+1:n
a(i,j)=a(i,j)-m*a(k,j);
end
b(i)=b(i)-m*b(k);
end
det=det*a(k,k);
end
det=det*a(n,n);
for k=n:-1:1
for j=k+1:n
b(k)=b(k)-a(k,j)*x(j);
end
x(k)=b(k)/a(k,k);
End
在matlab中输入如下:
结果如下:
方程组的精确解为x1=x2=…=x84=1.0000,与Gauss消去法求得的解差距很大,所得结果不够准确,计算简单但其消元过程有时不能进行到底而使求解出现解失真的情况。

数值线性代数实验二
一、实验名称:实对称正定矩阵的A的Cholesky分解.
二、实验目的:用平方根法和改进的平方根方法求解线性方程组Ax=b.
三、实验内容与要求
用所熟悉的计算机语言将Cholesky分解和改进的Cholesky分解编成通用的子程序,然后用编写的程序求解对称正定方程组Ax=b,其中
(1)b随机的选取,系数矩阵为100阶矩阵
(2)系数矩阵为40阶Hilbert矩阵,即系数矩阵A的第i行第j列元素为
,向量b的第i个分量为
(3)用实验一的程序求解这两个方程组,并比较所有的计算结果,然后评价各个方法的优劣。

平方根法:
平方根法就是利用对称正定矩阵的三角分解而得到的求解对称正定方程组的一种有效方法。

平方根法递推公式可以证明对于对称正定矩阵A,可以唯一地分解成A=LL T,其中L是非奇异下三角形矩阵。

模型二:利用平方根法对线性方程组Ax=b进行求解。

用MATLAB建立m文件pingfg.m,程序如下:
function [x]=pingfg(A,b) %Cholesky分解
[n,n]=size(A);
L=zeros(n,n);%实际上不用为 L 申请空间,使用 A 即可
L(1,1)=sqrt(A(1,1));
for k=2:n
L(k,1)=A(k,1)/L(1,1);
end
for k=2:n-1
L(k,k)=sqrt(A(k,k)-sum(L(k,1:k-1).^2));
for i=k+1:n
L(i,k)=(A(i,k)-sum(L(i,1:k-1).*L(k,1:k-1)))/L(k,k);
end
end
L(n,n)=sqrt(A(n,n)-sum(L(n,1:n-1).^2));%解下三角方程组Ly=b
y=zeros(n,1);
for k=1:n
j=1:k-1;
y(k)=(b(k)-L(k,j)*y(j))/L(k,k);
end%解上三角方程组L'x=y
x=zeros(n,1);
U=L';
for k=n:-1:1
j=k+1:n;
x(k)=(y(k)-U(k,j)*x(j))/U(k,k);
End
模型三:利用改进的平方根法对线性方程组Ax=b进行求解。

用MATLAB建立m文件ave.m,程序如下:
function [x]=ave(A,b,n) %用改进平方根法求解Ax=b
L=zeros(n,n); %L为n*n矩阵
D=diag(n,0); %D为n*n的主对角矩阵
S=L*D;
for i=1:n %L的主对角元素均为1
L(i,i)=1;
end
for i=1:n
for j=1:n %验证A是否为对称正定矩阵
if (eig(A)<=0)|(A(i,j)~=A(j,i)) %A的特征值小于0或A非对称时,输出wrong disp('wrong');break;end
end
end
Hilbert矩阵用MATLAB建立m文件Hil.m,程序如下:
function b=Hil()
for k=1:40
for m=1:40
s=0;
t=s+1/(k+m-1);
s=t;
end
b(k,1)=s;
end
在matlab中输入如下:
输出结果如下:
在输入:输出为:
.....
问题3:
...
Gauss消去法所得的结果与平方根法和改进的平方根法求得的结果差距很大,而且Gauss消去法所得的结果大部分为零,显然平方根法和改进的平方根法求得的结果与方程的精确解比Gauss消去法的更接近,更准确。

但不管是哪一类算法都只能在预定的计算步骤内或给定的精度内得到近似解,有一定的误差。

数值线性代数实验三
一、实验名称:矩阵A 的QR 分解
二、实验目的:应用改进的Gram —Schmidt 方法和Householder 变换的方法计算矩阵A 的QR 分解. 其中),()(n m R a A n m ij ≥∈=⨯ rank A =n
三、实验内容与要求
输入:A 的各列),,1,],,[(,,,121n j a a a a a a T mj j j n ==
输出:Q 的各列元素(存放在A 的相应位置上)以及R 的元素
),,,,,1(n i j n i r ij ==
数值线性代数实验四
一、实验名称:用迭代法求解方程组及超松弛迭代和最佳松弛因子的确定.
二、实验目的:应用Jacobi 迭代法、Gauss -Seidel 迭代法和超松弛迭代方法求解线性方程组 Ax=b, 并选择不同的松弛因子ω,观察松弛因子对松弛迭代法计算效果的影响.
三、实验内容与要求
将常微分方程22(0)0,(1)1d y dy a dx dx y y ε⎧+=⎪⎨⎪==⎩
(01a <<)离散化得到差分方程Ax=b ,取
10.5,100,a n h n
===,应用Jacobi 迭代法、Gauss -Seidel 迭代法和超松弛迭代方法求解线性方程组,分别取1,0.1,0.01,0.0001ε=,用SOR 迭代法计算对应的数值解,并与精确解进行比较. 写出这三种迭代法求解线性方程组的步骤,并对计算结果进行分析.
四、实验原理
将[0,1]区间n 等分,方程离散化得差分方程
211()(2)i i i h y h y y ah εεε+-+-++=
差分方程对应的系数矩阵和右端项分别为
20222(1)(1)(1)1(2)(2)(2)(2)()n n n n h h ah y h h ah A b h h ah h ah h y εεεεεεεεεεεε-⨯--⨯⎛⎫-++-⎛⎫ ⎪ ⎪-++ ⎪ ⎪ ⎪ ⎪==-+ ⎪ ⎪+ ⎪ ⎪ ⎪ ⎪-+-+⎝⎭⎝

其中0(0),(1).n y y y y ==
SOR 迭代法的迭代矩阵和常数项分别为
11()[(1)],()B D L U D f D L b ωωωωωωω--=-+-=-
SOR 迭代法的迭代公式: 1k k y B y f ωω+=+
五、实验过程
利用Matlab 语言实现SOR 迭代公式的计算,分别对于1,0.1,0.01,0.0001ε=,松弛因子在(1,2)范围内,先按步长0.1搜索,在最少迭代步数附近按步长0.01再搜索.
算法终止准则:1410k k y y +--≤ 或者410k y y --≤或者迭代次数1000≥.
记录四种情况下的计算结果,并找出最佳松弛因子ω的值,并观察松弛因子ω与ε间的关系.。

相关文档
最新文档