《计算方法》课内实验报告
计算方法实验报告格式

计算方法实验报告格式小组名称:组长姓名(班号):小组成员姓名(班号):按贡献排序情况:指导教师评语:小组所得分数:一个完整的实验,应包括数据准备、理论基础、实验内容及方法,最终对实验结果进行分析,以达到对理论知识的感性认识,进一步加深对相关算法的理解,数值实验以实验报告形式完成,实验报告格式如下:一、实验名称实验者可根据报告形式需要适当写出.二、实验目的及要求首先要求做实验者明确,为什么要做某个实验,实验目的是什么,做完该实验应达到什么结果,在实验过程中的注意事项,实验方法对结果的影响也可以以实验目的的形式列出.三、算法描述(实验原理与基础理论)数值实验本身就是为了加深对基础理论及方法的理解而设置的,所以要求将实验涉及到的理论基础,算法原理详尽列出.四、实验内容实验内容主要包括实验的实施方案、步骤、实验数据准备、实验的算法以及可能用到的仪器设备.五、程序流程图画出程序实现过程的流程图,以便更好的对程序执行的过程有清楚的认识,在程序调试过程中更容易发现问题.六、实验结果实验结果应包括实验的原始数据、中间结果及实验的最终结果,复杂的结果可以用表格形式列出,较为简单的结果可以与实验结果分析合并出现.七、实验结果分析实验结果分析包括对对算法的理解与分析、改进与建议.数值实验报告范例为了更好地做好数值实验并写出规范的数值实验报告,下面给出一简单范例供读者参考.数值实验报告小组名称: 小组成员(班号): 按贡献排序情况: 指导教师评语: 小组所得分数:一、实验名称误差传播与算法稳定性.二、实验目的1.理解数值计算稳定性的概念. 2.了解数值计算方法的必要性. 3.体会数值计算的收敛性与收敛速度.三、实验内容计算dx x x I nn ⎰+=110,1,2,,10n = . 四、算法描述由 dx x x I nn ⎰+=110,知 dx x x I n n ⎰+=--101110,则ndx x dx x x x I I n n n n n 1101010101111==++=+⎰⎰---.得递推关系: (I )=n I 1101--n I n,10,,2,1 =n . (II ))1(1011n n I nI -=- ,1,,9,10 =n . 下面分别以(1)、(2)递推关系求解: 方案1 =n I 1101--n I n,10,,2,1 =n . 当0=n 时,=+=⎰dx x I 10101㏑=1011㏑1.1,递推公式为()10110,1,2,,10,ln 1.1.nn I I n n I -⎧=-=⎪⎨⎪=⎩(1) 方案2 )1(1011n n I nI -=-,1,,9,10 =n . 当10<<x 时, n n n x x x x 10110111≤+≤,则 dx x dx x x dx x nn n 1011011110101⎰⎰⎰≤+≤.即)1(101)1(111+≤≤+n I n n .取递推初值 )110(22021])110(101)110(111[2110+=+++≈I .递推公式为 11011(),10,9,,1,1021.220(101)n n I I n n I -⎧=-=⎪⎪⎨⎪=+⎪⎩(2) 取递推公式(1)中的初值095310.01.1ln 0≈=I ,得10110, 1,2,,10,0.095310.nn I I n n I -⎧=-=⎪⎨⎪≈⎩ 取递推公式(2)中的初值008678.010≈I ,得11011(),10,9,,1,100.008678.n n I I n n I -⎧=-=⎪⎨⎪≈⎩ 五、程序流程图由于实验方案明显、简单,实现步骤及流程图省略.六、实验结果计算结果如表1-2:表1-2 计算结果七、实验结果分析由递推公式(1)知当1.1ln 0=I 时,n I 应当为精确解,递推公式的每一步都没有误差的取舍,但计算结果033333.0~5=I >=016667.04~I ,6~I 出现负值.由此看出,当n 较大时,用递推公式(1)中的n I ~近似n I 是不正确的.主要原因是初值095310.0~0=I 不是精确值,设有误差)~(0I e ,由递推公式(1)知 )~(10)~(1--=n n I e I e 则有)~()10()~(100)~(10)~(021I e I e I e I e n n n n -=-=-=--误差)~(n I e 随n 的增大而迅速增加,增加到)~(0I e 的n )10(-倍.由此可见,递推公式计算的误差不仅取决于初值的误差,公式的精确性,还依赖于误差的传递即递推计算的稳定性.由递推公式(2)知 008678.010≈I ,n I 为估计值,并不精确,有12101)(10≤I e ,而由)(101)(**1n n I e I e -=- 得 )()101()(**0n n I e I e -= 误差)(*0I e 随递推公式逐步缩小.综上所述,在递推计算中,数值计算方法是非常重要的,误差估计、误差传播及递推计算的稳定性都会直接影响递推结果.。
数学计算方法实验报告

数学计算方法实验报告习题二2.估计用二分法求方程f(x)=x3+4x2-10=0在区间[1,2]内根的近似值,为使方程不超过10时所需的二分次数。
f(x k)程序过程:function two (tolerance)a=1;b=2;counter=0;while (abs(b-a)>tolerance)c=(a+b)/2;fa=a^3+4*a^2-10;fb=b^3+4*b^2-10;fc=c^3+4*c^2-10;if ((fa==0|fb==0)) disp(counter);elseif (fa*fc<0)b=c;counter=counter+1;elseif (fb*fc<0)a=c;counter=counter+1;elseif (fb==0)disp(counter);endendsolution=(a+b)/2;disp(solution);disp(counter);实验结果:6.取x0=1.5,用牛顿迭代法求第三中的方程根.f(x)=x3+4x2-10=0的近似值(精确到||x k+1-x k|≦10-5,并将迭代次数与3题比较。
程序过程:function six (g)a=1.5;fa=a^3+4*a^2-10;ga=3*a^2+8*a;b=a-fa/ga;k=1;while(abs(b-a)>g)a=b;fa=a^3+4*a^2-10;ga=3*a^2+8*a;b=a-fa/ga;k=k+1;endformat long;disp(a);disp(k);实验结果:程序结果计算结果8.用弦割法求方程f(x)=x3-3x2-x+9=0在区间[-2,-1]内的一个实根近似值x k,|f(x k)|≦10-5.程序过程:function eight (t)a=-2;b=-1;fa=a^3-3*a^2-a+9;fb=b^3-3*b^2-b+9;c=b-fb*(b-a)/(fb-fa);k=1;while(abs(c-b)>t)a=b;b=c;fa=a^3-3*a^2-a+9;fb=b^3-3*b^2-b+9;c=b-fb*(b-a)/(fb-fa);k=k+1;endformat long;disp(k);disp(b);实验结果: 计算结果9.用艾特肯算法求方程x3+4x2-10=0在区间[1,2]内的根的近似值(取x0=1.5,g(x)=410 x ,精确到|x k+1-x k |≦10-5,并与2,3,6结果比较。
计算方法实验报告

班级:地信11102班序号: 20姓名:任亮目录计算方法实验报告(一) (3)计算方法实验报告(二) (6)计算方法实验报告(三) (9)计算方法实验报告(四) (13)计算方法实验报告(五) (18)计算方法实验报告(六) (22)计算方法实验报告(七) (26)计算方法实验报告(八) (28)计算方法实验报告(一)一、实验题目:Gauss消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯消去法基础原理2、掌握高斯消去法法解方程组的步骤3、能用程序语言对Gauss消去法进行编程实现四、实验过程代码及结果1、实验算法及其代码模块设计(1)、建立工程,建立Gauss.h头文件,在头文件中建类,如下:class CGauss{public:CGauss();virtual ~CGauss();public:float **a; //二元数组float *x;int n;public:void OutPutX();void OutputA();void Init();void Input();void CalcuA();void CalcuX();void Calcu();};(2)、建立Gauss.cpp文件,在其中对个函数模块进行设计2-1:构造函数和析构函数设计CGauss::CGauss()//构造函数{a=NULL;x=NULL;cout<<"CGauss类的建立"<<endl;}CGauss::~CGauss()//析构函数{cout<<"CGauss类撤销"<<endl;if(a){for(int i=1;i<=n;i++)delete a[i];delete []a;}delete []x;}2-2:函数变量初始化模块void CGauss::Init()//变量的初始化{cout<<"请输入方程组的阶数n=";cin>>n;a=new float*[n+1];//二元数组初始化,表示行数for(int i=1;i<=n;i++){a[i]=new float[n+2];//表示列数}x=new float[n+1];}2-3:数据输入及输出验证函数模块void CGauss::Input()//数据的输入{cout<<"--------------start A--------------"<<endl;cout<<"A="<<endl;for(int i=1;i<=n;i++)//i表示行,j表示列{for(int j=1;j<=n+1;j++){cin>>a[i][j];}}cout<<"--------------- end --------------"<<endl;}void CGauss::OutputA()//对输入的输出验证{cout<<"-----------输出A的验证-----------"<<endl;for(int i=1;i<=n;i++){for(int j=1;j<=n+1;j++){cout<<a[i][j]<<" ";}cout<<endl;}cout<<"---------------END--------------"<<endl;}2-4:消元算法设计及实现void CGauss::CalcuA()//消元函数for(int k=1 ;k<n;k++){for(int i=k+1;i<=n;i++){double lik=a[i][k]/a[k][k];for(int j=k;j<=n+1;j++){a[i][j]-=lik*a[k][j];}a[i][k]=0; //显示消元的效果}}}2-5:回代计算算法设计及函数实现void CGauss::CalcuX()//回带函数{for(int i=n;i>=1;i--){double s=0;for(int j=i+1;j<=n;j++){s+=a[i][j]*x[j];}x[i]=(a[i][n+1]-s)/a[i][i];}}2-6:结果输出函数模块void CGauss::OutPutX()//结果输出函数{cout<<"----------------X---------------"<<endl;for(int i=1 ;i<=n;i++){cout<<"x["<<i<<"]="<<x[i]<<endl;}}(3)、“GAUSS消元法”主函数设计int main(int argc, char* argv[]){CGauss obj;obj.Init();obj.Input();obj.OutputA();obj.CalcuA();obj.OutputA();obj.CalcuX();obj.OutPutX();//obj.Calcu();return 0;2、实验运行结果计算方法实验报告(二)一、实验题目:Gauss列主元消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯列主元消去法基础原理(1)、主元素的选取(2)、代码对主元素的寻找及交换2、掌握高斯列主元消去法解方程组的步骤3、能用程序语言对Gauss列主元消去法进行编程实现四、实验过程代码及结果1、实验算法及其代码模块设计(1)、新建头文件CGuassCol.h,在实验一的基础上建立类CGauss的派生类CGuassCol公有继承类CGauss,如下:#include "Gauss.h"//包含类CGauss的头文件class CGaussCol:public CGauss{public:CGaussCol();//构造函数virtual ~CGaussCol();//析构函数public:void CalcuA();//列主元的消元函数int FindMaxIk(int k);//寻找列主元函数void Exchange(int k,int ik);//交换函数void Calcu();};(2)、建立CGaussCol.cpp文件,在其中对个函数模块进行设计2-1:头文件的声明#include "stdafx.h"#include "CGuassCol.h"#include "math.h"#include "iostream.h"2-2:派生类CGaussCol的构造函数和析构函数CGaussCol::CGaussCol()//CGaussCol类构造函数{cout<<"CGaussCol类被建立"<<endl;}CGaussCol::~CGaussCol()//CGaussCol类析构函数{cout<<"~CGaussCol类被撤销"<<endl;}2-3:高斯列主元消元函数设计及代码实现void CGaussCol::CalcuA()//{for(int k=1 ;k<n;k++){int ik=this->FindMaxIk(k);if(ik!=k)this->Exchange(k,ik);for(int i=k+1;i<=n;i++){float lik=a[i][k]/a[k][k];for(int j=k;j<=n+1;j++){a[i][j]-=lik*a[k][j];}}}}2-4:列主元寻找的代码实现int CGaussCol::FindMaxIk(int k)//寻找列主元{float max=fabs(a[k][k]);int ik=k;for(int i=k+1;i<=n;i++){if(max<fabs(a[i][k])){ik=i;max=fabs(a[i][k]);}}return ik;}2-5:主元交换的函数模块代码实现void CGaussCol::Exchange(int k,int ik)//做交换{for(int j=k;j<=n+1;j++){float t=a[k][j];a[k][j]=a[ik][j];a[ik][j]=t;}}(3)、建立主函数main.cpp文件,设计“Gauss列主元消去法”主函数模块3-1:所包含头文件声明#include "stdafx.h"#include "Gauss.h"#include "CGuassCol.h"3-2:主函数设计int main(int argc, char* argv[]){CGaussCol obj;obj.Init();//调用类Gauss的成员函数obj.Input();//调用类Gauss的成员函数obj.OutputA();//调用类Gauss的成员函数obj.CalcuA();obj.OutputA();obj.CalcuX();obj.OutPutX();return 0;}2、实验结果计算方法实验报告(三)一、实验题目:Gauss完全主元消去法解方程组二、实验学时: 2学时三、实验目的和要求1、掌握高斯完全主元消去法基础原理;2、掌握高斯完全主元消去法法解方程组的步骤;3、能用程序语言对Gauss完全主元消去法进行编程(C++)实现。
东南大学计算方法实验报告

计算方法与实习实验报告学院:电气工程学院指导老师:***班级:160093******学号:********实习题一实验1 拉格朗日插值法一、方法原理n次拉格朗日插值多项式为:L n(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+y n l n(x)n=1时,称为线性插值,L1(x)=y0(x-x1)/(x0-x1)+ y1(x-x0)/(x1-x0)=y0+(y1-x0)(x-x0)/(x1-x0)n=2时,称为二次插值或抛物线插值,精度相对高些L2(x)=y0(x-x1)(x-x2)/(x0-x1)/(x0-x2)+y1(x-x0)(x-x2)/(x1-x0)/(x1-x2)+y2(x-x0)(x-x1)/(x2-x0)/(x2-x1)二、主要思路使用线性方程组求系数构造插值公式相对复杂,可改用构造方法来插值。
对节点x i(i=0,1,…,n)中任一点x k(0<=k<=n)作一n 次多项式l k(x k),使它在该点上取值为1,而在其余点x i(i=0,1,…,k-1,k+1,…,n)上为0,则插值多项式为L n(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+y n l n(x) 上式表明:n 个点x i(i=0,1,…,k-1,k+1,…,n)都是l k(x)的零点。
可求得l k三.计算方法及过程:1.输入节点的个数n2.输入各个节点的横纵坐标3.输入插值点4.调用函数,返回z函数语句与形参说明程序源代码如下:#include<iostream>#include<math.h>using namespace std;#define N 100double fun(double *x,double *y, int n,double p);void main(){int i,n;cout<<"输入节点的个数n:";cin>>n;double x[N], y[N],p;cout<<"please input xiangliang x= "<<endl;for(i=0;i<n;i++)cin>>x[i];cout<<"please input xiangliang y= "<<endl;for(i=0;i<n;i++)cin>>y[i];cout<<"please input LagelangrichazhiJieDian p= "<<endl;cin>>p;cout<<"The Answer= "<<fun(x,y,n,p)<<endl;system("pause") ;}double fun(double x[],double y[], int n,double p){double z=0,s=1.0;int k=0,i=0;double L[N];while(k<n){ if(k==0){ for(i=1;i<n;i++)s=s*(p-x[i])/(x[0]-x[i]);L[0]=s*y[0];k=k+1;}else{s=1.0;for(i=0;i<=k-1;i++)s=s*((p-x[i])/(x[k]-x[i]));for(i=k+1;i<n;i++) s=s*((p-x[i])/(x[k]-x[i]));L[k]=s*y[k];k++;}}for(i=0;i<n;i++)z=z+L[i];return z;}五.实验分析n=2时,为一次插值,即线性插值n=3时,为二次插值,即抛物线插值n=1,此时只有一个节点,插值点的值就是该节点的函数值n<1时,结果都是返回0的;这里做了n=0和n=-7两种情况3<n<100时,也都有相应的答案常用的是线性插值和抛物线插值,显然,抛物线精度相对高些n次插值多项式Ln(x)通常是次数为n的多项式,特殊情况可能次数小于n.例如:通过三点的二次插值多项式L2(x),如果三点共线,则y=L2(x)就是一条直线,而不是抛物线,这时L2(x)是一次式。
计算方法与计算 实验一误差分析

% 输出的量--每次迭代次数k和迭代值xk,
%
--每次迭代的绝对误差juecha和相对误差xiangcha,
误差分析
误差问题是数值分析的基础,又是数值分析中一个困难的课题。在实际计算 中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。 因此,选取算法时注重分析舍入误差的影响,在实际计算中是十分重要的。同时, 由于在数值求解过程中用有限的过程代替无限的过程会产生截断误差,因此算法 的好坏会影响到数值结果的精度。 一、实验目的
因为运行后输出结果为: y 1.370 762 168 154 49, yˆ =1.370 744 664 189
38, R 1.750 396 510 491 47e-005, WU= 1.782 679 830 970 664e-005 104 . 所
以, yˆ 的绝对误差为 10 4 ,故 y
③ 运行后输出计算结果列入表 1–1 和表 1-2 中。
④ 将算法 2 的 MATLAB 调用函数程序的函数分别用 y1=15-2*x^2 和
y1=x-(2*x^2+x-15)/(4*x+1)代替,得到算法 1 和算法 3 的调用函数程序,将其保
存,运行后将三种算法的前 8 个迭代值 x1, x2 ,, x8 列在一起(见表 1-1),进行
的精确解 x* 2.5 比较,观察误差的传播.
算法 1 将已知方程化为同解方程 x 15 2x2 .取初值 x0 2 ,按迭代公式
xk1 15 2xk2
计算方法实验报告习题2(浙大版)

计算方法实验报告实验名称: 实验2 列主元素消去法解方程组 1 引言工程实际问题中,线型方程的系数矩阵一般为低阶稠密矩阵和大型稀疏矩阵。
用高斯消去法解Ax =b 时,可能出现)(k kk a 很小,用作除数会导致中间结果矩阵元素数量级严重增长和舍入误差的扩散,使结果不可靠;采用选主元素的三角分解法可以避免此类问题。
高斯消去法的消去过程,实质上是将A 分解为两个三角矩阵的乘积A =LU ,并求解Ly =b 的过程。
回带过程就是求解上三角方程组Ux =y 。
所以在实际的运算中,矩阵L 和U 可以直接计算出,而不需要任何中间步骤,从而在计算过程中将高斯消去法的步骤进行了进一步的简略,大大提高了运算速度,这就是三角分解法。
采用选主元的方式与列主元高斯消去法一样,也是为了避免除数过小,从而保证了计算的精确度。
2 实验目的和要求通过列主元素消去法求解线性方程组,实现P A =LU 。
要求计算解x ,L ,U ,整形数组IP (i ),(i =1,2,…,)(记录主行信息)。
3 算法原理与流程图(1)原理将A 分解为两个三角矩阵的乘积A =LU 。
对方程组的增广矩阵[]b A A ,=经过k-1步分解后,可变成如下形式:⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡→-------------n nnnjnkk n n n i in ij ik k i i i k kn kj kk k k k k k n k j k k k k k k k n j k k n j k k b a a a l l l b a a a l l l b a a a l l l y u u u u l l y u u u u u l y u u u u u u A1,211,211,211,1,1,11,12,11,122221,2222111,1,11,11211第k 步分解,为了避免用绝对值很小的数kku 作除数,引进量1111 (,1,,;1,2,,) ()/ (1,2,,;1,2,,)k kj kj km mj m k ik ik im mk kk m u a l u j k k n k n l a l u u i k k n k n -=-=⎧=-=+=⎪⎪⎨⎪=-=++=⎪⎩∑∑11(,1,,)k i ik im mkm s a l u i k k n -==-=+∑,于是有kk u =ks 。
计算方法-解线性方程组的直接法实验报告

cout<<endl;
for(k=i+1;k<m;k++)
{
l[k][i]=a[k][i]/a[i][i];
for(r=i;r<m+1;r++) /*化成三角阵*/
a[k][r]=a[k][r]-l[k][i]*a[i][r];
}
}
x[m-1]=a[m-1][m]/a[m-1][m-1];
{
int i,j;
float t,s1,s2;
float y[100];
for(i=1;i<=n;i++) /*第一次回代过程开始*/
{
s1=0;
for(j=1;j<i;j++)
{
t=-l[i][j];
s1=s1+t*y[j];
}
y[i]=(b[i]+s1)/l[i][i];
}
for(i=n;i>=1;i--) /*第二次回代过程开始*/
s2=s2+l[i][k]*u[k][r];
l[i][r]=(a[i][r]-s2)/u[r][r];
}
}
printf("array L:\n");/*输出矩阵L*/ for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%7.3f ",l[i][j]);
printf("\n");
{
s2=0;
for(j=n;j>i;j--)
计算方法实验报告(附代码)

实验一 牛顿下山法实验说明:求非线性方程组的解是科学计算常遇到的问题,有很多实际背景.各种算法层出不穷,其中迭代是主流算法。
只有建立有效的迭代格式,迭代数列才可以收敛于所求的根。
因此设计算法之前,对于一般迭代进行收敛性的判断是至关重要的。
牛顿法也叫切线法,是迭代算法中典型方法,只要初值选取适当,在单根附近,牛顿法收敛速度很快,初值对于牛顿迭代 至关重要。
当初值选取不当可以采用牛顿下山算法进行纠正。
牛顿下山公式:)()(1k k k k x f x f x x '-=+λ下山因子 ,,,,322121211=λ下山条件|)(||)(|1k k x f x f <+实验代码:#include<iostream> #include<iomanip> #include<cmath>using namespace std;double newton_downhill(double x0,double x1); //牛顿下山法函数,返回下山成功后的修正初值double Y; //定义下山因子Y double k; //k为下山因子Y允许的最小值double dfun(double x){return 3*x*x-1;} //dfun()计算f(x)的导数值double fun1(double x){return x*x*x-x-1;} //fun1()计算f(x)的函数值double fun2(double x) {return x-fun1(x)/dfun(x);} //fun2()计算迭代值int N; //N记录迭代次数double e; //e表示要求的精度int main(){double x0,x1;cout<<"请输入初值x0:";cin>>x0;cout<<"请输入要求的精度:";cin>>e;N=1;if(dfun(x0)==0){cout<<"f'(x0)=0,无法进行牛顿迭代!"<<endl;}x1=fun2(x0);cout<<"x0"<<setw(18)<<"x1"<<setw(18)<<"e"<<setw(25)<<"f(x1)-f(x0)"<<endl;cout<<setiosflags(ios::fixed)<<setprecision(6)<<x0<<" "<<x1<<" "<<fabs(x1-x0)<<" "<<fabs(fun1(x1))-fabs(fun1(x0))<<endl;if(fabs(fun1(x1))>=fabs(fun1(x0))){ //初值不满足要求时,转入牛顿下山法x1=newton_downhill(x0,x1);} //牛顿下山法结束后,转入牛顿迭代法进行计算while(fabs(x1-x0)>=e){ //当精度不满足要求时N=N+1;x0=x1;if(dfun(x0)==0){cout<<"迭代途中f'(x0)=0,无法进行牛顿迭代!"<<endl;} x1=fun2(x0);cout<<setiosflags(ios::fixed)<<setprecision(6)<<x0<<" "<<x1<<" "<<fabs(x1-x0)<<endl;}cout<<"迭代值为:"<<setiosflags(ios::fixed)<<setprecision(6)<<x1<<'\n';cout<<"迭代次数为:"<<N<<endl;return 0;}double newton_downhill(double x0,double x1){Y=1;cout<<"转入牛顿下山法,请输入下山因子允许的最小值:";cin>>k;while(fabs(fun1(x1))>=fabs(fun1(x0))){if(Y>k){Y=Y/2;}else {cout<<"下山失败!";exit(0);}x1=x0-Y*fun1(x0)/dfun(x0);}//下山成功则cout<<"下山成功!Y="<<Y<<",转入牛顿迭代法计算!"<<endl;return x1;}实验结果:图4.1G-S 迭代算法流程图实验二 高斯-塞德尔迭代法实验说明:线性方程组大致分迭代法和直接法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算方法》实验报告
姓名:
班级:
学号:
实验日期: 2011年10月26日
一、实验题目:
数值积分
二、实验目的:
1.熟悉matlab 编写及运行数值计算程序的方法。
2.进一步理解数值积分的基础理论。
3.进一步掌握应用不同的数值积分方法求解给定的积分并给出数据结果及误差分析。
三、实验内容:
1.分别用复合梯形求积公式及复合辛普森求积公式计算积分xdx x ln 10
⎰
,
要求计算精度达到410-,给出计算结果并比较两种方法的计算节点数. 2.用龙贝格求积方法计算积分dx x x ⎰+3
021,使误差不超过510-.
3.用3=n 的高斯-勒让德公式计算积分⎰3
1
sin x e x ,给出计算结果.
4.用辛普森公式(取2==M N ) 计算二重积分.5
.00
5
.00
dydx e x y ⎰
⎰
-
四、实验结果:
1.(1)复合梯形法:
将区间[a,b]划分为n 等份,分点n k n
a
b h kh a x k ,2,1,0,,=-=+=在每个区间[1,+k k x x ](k=0,1,2,···n-1)上采用梯形公式,则得
)()]()([2)()(1
11
1
f R x f x f h dx x f dx x f I n n k k k b
a
n k x x k k
++===∑⎰∑⎰
-=+-=+
故)]()(2)([21
1
b f x f a f h
T n k k n ++=∑-=称为复合梯形公式
计算步长和划分的区间
Eps=1E-4
h1=sqrt(Eps/abs(-(1-0)/12*1/(2+1))) h1 =0.0600 N1=ceil(1/h1) N1 =17
用复合梯形需要计算17个结点。
复合梯形:
function T=trap(f,a,b,n) h=(b-a)/n;
T=0;
for k=1:(n-1); x0=a+h*k;
T=T+limit(f,x0); end;
T=h*(limit(f,a)+limit(f,b))/2+h*T; T=double(T);
(2)复合辛普森:
将区间[a,b]划分为n 等份,在每个区间[1,+k k x x ](k=0,1,2,···n-1)上采用辛普森公式,若记h x x k k 2
1
2/1+
=+,则得 )()]()(4)([6)()(1
12/11
1
f R x f x f x f h dx x f dx x f I n n k k k k b
a
n k x x k k
+++===∑⎰∑⎰
-=++-=+
记)]()(2)(4)([61
1
102/1b f x f x f a f h
S n k k n k k n +++=∑∑-=-=+为复合辛普森公式
h2=power(Eps/abs(-(1-0)/180*1/(1+4)),1/4) h2 =0.5477 N2=(1/h2) N2=ceil(1/h2) N2 =2
用复合辛普森需要计算2个结点。
复合辛普森:
function S=simpson(f,a,b,n) h=(b-a)/(2*n); s1=0; s2=0; for k=1:n
x0=a+h*(2*k-1); s1=s1+limit(f,x0); end
for k=1:(n-1)
x0=a+h*2*k; s2=s2+limit(f,x0); end
S=h*(limit(f,a)+limit(f,b)+4*s1+2*s2)/3; S=double(S);
2.龙贝格算法思想:
(1)将区间[a,b]划分为n 等分,分点为:(n x x x 10,);根据梯形公式
)]()(2)([21
1
b f x f a f h
T n k k n ++=∑-=,求出n T ,再根据n T 和n T 2之间的递推公式
n T 2∑-=++=
1
2/1)(22n k k n x f h T 求出n T 2 (2)设m 为加速次数,k 为划分区间次数,则由加速公式:
)2,1(1
41144)(1)1(1)( =---=-+-k T T T
k m m
k m m m k m
求出第k 次划分,第m 次加速次数的梯形值)(k m T ,这样不断地循环,直到求出在满足精度条件下的某个)
(k m T 作为积分值
为止。
function [I,T]=romberg(f,a,b,n,Eps) if nargin<5 Eps=1E-5; end m=1; h=b-a; err=1; j=0; x=a;
T=zeros(4,4);
T(1,1)=h*(limit(f,a)+limit(f,b))/2; while((err>Eps)&&(j<n)||(j<4)) j=j+1; h=h/2; s=0;
for p=1:m;
x=a+h*(2*p-1); s=s+limit(f,x); end
T(j+1,1)=T(j,1)/2+h*s; m=2*m; for k=1:j
T(j+1,k+1)=T(j+1,k)+(T(j+1,k)-T(j,k))/(4^k-1); end
err=abs(T(j,j)-T(j+1,k+1)); end
I=T(j+1,j+1);
输入的命令:
syms x;
f=sym(x*(1+x^2)^(1/2)); [I,T]=romberg(f,0,3,4,1E-5)
以上为3.高斯-勒让德算法:
先做变换,将积分区间变换到[-1,1],令2
2a
b t a b x ++-=则有 ⎰⎰
-++=1
1
)2(3
1
)2sin()sin(*dt t e dx x e t x
,再利用高斯-勒让德求积公式求解。
f=inline('exp(t+2).*sin(t+2)')
x=[-0.8611363,-0.33399810,0.33399810,0.8611363]; A=[0.3478548,0.6521452,0.6521452,0.3478548]; I=0;
for i=1:length(x)
I=I+feval(f,x(i)).*A(i); end
I=10.9676
即由高斯勒让德公式得到的结果为I=10.9676 4.辛普森公式计算二重积分:
将二次积分转化成两个一次积分做乘积的形式,分别对两个一次积分用辛普森公式,求积最终得到二次积分的结果。
function s=simprl(f,a,b,n) %f 是被积函数
%a,b 分别为积分的上下限 %n 是子区间的个数 %s 是梯形总面积 h=(b-a)/(2*n); s1=0; s2=0; for k=1:n
x=a+h*(2*k-1); s1=s1+feval('f',x); end
for k=1:(n-1) x=a+h*2*k;
s2=s2+feval('f',x); end
s=h*(feval('f',a)+feval('f',b)+4*s1+2*s2)/3; 第一两个 .m 文件 function y=f(x) y=exp(-x);
function y=g(x)
y=exp(-x);
输入simprl('exp(-x)',0,0.5,1)
ans =
0.393477815999854
输入simprl('exp(x)',0,0.5,1)
ans =
0.648735244787591
.5.00
5
.00
dydx e x y ⎰⎰
-=0.393477815999854*0.648735244787591=
0.255262927281152
五、实验体会或遇到问题:
在本次试验当中,遇到了很多问题,如在区间端点没有定义,这都需要考虑,将其中的原理整理清楚是最重要的。
有了这次课内实验,帮助自己把学的知识巩固了一遍。