河北工业大学数值分析实验一
- 格式:doc
- 大小:54.50 KB
- 文档页数:3
一、实验目的通过本次综合实验,掌握数值分析中常用的插值方法、方程求根方法以及数值积分方法,了解这些方法在实际问题中的应用,提高数值计算能力。
二、实验内容1. 插值方法(1)拉格朗日插值法:利用已知数据点构造多项式,以逼近未知函数。
(2)牛顿插值法:在拉格朗日插值法的基础上,通过增加基函数,提高逼近精度。
2. 方程求根方法(1)二分法:适用于函数在区间内有正负值的情况,通过不断缩小区间来逼近根。
(2)Newton法:利用函数的导数信息,通过迭代逼近根。
(3)不动点迭代法:将方程转化为不动点问题,通过迭代逼近根。
3. 数值积分方法(1)矩形法:将积分区间等分,近似计算函数值的和。
(2)梯形法:将积分区间分成若干等分,用梯形面积近似计算积分。
(3)辛普森法:在梯形法的基础上,将每个小区间再等分,提高逼近精度。
三、实验步骤1. 拉格朗日插值法(1)输入已知数据点,构造拉格朗日插值多项式。
(2)计算插值多项式在未知点的函数值。
2. 牛顿插值法(1)输入已知数据点,构造牛顿插值多项式。
(2)计算插值多项式在未知点的函数值。
3. 方程求根方法(1)输入方程和初始值。
(2)选择求解方法(二分法、Newton法、不动点迭代法)。
(3)迭代计算,直到满足精度要求。
4. 数值积分方法(1)输入被积函数和积分区间。
(2)选择积分方法(矩形法、梯形法、辛普森法)。
(3)计算积分值。
四、实验结果与分析1. 插值方法(1)拉格朗日插值法:通过构造多项式,可以较好地逼近已知数据点。
(2)牛顿插值法:在拉格朗日插值法的基础上,增加了基函数,提高了逼近精度。
2. 方程求根方法(1)二分法:适用于函数在区间内有正负值的情况,计算简单,但收敛速度较慢。
(2)Newton法:利用函数的导数信息,收敛速度较快,但可能存在数值不稳定问题。
(3)不动点迭代法:将方程转化为不动点问题,收敛速度较快,但可能存在初始值选择不当的问题。
3. 数值积分方法(1)矩形法:计算简单,但精度较低。
数值分析实验报告
一、实验背景
本实验主要介绍了数值分析的各种方法。
在科学计算中,为了求解一
组常微分方程或一些极限问题,数值分析是一种有用的方法。
数值分析是
一种运用计算机技术对复杂模型的问题进行数学分析的重要手段,它利用
数学模型和计算机程序来解决复杂的数学和科学问题。
二、实验内容
本实验通过MATLAB软件,展示了以下几种数值分析方法:
(1)拉格朗日插值法:拉格朗日插值法是由法国数学家拉格朗日发
明的一种插值方法,它可以用来插值一组数据,我们使用拉格朗日插值法
对给定的点进行插值,得到相应的拉格朗日多项式,从而计算出任意一个
点的函数值。
(2)最小二乘法:最小二乘法是一种常用的数据拟合方法,它可以
用来拟合满足一定函数的点的数据,它的主要思想是使得数据点到拟合曲
线之间的距离的平方和最小。
(3)牛顿插值法:牛顿插值法是一种基于差商的插值方法,它可以
用来插值一组数据,可以求得一组数据的插值函数。
(4)三次样条插值:三次样条插值是一种基于三次样条的插值方法,它可以用来对一组数据进行插值,可以求得一组数据的插值函数。
三、实验步骤
1.首先启动MATLAB软件。
一、实验目的通过本次实验,掌握数值分析的基本原理和方法,了解数值分析在科学和工程领域的应用,培养动手能力和分析问题的能力。
二、实验内容1. 二分法求方程根(1)原理:二分法是一种在实数域上寻找函数零点的算法。
对于连续函数f(x),如果在区间[a, b]上f(a)f(b)<0,则存在一个根在区间(a, b)内。
二分法的基本思想是将区间[a, b]不断二分,缩小根所在的区间,直到满足精度要求。
(2)实验步骤:① 输入函数f(x)和精度要求;② 初始化区间[a, b]和中间点c=a+(b-a)/2;③ 判断f(c)与f(a)的符号,若符号相同,则将区间缩小为[a, c],否则缩小为[c,b];④ 重复步骤②和③,直到满足精度要求;⑤ 输出根的近似值。
2. 牛顿法求方程根(1)原理:牛顿法是一种在实数域上寻找函数零点的算法。
对于可导函数f(x),如果在点x0附近,f(x0)f'(x0)≠0,则存在一个根在点x0附近。
牛顿法的基本思想是通过泰勒展开近似函数,然后求解近似方程的根。
(2)实验步骤:① 输入函数f(x)和精度要求;② 初始化迭代次数n=0,近似根x0;③ 计算导数f'(x0);④ 求解近似方程x1=x0-f(x0)/f'(x0);⑤ 判断|x1-x0|是否满足精度要求,若满足,则停止迭代;否则,将x0更新为x1,n=n+1,返回步骤③。
3. 雅可比迭代法解线性方程组(1)原理:雅可比迭代法是一种解线性方程组的迭代算法。
对于线性方程组Ax=b,雅可比迭代法的基本思想是利用矩阵A的对角线元素将方程组分解为多个一元线性方程,然后逐个求解。
(2)实验步骤:① 输入系数矩阵A和常数向量b;② 初始化迭代次数n=0,近似解向量x0;③ 计算对角线元素d1, d2, ..., dn;④ 更新近似解向量x1=x0-A/d1, x2=x0-A/d2, ..., xn=x0-A/dn;⑤ 判断|x1-x0|是否满足精度要求,若满足,则停止迭代;否则,将x0更新为x1, x2, ..., xn,n=n+1,返回步骤③。
数值分析实验报告⼀.实验⽬的1.通过实际计算体会各种积分⽅法的精确度;会编写⽤龙贝格算法求定积分的程序。
2.熟悉求解线性⽅程组的有关理论和⽅法;并会编制列主元消去法、LU 分解法。
⼆.实验环境及要求MATLAB 软件等。
三.实验学时2学时四.实验内容1.数值积分实验:复化积分、龙贝格积分;2.线性代数⽅程组的直接解法:列主元消去法、LU 分解法。
五.实验题及结果1. ⽤复化⾟欧森公式计算积分I=dx x ?+10211。
int_com_simp.m ⽂件:function s=int_comp_simp(f,a,b,n)format long ;h=(b-a)/(2*n);s1=0;s2=0;for k=1:nx=a+h*(2*k-1);s1=s1+f(x);endfor k=1:(n-1)x=a+h*2*k;s2=s2+f(x);ends=h*(f(a)+f(b)+4*s1+2*s2)/3;函数f1.m ⽂件:function y=f1(x)y=1/(1+x*x);对函数调⽤的f11.m ⽂件:for i=1:4n=2^i;s=int_comp_simp(@f1,0,1,n);display(n);display(s); end结果及其分析:结果:>> f11n =2s =0.785392156862745n =4s =0.785398125614677n =8s =0.785398162806206n =16s =0.785398163388209 结果分析:当n=8时结果已经达到6位有效数字;2. ⽤龙贝格⽅法计算积分I=dx x ?+10211 。
龙贝格⽅法的函数⽂件:function [T,quad,err,h]=int_romberg(f,a,b,n,tol) format longM=1;h=b-a;err=1;k=0;T=zeros(4,4);T(1,1)=h*(f(a)+f(b))/2;while ((err>tol)&&(kk=k+1;h=h/2;s=0;for p=1:Mx=a+h*(2*p-1);s=s+f(x);endT(k+1,1)=T(k,1)/2+h*s;M=2*M;for kk=1:kT(k+1,kk+1)=T(k+1,kk)+(T(k+1,kk)-T(k,kk))/(4^kk-1);enderr=abs(T(k,k)-T(k+1,kk+1));endquad=T(k+1,k+1);所求函数的⽂件:function y=f1(x)y=1/(1+x*x);结果及其分析:>> [T,quad,err,h]=int_romberg(@f1,0,1,4,1e-6)T =Columns 1 through 40.750000000000000 0 0 0 0.775000000000000 0.783333333333333 0 00.782794117647059 0.785392156862745 0.785529411764706 00.784747123622772 0.785398125614677 0.785398523531472 0.785396445940468 0.785235403010347 0.785398162806206 0.785398165285641 0.785398159599199 Column 50.785398166319429quad =0.785398166319429err =1.720378960845537e-06h =0.062500000000000结果分析:最后结果是0.785398166319429,误差为1.720378960845537e-06;3.⽤列主元消去法解⽅程组0.101x1+2.304x2+3.555x3=1.183-1.347x1+3.712x2+4.623x3=2.137-2.835x1+1.072x2+5.643x3=3.035⾼斯主元消去法的m⽂件:function solution=Gauss_main(gauss,precision)if nargin==2trydigits(precision);catchdisp('您输⼊的精度有误,这⾥按照缺省的精度(10位有效数字)计算');digits(10);endA=vpa(gauss);row=size(A,1);col=size(A,2);if ndims(A)~=2|col-row~=1disp('矩阵的⼤⼩有误,不能使⽤Gauss主元素消去法')returnendif det(gauss(:,1:row))disp('该⽅程的系数矩阵⾏列式为零,⽆解或有⽆穷多解,不能使⽤Gauss主元素消去法') returnendfor i=1:rowMax=0.0;for j=i:rowif double(abs(A(j,i))-Max)>0Max=abs(A(j,i));max_row=j;endendtemp=A(i,:);A(i,:)=A(max_row,:);A(max_row,:)=temp;for k=i+1:rowA(k,:)=vpa(A(k,:)-A(i,:)*A(k,i)/A(i,i));endendfor i=row:-1:1temp=A(i,col);for k=i+1:rowtemp=vpa(temp-soulution(k)*A(i,k));endsolution(i)=vpa(temp/A(i,i));end结果:>> solution=Gauss_main(A,4)solution =[ -0.3982, 0.0138, 0.3351]结果分析:x(1)=-0.3982,x(2)=0.0138,x(3)=0.3351;4.LU直接分解法求⽅程组0.101x1+2.304x2+3.555x3=1.183-1.347x1+3.712x2+4.623x3=2.137-2.835x1+1.072x2+5.643x3=3.035LU的m⽂件:function solution=Mlu(M,precision)if nargin==2trydigits(precision);catchdisp('你输⼊的精度有误,这⾥按照缺省的精度(10位有效数字)计算'); digits(10);endelsedigits(10);endA=vpa(M);row=size(A,1);col=size(A,2);if ~ismatrix(A)||col-row~=1disp('矩阵的⼤⼩有误,不能使⽤LU分解')returnendif det(M(:,1:row))==0disp('该⽅程的系数矩阵⾏列式为零,⽆解或有穷多解,不能使⽤LU分解') returnend[L,U,P]=lu(double(A));for i=row:-1:1temp=U(i,col);for k=i+1:rowtemp=vpa(temp-t_solution(k)*U(i,k));endt_solution(i)=vpa(temp/U(i,i));endfor i=1:rowtemp=t_solution(i);for k=1:i-1temp=vpa(temp-t_solution(k)*U(i,k));endsolution(i)=temp;end结果及分析:结果:>> solution=Mlu(A,4)solution =[ -0.3982, 0.0138, 0.3351]结果分析:x(1)=-0.3982,x(2)=0.0138,x(3)=0.3351;。
实验一:约瑟夫环问题一.实验目的:要求设计一个程序模拟约瑟夫环问题过程,求出出列编号序列。
二.实验内容:约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。
开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。
如此下去,直到所有人全部出列为止。
令n最大值取30。
要求设计一个程序模拟此过程,求出出列编号序列。
三.实验过程:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,把被删除结点的密码作为新的m值,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。
#include<stdio.h>#include<stdlib.h>#define MAX_NODE_NUM 30#define TRUE 1#define FALSE 0typedef struct NodeType{ int number;int password;struct NodeType *next;} NodeType;/* 创建单向循环链表*/static void CreaList(NodeType **, const int);/* 运行"约瑟夫环"问题*/static void StatGame(NodeType **, int);/* 打印循环链表*/static void PrntList(const NodeType *);/* 得到一个结点*/static NodeType *GetNode(const int, const int);/* 测试链表是否为空, 空为TRUE,非空为FALSE */static unsigned EmptyList(const NodeType *);int main(void){ int n, m;NodeType *pHead=NULL;while(1){printf("输入总的人数n(<=%d):",MAX_NODE_NUM);scanf("%d",&n);printf("初始循环的密码为:");scanf("%d",&m);if(n>MAX_NODE_NUM){printf("数字太大,请重新输入!\n");continue;}elsebreak;}CreaList(&pHead,n);printf("\n打印出原始每个结点的序列号和密码\n"); PrntList(pHead);printf("\n最终每个结点退出的序列号和密码\n"); StatGame(&pHead,m);return 0;}static void CreaList(NodeType **ppHead, const int n){int i,iCipher;NodeType *pNew, *pCur;for(i=1;i<=n;i++){printf("第%d个人的密码为:",i);scanf("%d", &iCipher);pNew=GetNode(i,iCipher);if(*ppHead==NULL){*ppHead=pCur=pNew;pCur->next=*ppHead;}else{pNew->next=pCur->next;pCur->next=pNew;pCur=pNew;}}printf("已完成结点初始化!\n");}static void StatGame(NodeType **ppHead, int iCipher){int iCounter, iFlag=1,i=1;NodeType *pPrv, *pCur, *pDel;pPrv=pCur=*ppHead;while(pPrv->next!=*ppHead)pPrv=pPrv->next;while(iFlag){for(iCounter=1;iCounter<iCipher;iCounter++){pPrv=pCur;pCur=pCur->next;}if(pPrv==pCur)iFlag=0;pDel=pCur;pPrv->next=pCur->next;pCur=pCur->next;iCipher=pDel->password;printf("第%d个退出的是序列号为%d的人,其密码为:%d\n",i, pDel->number,pDel->password);free(pDel);++i;}*ppHead=NULL;}static void PrntList(const NodeType *pHead){const NodeType *pCur=pHead;if (EmptyList(pHead))return;do{printf("第%d 个人,密码:%d\n",pCur->number,pCur->password);pCur=pCur->next;} while (pCur!=pHead);}static NodeType *GetNode(const int iId,const int iCipher){NodeType *pNew;pNew=(NodeType *)malloc(sizeof(NodeType));if(!pNew){printf("错误,内存不足!\n");exit(-1);}pNew->number=iId;pNew->password=iCipher;pNew->next=NULL;return pNew;}static unsigned EmptyList(const NodeType *pHead){if(!pHead){printf("列表为空!\n");return TRUE;}return FALSE;}参考至“百度文库”《C语言约瑟夫环问题》收获:学会了创建循环链表及相关操作,巩固了线性链表的知识。
《数值分析》课程实验报告数值分析实验报告《数值分析》课程实验报告姓名:学号:学院:机电学院日期:20__ 年 _ 月_ 日目录实验一函数插值方法 1 实验二函数逼近与曲线拟合 5 实验三数值积分与数值微分 7 实验四线方程组的直接解法 9 实验五解线性方程组的迭代法 15 实验六非线性方程求根 19 实验七矩阵特征值问题计算 21 实验八常微分方程初值问题数值解法 24 实验一函数插值方法一、问题提出对于给定的一元函数的n+1个节点值。
试用Lagrange公式求其插值多项式或分段二次Lagrange插值多项式。
数据如下:(1) 0.4 0.55 0.65 0.80 0.95 1.05 0.41075 0.57815 0.69675 0.90 1.00 1.25382 求五次Lagrange多项式,和分段三次插值多项式,计算, 的值。
(提示:结果为, )(2) 1 2 3 4 5 6 7 0.368 0.135 0.050 0.018 0.007 0.002 0.001 试构造Lagrange多项式,计算的,值。
(提示:结果为, )二、要求 1、利用Lagrange插值公式编写出插值多项式程序;2、给出插值多项式或分段三次插值多项式的表达式;3、根据节点选取原则,对问题(2)用三点插值或二点插值,其结果如何;4、对此插值问题用Newton插值多项式其结果如何。
Newton 插值多项式如下:其中:三、目的和意义 1、学会常用的插值方法,求函数的近似表达式,以解决其它实际问题;2、明确插值多项式和分段插值多项式各自的优缺点;3、熟悉插值方法的程序编制;4、如果绘出插值函数的曲线,观察其光滑性。
四、实验步骤(1) 0.4 0.55 0.65 0.80 0.951.05 0.41075 0.57815 0.69675 0.90 1.00 1.25382 求五次Lagrange多项式,和分段三次插值多项式,计算, 的值。
工程数学—数值分析实验报告(一)2010年10月23日郑州轻工业学院 机电工程系制冷与低温专业 10级研究生 王哲一.实验目的通过本实验初步了解学习数值分析的课程内涵,来解决现实生活中,工程应用中的线性方程组的问题,利用高斯迭代解决线性方程组的问题,利用三角变换解决线性方程的问题等等。
主要了解掌握线性方程组的问题的消去解法、迭代解法。
掌握高斯消去法和迭代法。
培养编程与上机调试能力及应用数学软件(excel ,Matlab ,Linggo )等实现这几种方法。
二.实验内容设有线性方程组Ax = b ,其中⎪⎪⎪⎪⎪⎭⎫⎝⎛=nn n n n n a a a a a a a a a A212222111211为非奇异阵⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=n x x x x 21⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=n b bb b 21关于线性方程组的数值解法一般有两类:直接法与迭代法。
(1)直接法就是经过有限步算术运算,可求得方程组精确解的方法(若计算过程中没有舍入误差)。
但实际计算中由于舍入误差的存在和影响,这种方法也只能求得线性方程组的近似解。
(2)迭代法就是用某种极限过程去逐步逼近线性方程组精确解的方法。
迭代法具有需要计算机的存贮单元较少、程序设计简单、原始系数矩阵在计算过程中始终不变等优点,但存在收敛性及收敛速度问题。
迭代法是解大型稀疏矩阵方程组(尤其是由微分方程离散后得到的大型方程组)的重要方法。
(3)高斯(Gauss )消去法是解线性方程组最常用的方法之一。
基本思想:是通过逐步消元(行的初等变换),把方程组化为系数矩阵为三角形矩阵的同解方程组,然后用回代法解此三角形方程组(简单形式)得原方程组的解。
1.高斯消去法解线性方程组基本步骤: 1)消元将原方程组记为A (1)x =b (1),其中A (1)=(a ij (1))=(a ij ),b (1)=b ,(1)第一次消元⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=)1()1(2)1(1)1()1(2)1(1)1(2)1(22)1(21)1(1)1(12)1(11)1()1(]|[n nnn n n nb b b a a a a a a a a a b A⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡⇒)2()2(2)1(1)2()2(2)2(2)2(22)1(1)1(12)1(1100n nnn n nb b b a a a a a a a]|[)2()2(b A = 其中:n i a a b b a a b b a a n j aa a aai i iii ji ijij,...,3,21,...,3,2)1(11)1(1)1(1)1(1)1(11)1(1)1()2()1(11)1(1)1(1)1(11)1(1)1()2(=⎪⎪⎭⎪⎪⎬⎫-==-=倍的减去—倍行的减去第—2)第k 次消元⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=)()()1(1)()()()()1(1)1(1)1(11)()(0]|[k n k k k nn k nkk knk kkn k k k b b b a a a a a a a b A]|[00)1()1()1()1(1)()1(1)1()1(1,)1(,1)1(1,1)()(1,)()1(1)1(11)1(1)1(11+++++++++++++++=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⇒k k k n k k k k k nnk k n k nk k k k k kn k k k k kk n k k b A b b b b a a a a a a a a a a ank k i a a b b a a bba a k n k k j aa a a a k kkk ik k k k kk kkk ikk ik i k kk k ikk ijk kk k ik k ijk ij,...,2,1,...,2,1)()()()()()()()1()()()()()()()1(++=⎪⎪⎭⎪⎪⎬⎫-=++=-=++倍的减去—倍行的减去第—注:为减少计算量,令,)()(k kkk ik ik aa l =则n k k i bl bbn k k j a l a a k kik k i k i k ij ik k ij k ij ,...,2,1,...,2,1)()()1()()()1(++=⎭⎬⎫-=++=-=++3)当k =n –1时得⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=)()2(2)1(1)()2(2)2(22)1(1)1(12)1(11)()(]|[n n n nnn nn n b b b a a a a a a b A完成第n-1次消元后得到与原方程组等价的三角形方程组A (n)x=b (n)注:当det(A)≠0时,显然有a ii (i)≠0,(i=1,…,n),称为主元素。
数值分析实验实验报告数值分析实验实验报告引言在现代科学与工程领域,数值分析是一项重要的技术手段。
通过数值方法,我们可以利用计算机模拟和解决各种实际问题,如物理、化学、生物、经济等领域中的方程求解、优化问题、数据拟合等。
本实验旨在通过实际案例,探讨数值分析的应用和效果。
实验一:方程求解首先,我们考虑一个简单的方程求解问题。
假设我们需要求解方程f(x) = 0的根,其中f(x)是一个在给定区间[a, b]上连续且单调的函数。
为了实现这个目标,我们可以采用二分法、牛顿法、弦截法等数值方法。
在本实验中,我们选择使用二分法来求解方程f(x) = 0。
这种方法的基本思想是通过不断缩小区间[a, b]的范围,直到找到一个近似的根。
我们首先选取一个中间点c,计算f(c)的值,然后根据f(c)与0的关系,将区间[a, b]分成两部分。
重复这个过程,直到找到满足精度要求的根。
实验二:数据拟合接下来,我们考虑一个数据拟合的问题。
假设我们有一组离散的数据点,我们希望找到一个函数,使得该函数与这些数据点的拟合误差最小。
为了实现这个目标,我们可以采用最小二乘法等数值方法。
在本实验中,我们选择使用最小二乘法来进行数据拟合。
这种方法的基本思想是通过最小化数据点与拟合函数之间的误差平方和,来确定拟合函数的参数。
我们首先选择一个拟合函数的形式,如线性函数、多项式函数等。
然后,通过最小化误差平方和的方法,计算出拟合函数的参数。
实验三:优化问题最后,我们考虑一个优化问题。
假设我们需要在给定的约束条件下,找到一个使得目标函数取得最大或最小值的变量。
为了实现这个目标,我们可以采用梯度下降法、遗传算法等数值方法。
在本实验中,我们选择使用梯度下降法来解决优化问题。
这种方法的基本思想是通过迭代的方式,不断调整变量的取值,直到找到一个满足约束条件的最优解。
我们首先计算目标函数关于变量的梯度,然后根据梯度的方向和大小,更新变量的取值。
通过不断迭代,我们可以逐步接近最优解。