计算方法实验报告(高尚版)

合集下载

计算方法实验报告

计算方法实验报告

计算方法实验报告计算方法实验报告概述:计算方法是一门研究如何用计算机解决数学问题的学科。

在本次实验中,我们将学习和应用几种常见的计算方法,包括数值逼近、插值、数值积分和常微分方程求解。

通过实验,我们将深入了解这些方法的原理、应用场景以及其在计算机科学和工程领域的重要性。

数值逼近:数值逼近是一种通过使用近似值来计算复杂函数的方法。

在实验中,我们通过使用泰勒级数展开和牛顿迭代法等数值逼近技术,来计算函数的近似值。

这些方法在科学计算和工程领域中广泛应用,例如在信号处理、图像处理和优化问题中。

插值:插值是一种通过已知数据点来估算未知数据点的方法。

在实验中,我们将学习和应用拉格朗日插值和牛顿插值等方法,以及使用这些方法来构造函数的近似曲线。

插值技术在数据分析、图像处理和计算机图形学等领域中具有重要的应用价值。

数值积分:数值积分是一种通过将函数曲线划分为小矩形或梯形来估算函数的积分值的方法。

在实验中,我们将学习和应用矩形法和梯形法等数值积分技术,以及使用这些方法来计算函数的近似积分值。

数值积分在物理学、金融学和统计学等领域中被广泛使用。

常微分方程求解:常微分方程求解是一种通过数值方法来求解微分方程的方法。

在实验中,我们将学习和应用欧拉法和龙格-库塔法等常微分方程求解技术,以及使用这些方法来求解一些常见的微分方程。

常微分方程求解在物理学、生物学和工程学等领域中具有广泛的应用。

实验结果:通过实验,我们成功地应用了数值逼近、插值、数值积分和常微分方程求解等计算方法。

我们得到了准确的结果,并且在不同的应用场景中验证了这些方法的有效性和可靠性。

这些实验结果将对我们进一步理解和应用计算方法提供重要的指导和支持。

结论:计算方法是计算机科学和工程领域中的重要学科,它提供了解决复杂数学问题的有效工具和方法。

通过本次实验,我们深入了解了数值逼近、插值、数值积分和常微分方程求解等计算方法的原理和应用。

这些方法在科学研究、工程设计和数据分析等领域中具有广泛的应用价值。

计算方法_实验报告

计算方法_实验报告

一、实验目的1. 理解并掌握计算方法的基本概念和原理;2. 学会使用计算方法解决实际问题;3. 提高编程能力和算法设计能力。

二、实验内容本次实验主要涉及以下内容:1. 线性方程组的求解;2. 多项式插值;3. 牛顿法求函数零点;4. 矩阵的特征值和特征向量求解。

三、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 科学计算库:NumPy、SciPy四、实验步骤及结果分析1. 线性方程组的求解(1)实验步骤a. 导入NumPy库;b. 定义系数矩阵A和增广矩阵b;c. 使用NumPy的linalg.solve()函数求解线性方程组。

(2)实验结果设系数矩阵A和增广矩阵b如下:A = [[2, 1], [1, 2]]b = [3, 2]解得:x = [1, 1]2. 多项式插值(1)实验步骤a. 导入NumPy库;b. 定义插值点x和对应的函数值y;c. 使用NumPy的polyfit()函数进行多项式拟合;d. 使用poly1d()函数创建多项式对象;e. 使用多项式对象计算插值点对应的函数值。

(2)实验结果设插值点x和对应的函数值y如下:x = [1, 2, 3, 4, 5]y = [1, 4, 9, 16, 25]拟合得到的二次多项式为:f(x) = x^2 + 1在x = 3时,插值得到的函数值为f(3) = 10。

3. 牛顿法求函数零点(1)实验步骤a. 导入NumPy库;b. 定义函数f(x)和导数f'(x);c. 设置初始值x0;d. 使用牛顿迭代公式进行迭代计算;e. 判断迭代结果是否满足精度要求。

(2)实验结果设函数f(x) = x^2 - 2x - 3,初始值x0 = 1。

经过6次迭代,得到函数零点x ≈ 3。

4. 矩阵的特征值和特征向量求解(1)实验步骤a. 导入NumPy库;b. 定义系数矩阵A;c. 使用NumPy的linalg.eig()函数求解特征值和特征向量。

大学计算方法实验报告

大学计算方法实验报告

《计算方法》实验报告实验题目实验报告1:非线性方程组的求解···················P1~2实验报告2:线性方程组解法·······················P3~4 实验报告3:Lagrange 插值多项式··················P5~7姓名:学号:班级:指导老师:时间:专业 序号 日期实验报告1:非线性方程组的求解【实验目的】1.用MATLAB 来实践进行牛顿法的变形,即对牛顿法进行了修正,使其应用更为方便,掌握用MATLAB 运用割线法求解非线性方程组。

2.运用MATLAB 进行隐函数作图。

【实验内容】[方法] 设a,b 为迭代初值,求两点(a,f(a)) 与 (b,f(b)) 的连线(割线)与 x 轴的交点记为 c ,再把迭代初值换成 b,c,重复计算.[要求] 把下面程序复制为新的 M-文件,去掉开头的 %再把 '?' 部分改写正确就是一个完整的程序,找前面一个例子试算【解】在牛顿迭代公式中用差商代替导数。

带入初值(a,f(a)),(b,f(b)),两点的连线与x 轴的交点作为c ,再把迭代初值换为b ,c ,重复计算。

【计算机求解】以y= x-exp(-x)为例初值a=0,b=1,误差不超过1.0*10^(-5)进行计算。

《计算方法》实验报告材料

《计算方法》实验报告材料

《计算方法》实验报告材料引言:计算方法是一门应用数学的基础课程,通过实验教学,能够帮助学生更好地理解和掌握各种数值计算的方法和技巧。

本次实验旨在通过编程实现一些常用的数值计算方法,并通过对比分析实验结果,验证方法的有效性和可行性。

实验一:插值算法插值算法是利用已知的数据点,构建一个连续函数以逼近数据的方法。

本次实验中使用的插值算法为拉格朗日插值和牛顿插值。

通过编程实现这两种算法,并选取若干个数据点进行测试,得到插值函数的结果。

通过比较原始数据和插值函数的结果,可以验证插值算法的准确性和可行性。

实验二:方程求解方程求解是数值计算中的一个重要问题,求解非线性方程、线性方程组和特征值问题等都需要采用相应的迭代方法。

本次实验中,我们实现了常用的牛顿迭代法和二分法,并选择数学问题进行求解。

通过比较实验结果和理论值的误差,可以验证求解方法的精确性和可行性。

实验三:数值积分数值积分是利用数值方法对定积分进行近似求解的过程。

本次实验中,我们实现了矩形法、梯形法和辛普森法等常用的数值积分方法,并选取若干函数进行数值积分的计算。

通过比较数值积分的结果和解析解或数值解的误差,可以验证数值积分方法的准确性和可行性。

实验四:常微分方程求解常微分方程求解是数值计算中的一个重要问题,常常涉及到物理、化学、生物等科学领域。

本次实验中,我们实现了欧拉方法和龙格-库塔方法等常用的常微分方程求解算法,并选取若干常微分方程进行求解。

通过比较数值解和解析解或数值解的误差,可以验证常微分方程求解方法的精确性和可行性。

实验五:线性方程组求解线性方程组求解是数值计算中的一个重要问题,常常涉及到矩阵的运算和迭代方法。

本次实验中,我们实现了高斯消元法和追赶法等常用的线性方程组求解算法,并选择一些矩阵进行求解。

通过比较数值解和解析解或数值解的误差,可以验证线性方程组求解方法的精确性和可行性。

结论:通过本次实验,我们掌握了插值算法、方程求解、数值积分、常微分方程求解和线性方程组求解等常用的计算方法。

计算方法课程实验报告

计算方法课程实验报告
}
double lagrange(int n,vector<double>&x,vector<double>&y,double x){ double result=0; for(int i=0;i<n;i++){ double temp=y[i]; for(int j=0;j<n;j++){ if(i!=j){ temp = temp*(x-x[j]); temp = temp/(x[i]-x[j]); } } result += temp;
课程实验报告
课程名称:
专业班级: 学 号: 姓 名: 指导教师: 报告日期:
计算方法
信安 1302 班 U201315130
王超 付才 2015.5.2
计算机科学与技术学院
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,通力根1保过据护管生高线产中敷工资设艺料技高试术中卷0资不配料仅置试可技卷以术要解是求决指,吊机对顶组电层在气配进设置行备不继进规电行范保空高护载中高与资中带料资负试料荷卷试下问卷高题总中2体2资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况1卷中下安,与全要过,加度并强工且看作尽护下可1都关能可于地以管缩正路小常高故工中障作资高;料中对试资于卷料继连试电接卷保管破护口坏进处范行理围整高,核中或对资者定料对值试某,卷些审弯异核扁常与度高校固中对定资图盒料纸位试,置卷编.工保写况护复进层杂行防设自腐备动跨与处接装理地置,线高尤弯中其曲资要半料避径试免标卷错高调误等试高,方中要案资求,料技编试术写5、卷交重电保底要气护。设设装管备备置线4高、调动敷中电试作设资气高,技料课中并3术试、件资且中卷管中料拒包试路调试绝含验敷试卷动线方设技作槽案技术,、以术来管及避架系免等统不多启必项动要方高式案中,;资为对料解整试决套卷高启突中动然语过停文程机电中。气高因课中此件资,中料电管试力壁卷高薄电中、气资接设料口备试不进卷严行保等调护问试装题工置,作调合并试理且技利进术用行,管过要线关求敷运电设行力技高保术中护。资装线料置缆试做敷卷到设技准原术确则指灵:导活在。。分对对线于于盒调差处试动,过保当程护不中装同高置电中高压资中回料资路试料交卷试叉技卷时术调,问试应题技采,术用作是金为指属调发隔试电板人机进员一行,变隔需压开要器处在组理事在;前发同掌生一握内线图部槽 纸故内资障,料时强、,电设需回备要路制进须造行同厂外时家部切出电断具源习高高题中中电资资源料料,试试线卷卷缆试切敷验除设报从完告而毕与采,相用要关高进技中行术资检资料查料试和,卷检并主测且要处了保理解护。现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

《计算方法》课内实验报告(实验2)2014

《计算方法》课内实验报告(实验2)2014

《计算方法》课内实验报告学生姓名:张靖2012309010111及学号:学院:理学院班级:信计121课程名称:计算方法实验题目:插值法与函数逼近指导教师周硕教授姓名及职称:朱振菊实验师2014年11月03日目录一、实验题目 (1)二、实验目的 (1)三、实验内容 (1)四、实验结果 (2)五、实验体会或遇到问题 (8)一、实验题目1.熟悉matlab 编写及运行数值计算程序的方法。

2.进一步理解数值积分的基础理论。

3.进一步掌握应用不同的数值积分方法求解给定的积分并给出数据结果及误差分析。

二、实验目的1.熟悉matlab 编写及运行数值计算程序的方法。

2.进一步理解插值法及函数逼近方法的理论基础。

3.进一步掌握给定数据后应用插值法及函数逼近方法进行数据处理并给出图示结果的实际操作过程。

三、实验内容1.分别用复合梯形求积公式及复合辛普森求积公式计算积分xdx x ln 1⎰,要求计算精度达到410-,给出计算结果并比较两种方法的计算节点数. 2.用龙贝格求积方法计算积分dx x x ⎰+3021,使误差不超过510-.3.用3=n 的高斯-勒让德公式计算积分⎰31sin x e x ,给出计算结果.4.用辛普森公式 (取2==M N ) 计算二重积分.5.005.00dydx e x y ⎰⎰-四、 实验结果1.问题1:计算结果如下表表1问题1求解表复合梯形求积公式:取1210-,n=,n为迭代次数,当迭代12次后,精度达到4 n-;节点数为21=4095复合辛普森求积公式:取1000010-,节点数为n=,n为区间数,取精度为4n+=。

1100012.问题2:计算结果如下表表2问题2求解表龙贝格数值积分:给定被积函数0,被积上限3,精度为510-,龙贝格积分表中行的最大数目13,计算出龙贝格数值积分近似解为10.20759362。

3.问题3:计算结果如下表表3问题3求解表高斯-勒让德积分公式:取3n = ,节点横坐标k x 取,n k A 取585999,,,2n 阶导数e sin x x -,求得高斯-勒让德积分近似解为10.94840256。

计算方法实验报告

计算方法实验报告

实验报告一、求方程f(x)=x^3-sinx-12x+1的全部根, ε=1e -6 1、 用一般迭代法; 2、 用牛顿迭代法;并比较两种迭代的收敛速度。

一、首先,由题可求得:12cos 3)(2'--=x x x f . 其次,分析得到其根所在的区间。

① 令()0=x f ,可得到x x x sin 1123=+-.② 用一阶导数分析得到1123+-x x 和x sin 两个函数的增减区间;再用二阶导数分析得到两个函数的拐点以及凹凸区间.③ 在直角坐标轴上描摹出01123=+-x x 和0sin =x 的图,在图上可以看到他们的交点,然后估计交点所在的区间,即是所要求的根的区间。

经过估计,得到根所在的区间为[]3,4--,[]1,0和[]4,3.1、 一般迭代法 (1)算法步骤:设ε为给定的允许精度,迭代法的计算步骤为:① 选定初值0x .由()0=x f 确定函数()x g ,得等价形式()x g x =. ② 计算()0x g .由迭代公式得()01x g x =.③ 如果ε≤-01x x ,则迭代结束,取1x 为解的近似值;否则,用1x 代替0x ,重复步骤②和步骤③. (2)程序代码: ① 在区间[]3,4--内, 代码: clcx0=-3.5; %初值0xiter_max=100; %迭代的最大次数 ep=1e-6; %允许精度 ε k=0;while k<=iter_max %k 从0开始到iter_max 循环 x1=(sin(x0)+12*x0-1).^(1/3); %代入0x ,算出1x 的值 if abs(x1-x0)<ep %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endx0=x1; %条件ε≤-01x x 不成立,用1x 代替0x k=k+1; %k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star = -3.4101 ;iter =14②在区间[]1,0内,代码: clcx0=0.5; %初值0xiter_max=100; %迭代的最大次数 ep=1e-6; %允许精度ε k=0;while k<=iter_max %k 从0开始到iter_max 循环 x1=(1/12)*(x0.^3-sin(x0)+1); %代入0x ,算出1x 的值 if abs(x1-x0)<ep %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环endx0=x1; %条件ε≤-01x x 不成立,用1x 代替0x k=k+1; %k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 结果:x_star = 0.07696;iter =6③在区间[]4,3内, 代码: clcx0=3.5; %初值0xiter_max=100; %迭代的最大次数 ep=1e-6; %允许精度ε k=0;while k<=iter_max %k 从0开始到iter_max 循环 x1=(sin(x0)+12*x0-1).^(1/3); %代入0x ,算出1x 的值 if abs(x1-x0)<ep %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endx0=x1; %条件ε≤-01x x 不成立,用1x 代替0x k=k+1; %k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star = 3.4101 ;iter =102、 牛顿迭代法 (1)算法步骤:① 选定初值0x ,计算()0x f ,()0'x f .② 按公式()()k k k k x f x f x x '1-=+迭代,得新的近似值1+k x ,并计算()1+k x f ,()1'+k x f . ③ 对于给定的允许精度ε,如果ε≤-+k k x x 1,则终止迭代,取1*+≈k x x ;否则,1+=k k ,在转回步骤②计算.(2)程序代码: ①在区间[]3,4--内, clcx1=-3.5; %初值1x k=0;while k<=100 %k 从0开始到100循环 x0=x1; %将初值1x 赋给0xf0=x0.^3-sin(x0)-12*x0+1; %计算()0x f f1=3*x0.^2-cos(x0)-12; %计算()0'x f x1=x0-f0/f1; %计算得到新的近似值1xif abs(x1-x0)< 1.0e-6 %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endk=k+1; %条件ε≤-01x x 不成立,k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star = -3.4911;iter =2②在区间[]1,0内,clcx1=0.5; %初值1x k=0;while k<=100 %k 从0开始到100循环 x0=x1; %将初值1x 赋给0xf0=x0.^3-sin(x0)-12*x0+1; %计算()0x f f1=3*x0.^2-cos(x0)-12; %计算()0'x f x1=x0-f0/f1; %计算得到新的近似值1xif abs(x1-x0)< 1.0e-6 %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endk=k+1; %条件ε≤-01x x 不成立,k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star =0.07696 ;iter =3③在区间[]4,3内, clcx1=3.5; %初值1x k=0;while k<=100 %k 从0开始到100循环 x0=x1; %将初值1x 赋给0xf0=x0.^3-sin(x0)-12*x0+1; %计算()0x f f1=3*x0.^2-cos(x0)-12; %计算()0'x f x1=x0-f0/f1; %计算得到新的近似值1xif abs(x1-x0)< 1.0e-6 %01x x -与允许精度作比较 break ; %条件ε≤-01x x 成立,跳出循环 endk=k+1; %条件ε≤-01x x 不成立,k 加1 endx_star=x1, iter=k %1x 为解的近似值,iter 为迭代次数 运行结果:x_star =3.4101;iter =33、运行结果:4、结果分析:从这题的结果可以看出,牛顿迭代法的迭代速度比一般迭代法的速度要快,牛顿法的迭代次数比较少。

计算方法实验报告

计算方法实验报告

计算方法实验报告实验目的:1.掌握计算方法的基本概念和算法;2.熟悉常见计算方法的实现步骤和注意事项;3.学会使用计算方法解决实际问题。

实验内容:1.实现二分法;2.实现牛顿迭代法;3.实现高斯消去法。

实验步骤:1.实现二分法:1.1定义函数f(x);1.2 确定初始区间[a, b]和精度tol;1.3计算区间中点c;1.4判断f(a)和f(c)的符号关系并更新区间;1.5重复步骤1.3和1.4直到满足精度要求。

2.实现牛顿迭代法:2.1定义函数f(x);2.2定义函数f的导数;2.3给定初始点x0;2.4计算f(x0)和f'(x0);2.5计算下一个点的近似值x1=x0-f(x0)/f'(x0);2.6重复步骤2.4和2.5直到满足收敛条件。

3.实现高斯消去法:3.1输入线性方程组的系数矩阵A和右端向量b;3.2构造增广矩阵[A,b];3.3进行主元素消去,得到梯形矩阵U和新的右端向量b;3.4回代求解,得到解向量x。

实验结果分析:1.二分法的主要优点是收敛稳定,但需要事先给定初始区间;2.牛顿迭代法的主要优点是收敛速度快,但需要事先给定初始点和收敛条件;3.高斯消去法的主要优点是适用于任何线性方程组,但需要事先进行主元素消去和回代的操作。

实验总结:通过本次实验,我深入理解了计算方法的基本概念和算法,并掌握了二分法、牛顿迭代法和高斯消去法的实现步骤和注意事项。

这些方法在解决实际问题中具有重要的应用价值。

实验过程中,我也遇到了一些困难和挑战,例如初始值的选择和收敛条件的判断。

通过不断的调试和优化,最终成功解决了这些问题。

本次实验不仅提高了我的编程能力,也增加了我的数学建模能力。

希望今后能够继续深入学习计算方法,并将其应用于更加复杂的实际问题中。

计算方法实验报告

计算方法实验报告

1. 熟悉并掌握常用的计算方法,包括数值积分、数值微分、线性方程组求解等。

2. 培养运用计算机进行数值计算的能力。

3. 增强对数值计算误差的分析和判断能力。

二、实验环境1. 操作系统:Windows 102. 编程语言:Python3.83. 库:NumPy、SciPy、Matplotlib三、实验内容1. 数值积分(1)函数:f(x) = x^2(2)区间:[0, 1](3)方法:梯形法、辛普森法、复合梯形法2. 数值微分(1)函数:f(x) = e^x(2)点:x = 1(3)方法:有限差分法、中点法、牛顿法3. 线性方程组求解(1)方程组:2x + 3y - z = 8-x + 2y + 2z = -3x - y + 3z = 5(2)方法:高斯消元法、LU分解法1. 数值积分(1)编写函数f(x) = x^2(2)定义积分区间[0, 1](3)实现梯形法、辛普森法、复合梯形法(4)计算积分结果2. 数值微分(1)编写函数f(x) = e^x(2)定义点x = 1(3)实现有限差分法、中点法、牛顿法(4)计算导数结果3. 线性方程组求解(1)定义方程组系数矩阵A和常数向量b(2)实现高斯消元法、LU分解法(3)求解方程组(4)输出解向量x五、实验结果与分析1. 数值积分(1)梯形法:积分结果约为1.6667(2)辛普森法:积分结果约为1.6447(3)复合梯形法:积分结果约为1.6458分析:三种方法计算结果接近,但辛普森法误差最小。

2. 数值微分(1)有限差分法:导数结果约为2.7183(2)中点法:导数结果约为2.7183(3)牛顿法:导数结果约为2.7183分析:三种方法计算结果一致,误差较小。

3. 线性方程组求解(1)高斯消元法:解向量x = [2, 1, 1](2)LU分解法:解向量x = [2, 1, 1]分析:两种方法求解结果一致,且解向量正确。

六、实验总结本次实验通过Python编程,实现了数值积分、数值微分和线性方程组求解。

《计算方法》实验报告

《计算方法》实验报告

《计算方法》实验报告一、实验目的本次《计算方法》实验的主要目的是通过实际操作和编程实现,深入理解和掌握常见的计算方法在解决数学问题中的应用。

通过实验,提高我们运用数学知识和计算机技术解决实际问题的能力,培养我们的逻辑思维和创新能力。

二、实验环境本次实验使用的编程语言为 Python,使用的开发工具为 PyCharm。

实验运行的操作系统为 Windows 10。

三、实验内容与步骤1、线性方程组的求解实验内容:使用高斯消元法和LU分解法求解线性方程组。

实验步骤:首先,定义线性方程组的系数矩阵和常数向量。

对于高斯消元法,通过逐步消元将系数矩阵化为上三角矩阵,然后回代求解。

对于 LU 分解法,将系数矩阵分解为下三角矩阵 L 和上三角矩阵 U,然后通过向前和向后代换求解。

2、插值与拟合实验内容:使用拉格朗日插值法、牛顿插值法进行插值计算,并使用最小二乘法进行曲线拟合。

实验步骤:对于拉格朗日插值法和牛顿插值法,根据给定的节点数据计算插值多项式。

对于最小二乘法,根据给定的数据点和拟合函数形式,计算拟合参数。

3、数值积分实验内容:使用矩形法、梯形法和辛普森法计算定积分。

实验步骤:定义被积函数和积分区间。

对于矩形法,将积分区间等分为若干小区间,每个小区间用矩形面积近似积分值。

梯形法通过构建梯形来近似积分值。

辛普森法利用抛物线来近似积分值。

4、常微分方程的数值解法实验内容:使用欧拉法和改进的欧拉法求解常微分方程。

实验步骤:给定常微分方程和初始条件。

按照欧拉法和改进的欧拉法的公式进行迭代计算,得到数值解。

四、实验结果与分析1、线性方程组的求解高斯消元法和 LU 分解法都能成功求解线性方程组,但在计算效率和数值稳定性上可能存在差异。

对于规模较大的线性方程组,LU 分解法通常更具优势。

实验中通过对比不同方法求解相同线性方程组的结果,验证了算法的正确性。

2、插值与拟合拉格朗日插值法和牛顿插值法在给定节点处能够准确插值,但对于节点之外的区域,可能会出现较大偏差。

计算方法实验二

计算方法实验二

《计算方法》实验报告实验二插值法二级学院:计算机学院专业:计算机科学与技术指导教师:爨莹班级学号:姓名:实验二插值法1、实验目的:1、掌握直接利用拉格郎日插值多项式计算函数在已知点的函数值;观察拉格郎日插值的龙格现象。

2、了解Hermite插值法、三次样条插值法原理,结合计算公式,确定函数值。

2、实验要求:1、认真分析题目的条件和要求,复习相关的理论知识,选择适当的解决方案和算法;2、编写上机实验程序,作好上机前的准备工作;3、上机调试程序,并试算各种方案,记录计算的结果(包括必要的中间结果);4、分析和解释计算结果;5、按照要求书写实验报告;3、实验内容:1、用拉格郎日插值公式确定函数值;对函数f(x)进行拉格郎日插值,并对f(x)与插值多项式的曲线作比较。

2、已知函数表:(0.56160,0.82741)、(0.56280,0.82659)、(0.56401,0.82577)、(0.56521,0.82495)用三次拉格朗日插值多项式求x=0.5635时函数近似值。

3、P129,(12)4、题目:插值法5、原理:拉格朗日插值法是以法国十八世纪数学家约瑟夫·路易斯·拉格朗日命名的一种多项式插值方法。

许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。

如对实践中的某个物理量进行观测,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。

这样的多项式称为拉格朗日(插值)多项式。

数学上来说,拉格朗日插值法可以给出一个恰好穿过二维平面上若干个已知点的多项式函数。

6、设计思想:通过拉格朗日插值法找到拉格朗日多项式,计算某个x对应的y值。

7、对应程序://Lagrange.cpp#include <stdio.h>#include <conio.h>#define N 4int checkvalid(double x[], int n);void printLag (double x[], double y[], double varx, int n);double Lagrange(double x[], double y[], double varx, int n);void main (){double x[N+1] = {0.56160, 0.56280, 0.56401, 0.56521};double y[N+1] = {0.82741, 0.82659, 0.82577, 0.82459};double varx = 0.5635;if (checkvalid(x, N) == 1){printf("\n\n插值结果: P(%f)=%f\n", varx, Lagrange(x, y, varx, N));}else{printf("结点必须互异");}getch();}int checkvalid (double x[], int n){int i,j;for (i = 0; i < n; i++){for (j = i + 1; j < n+1; j++){if (x[i] == x[j])//若出现两个相同的结点,返回-1{return -1;}}}return 1;}double Lagrange (double x[], double y[], double varx, int n){double fenmu;double fenzi;double result = 0;int i,j;printf("Ln(x) =\n");for (i = 0; i < n+1; i++){fenmu = 1;for (j = 0; j < n+1; j++){if (i != j){fenmu = fenmu * (x[i] - x[j]);}}printf("\t%f", y[i] / fenmu);fenzi = 1;for (j = 0; j < n+1; j++){if (i != j){printf("*(x-%f)", x[j]);fenzi = fenzi * (varx - x[j]);}}if (i != n){printf("+\n");}result += y[i] / fenmu * fenzi;}return result;}8、实验结果:9、实验体会:拉格朗日插值法能很好的解决生产和科研中的一些问题,计算机编程的实现有利于其更好的应用。

计算方法实验报告

计算方法实验报告
if (n<=1) printf("\n ");
y_0=y_1;
n--;
if (n%3==0) printf("\n");
}
}
程序运行结果:
%有效的算法%
#include<stdio.h>
#include<math.h>
void main()
{
double y_0=log(5),y_1;
int n=1;
计算方法实验报告
班级:学号:姓名:成绩:
1 舍入误差及稳定性
一、实验目的
(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;
(2)通过上机计算,了解舍入误差所引起的数值不稳定性
二、实验内容
1、用两种不同的顺序计算 ,分析其误差的变化
2、已知连分数 ,利用下面的算法计算 :
写一程序,读入 计算并打印()程序设计:#include<stdio.h>
#include<math.h>
void main()
{
float n=0.0;
int i;
float m=0.0;
int j;
for(i=1;i<=10000;i++)//顺序计算
{
n=n+1.0/(i*i);
}
printf("%-100f",n);
N=30000时:
②用从大到小顺序的C语言算法分别计算S1000,S10000,S30000,结果如下:
N=1000时:
N=10000时:
N=30000时:
四、总结
通过这次上机,学习了解了舍入误差在不同算法时对结果的影响不同,稳定的算法才能获得正确的结果。

计算方法实验报告

计算方法实验报告

实验一:插值法一、实验目的通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C)编程实现数值方法的求解。

并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。

二、实验内容先在屏幕上用随机函数按适当比例画出若干个点(至少7~9),分别用拉格朗日插值,牛顿插值,三次样条插值对上述离散点进行拟和,并用该软件的绘图功能来显示其插值函数。

三、源程序⒈拉格朗日插值:(Lagrange)#include<iostream.h>void main(){float x[3];float y[3];for(int m=0;m<3;m++)cin>>x[m];for(int n=0;n<3;n++)cin>>y[n];for(int k=0;k<3;k++){float s=0;for(int i=0;i<3;i++){float p=1;for(int j=0;j<3;j++)if(i!=j)p=p*((x[k]-x[j])/(x[i]-x[j]));s=s+y[i]*p;}cout<<"("<<x[k]<<","<<s<<")"<<'\n';}}2.牛顿插值:#include<iostream.h>void main(){float x[5];float y[5];float f[5];for(int m=0;m<3;m++)cin>>x[m];for(int n=0;n<3;n++)cin>>y[n];float t=1;for(int k=0;k<5;k++){f[k]=y[k];for(int j=0;j<5;j++)t=t*(x[k]-x[j-1]);for(int i=0;i<(5-j);i++)f[i]=(f[i+1]-f[i])/(x[j+i]-x[i]);y[k]=f[k]+t*f[k];cout<<"y="<<y[k]<<'\n';}}四、实验结果五、实验心得通过此次实验编程,更好的掌握了拉格朗日插值算法,但对于应用上还有很多欠缺,对于牛顿插值更是不熟悉,需要多加练习。

计算方法课程实践实验报告范文

计算方法课程实践实验报告范文

计算方法课程实践实验报告范文In this experiment, we were tasked with applying different computational methods to solve real-world problems. The experiment aimed to enhance our understanding of how these methods could be employed to tackle complex issues in various disciplines. 在这个实验中,我们的任务是应用不同的计算方法来解决现实世界中的问题。

这个实验旨在加强我们对这些方法如何在各种学科中应用来处理复杂问题的理解。

The first part of the experiment involved utilizing numerical methods to solve differential equations. We were given a set of initial conditions and parameters and asked to solve for the behavior of the system over time. This exercise provided valuable insight into the practical application of numerical methods in modeling dynamic systems. 实验的第一部分涉及利用数值方法来解决微分方程。

我们被给定了一组初始条件和参数,并被要求解出系统随时间的行为。

这个练习为模拟动态系统中数值方法的实际应用提供了宝贵的见解。

The second part of the experiment involved the application of optimization algorithms to solve a resource allocation problem. Wehad to determine the optimal distribution of resources to maximize a certain objective function while considering different constraints. This part of the experiment showcased the effectiveness of computational methods in finding optimal solutions for complex decision-making problems. 实验的第二部分涉及应用优化算法来解决资源分配问题。

华南理工大学《计算方法》实验报告

华南理工大学《计算方法》实验报告

华南理工大学《计算方法》实验报告华南理工大学《计算方法》实验报告学院计算机科学与工程专业计算机科学与技术(全英创新班)学生姓名 -------学生学号 ------------指导教师布社辉课程编号 145022课程学分 3 分起始日期 2015年5月28日实验题目一Solution of Nonlinear Equations--Bracketing method and Newton-Raphson method姓名:xxxxxx学号:xxxxxxxxxxxx时间:2015年5月28日【题目】1.Find an approximation (accurate to 10 decimal places) for the interest rate I thatwill yield a total annuity value of $500,000 if 240 monthly payments of $300 are made.2.Consider a spherical ball of radius r = 15 cm that is constructed from a variety ofwhite oak that has a density of ρ = 0.710. How much of the ball (accurate to eight decimal places) will be submerged when it is placed in water?3.To approximate the fixed points (if any) of each function. Answers should beaccurate to 12 decimal places. Produce a graph of each function and the line y = x that clearly shows any fixed points.(a) g(x) = x5 − 3x3 − 2x2 + 2(b) g(x) = cos(sin(x))【实验分析】1.Assume that the value of the k-th month is , the value next month is, whereSo the total annuity value after 240 months is :To find the rate I that satisfied A=5000000, we can find the solution to the equationThe Bisection method can be used to find the solution of .2.The mass of water displaced when a sphere is submerged to a depth d is:The mass of the ball isAppl ying Archimedes’ law, , produce the following equations:So g(d)=, and Bisection method can be used to find the root.3.In this problem, the target is to find the fixed point by fixed point iteration. So wecan use fixed point iteration method to solve the problem.(a),so ,Plot the function g(x) and y=x, it can be seen that there are three fixed point, where ,It can be solved that:for,for,for,So, ,,, they are all repelling fixed point, fixed point iteration method cannot converge to them.(b). From the graph below we know that the fixed point liesbetween 0.5 and 1. Where . So the fixed point is attractive fixed point. I initially guess that p=0.75, and apply fixed point iteration method to find the solution.【实验过程和程序】1.The value of g(I) will change significantly but little change of I, so that it’sunwise to plot the figure about I and g(I). Instead, the interest will be bound by [0,1] by common sense. So I set the left end point of Bisection method to 0, right end point to 1. The precision is set to 1e-10.Code for g(I) is :Code for applying Bisection method is :2.The since the density of the ball is smaller than water, so depth submerged shouldnot be larger than 2r, and not less than 0. So I set the left end point of Bisection method to 0 and right to 2r.Code for g(d) is :Code for applying Bisection method is :3.(a)Code for function g:Code for applying fixed point iteration:Code for plot the graph:(b)Code of this problem is similar to the previous one, so it’s not illustrated here.【实验结果】1.Result for the program is :So the annual interest rate is 31.78710938%2.X-axis is the depth and Y-axis is for g(d). Blue line is the function value versusdepth. Red line is y=0. It can be seen from the graph that the solution is about 19.And by using Bisection method, the solution depth=19.306641cm is found, with8 significance bit.3.(a) No fixed point can be found. By solving this equation, we can find that x=2 isone of the solution. If we set the initial point to 2.00000000001 or 1.9999999, the result is the same:. If we set initial point to 2, the point can be found:. This is consistent with the conclusion discussed in the previous part.(b)The fixed point p=0.768169156736 is found:实验题目二Solution of Linear Systems--Gaussian elimination and pivoting姓名:xxxxxx学号:xxxxxxxxxxxx时间:2015年5月28日【题目】Find the sixth-degree polynomial y = a1 + a2x + a3x^2 + a4x^3 + a5x^4 + a6x^5 + a7x^6 that passes through (0, 1), (1, 3), (2, 2), (3, 1), (4, 3), (5, 2), and (6, 1). Use the plot command to plot the polynomial and the given points on the same graph. Explain any discrepancies in your graph.【实验分析】To find the coefficient of each term, we can substitute all the given point to the equations and construct an argument matrix AX=B. Then perform triangular factorization and solve the upper-triangular and lower triangular matrix by back substitution method.Since det(A) = 2.4883e+07 ≠ 0,there exist a unique solution for AX=B.【实验过程和程序】Code for construct coefficient matrix A:Code for construct matrix B:Solve X by triangular factorization and back substitution method:【实验结果】The result for coefficient matrix:The graph of the polynomial is shown below. Blue lines denotes the graph for the polynomial and red points are the sample points. This polynomial fits the points well.Iterat ion of Linear System’s solution--Seidel iteration姓名:xxxxxx学号:xxxxxxxxxxxx时间:2015年5月28日【题目】(a)Start with P0 = 0 and use Jacobi iteration to find Pk for k = 1, 2, 3. Will Jacobi iteration converge to the solution?(b) Start with P0 = 0 and use Gauss-Seidel iteration to find Pk for k = 1, 2, 3. Will Gauss-Seidel iteration converge to the solution?【实验分析】In this problem we only need to construct the coefficient matrix and matrix B and then apply the Jacobi Iteration method and Gauss-Seidel Iteration method to find the solution. SinceA satisfy strictly diagonally dominant, so the iteration steps will converge.【实验过程和程序】【实验结果】Points in first three iteration is shown below. Both this two method will converge.Interpolation--Spline interpolation姓名:xxxxxx学号:xxxxxxxxxxxx时间:2015年5月28日【题目】The measured temperatures during a 5-hour period in a suburb of Los Angeles on November 8 are given in the following table.(a)To construct a Lagrange interpolatory polynomial for the data in the table.(b)To estimate the average temperature during the given5-hour period.(c)Graph the data in the table and the polynomial frompart (a) on the same coordinate system. Discuss thepossible error that can result from using thepolynomial in part (a) to estimate the averagetemperature.【实验分析】(a)X=[1,2,3,4,5,6] Y=[66,66,65,64,63,63], the target is to construct a Lagrangeinterpolatory polynomial for X and Y. We can apply the Lagrange approximation method to solve it.(b)After we get the interpolatory polynomial, we can use a great amount of samplepoints and estimate the function value of them and take the mean.(c)Error contain in Lagrange interpolatory polynomial of 5-degree is:, where Error on the average temperature equals to the mean of , which is:Error ====240.06【实验过程和程序】(a)Construct X and Y, and solve it by Lagrange approximation:(b)After we get the polynomial function, we calculate function value on a set ofsample points and get their mean as the average temperature.(c)plot X_new and Y_new in part(b) is equivalent to plot P N(x). And error bound canonly be obtain by analyzing since f(x) is unknown.【实验结果】(a) We can get the result:Which means that:(b)By taking the mean, the average temperature is 64.5℉:(c)The graph for polynomial and the sample points is shown below. Error bound forthe average temperature is 240.06.实验题目五Curve Fitting--Least mean square error姓名:xxxxxx学号:xxxxxxxxxxxx时间:2015年5月28日【题目】1.The temperature cycle in a suburb of Los Angeles on November 8 is given in theaccompanying table. There are 24 data points.(a)Follow the procedure outlined in Example5.5 (use the fmins command) to find theleast-squares curve of the form f (x) = Acos(Bx)+C sin(Dx)+ E for the given set ofdata.(b)Determine E2( f ).(c)Plot the data and the least-squares curvefrom part (a) on the same coordinatesystem.【实验分析】(a)In this problem. The hour 1~midnight p.m. can be map to 1~12, 1~noon a.m. canbe map to 13~24. So hour and temperature can be used to fit the curve. To get the curve with minimum error, which is define as:The best A, B, C, D, E can be found when:(b)is defined as:In our case,【实验过程和程序】(a) The function of the error is:Using command, A B C D E can be solved. (b) By the function solved by part(a), we can calculate for each sample pointand then calculate :(c) Code to plot the line:【实验结果】(a)The result for parameter A B C D E is:So the least-squares curve is :(b)Error for f(x) is:(c)Graph for least-squares curve and sample points is:Notice that the result of function fminesarch is sensitive about the input seeds.Firstly the seed is [1 1 1 1 1], and get the result [0.1055 -2.1100 0.9490 -4.869861.0712]. In second step, seed is [0.1 2 1 -5 61] and result is [0.0932 2.11141.175 -5.127 61.0424]. By 4 iterations, I find a good fit of the data and get the seed[1 0.1 1 1 60].Numerical Integration--Automatically select the integration step of the trapezoidal method姓名:xxxxxx学号:xxxxxxxxxxxx时间:2015年5月28日【题目】(i) Approximate each integral using the compositetrapezoidal rule with M = 10.(ii) Approximate each integral using the compositeSimpson rule with M = 5.【实验分析】The formula of each function is given in this problem, so we just need to use composite trapezoidal rule and composite Simpson rule to solve them.【实验过程和程序】Function of the six equations:Code for calculation:【实验结果】Solution of Differential Equations--Euler’s Method and Heun’s Method姓名:xxxxxx学号:xxxxxxxxxxxx时间:2015年5月28日【题目】(Supplement) A skydiver jumps from a plane, and up to the moment he opens theparachute the air resistance is proportional to (v represents velocity). Assume that the time interval is [0,6] and hat the differential equation for the downward direction isover [0,6] with v(0)=0Use Euler’s method with h=0.05 and estimate v(6).【实验分析】The function of , where left end point is 0 and right is 6, with initial point v(0)=0. So we can apply Euler’s method directory to solve the problem.【实验过程和程序】Function of :Code of applying Euler’s method:【实验结果】….,so v(6)=10.0726.。

计算方法实习报告

计算方法实习报告

一.给出一个有效的算法和无效的算法计算积分y(n)=∫(x^n)/(4x+1)dx,n=0,1,2,…,10,积分限为(0,1)1.有效算法利用递推公式y(n)=-y(n-1)/4+1/(4n),取y0=(log5)/4程序为:#include<iostream.h>#include<math.h>void main(){ double y0,y1;y0=1/4.0*log(5.0);cout<<"y0="<<y0<<" ";for(int n=1;n<=10;n++){ y1=-1.0/4.0*y0+1.0/(4.0*n);cout<<"y"<<n<<"="<<y1<<" ";y0=y1;if(n%3==0) cout<<endl;}}其结果为: y0=0.402359 y1=0.14941 y2=0.0876475 y3=0.0614215y4=0.0471446 y5=0.0382138 y6=0.0321132y7=0.027686 y8=0.0243285 y9=0.0216957y10=0.0195761 Press any key to continue2.无效算法利用递推公式y(n-1)=-4y(n)+1/n, 又由广义积分中值定理可得y(n)=1/((4n+1)(4ζ+1)), ζ∈(0,1),则1/(5(n+1))<y(n)<1/(n+1), 所以可取y(n)≈[1/(5(n+1))+ 1/(n+1)]/2=3/(5(n+1)程序为:#include<iostream.h>#include<math.h>void main(){ float y9,y10;y10=3.0 /55.0;cout<<"y10="<<y10<<" ";for(int n=9;n>=0;n--){ y9=-4.0*y10+1.0/(n+1);cout<<"y"<<n<<"="<<y9<<" ";y10=y9;if(n%3==0) cout<<endl;}}其结果为:y10=0.0545455 y9=-0.118182y8=0.583838 y7=-2.21035 y6=8.98427y5=-35.7704 y4=143.282 y3=-572.877y2=2291.84 y1=-9166.86 y0=36668.43.心得体会由有效算法与无效算法的结果可以知道:有效算法的误差的传递是逐步缩小的,而无效算法的误差的传递是逐步扩大的。

计算方法试验报告-插值方法

计算方法试验报告-插值方法

重庆大学学生实验报告实验课程名称计算方法开课实验室DS1421学院年级专业学生姓名学号开课时间至学年第学期1.实验目的:(1) 学会拉格朗日插值、牛顿插值等基本方法(2) 设计出相应的算法,编制相应的函数子程序(3) 会用这些函数解决实际问题2.实验内容(1)设计拉格朗日插值算法,编制并调试相应的函数子程序(2)设计,编制并调试相应的函数子程序试用拉格朗日插值确定函数在x=2.101,4.234处的函数值。

(4)已知,,,392411===用牛顿插值公式求5的近似值。

3.实验过程解:(1) 拉格朗日插值算法如下:function s=Lagrange(x0,y0,x)format long;%输入初始数据x0,y0%插值点xn=length(x0);s=0;%进入迭代计算过程for j=0:(n-1)t=1;for i=0:(n-1)if i~=jt=t*(x-x0(i+1))/(x0(j+1)-x0(i+1));endends=s+t*y0(j+1);endformat short;(2) 牛顿插值算法如下:function y=Newton(x0,y0,x)format long;%显示15位%插值点x, 迭代初始值:x0,y0n=max(size(x0));y=y0(1);%迭代初始值disp(y);s=1;dx=y0;for i=1:n-1%构造差商表dx0=dx;for j=1:n-idx(j)=(dx0(j+1)-dx0(j))/(x0(i+j)-x0(j));enddf=dx(1);s=s*(x-x0(i));y=y+s*df;%计算disp(y);end(3)用拉格朗日插值确定函数在x=2.101,4.234处的函数值输入:x0=[1.1,2.3,3.9,5.1];y0=[3.887,4.276,4.651,2.117];x=2.101; Lagrange(x0,y0,x)结果为:输入:x=4.234; Lagrange(x0,y0,x)结果为:所以x=2.101处的函数值为4.1457,x=4.234处的函数值为4.3007。

计算方法实验报告

计算方法实验报告

Matelab 实习三一.题目1.对于给函数f(x)=1/(1+25x^2)在区间[-1,1]上取Xi=-1+0.2i (i=0,1,…10),试求三次曲线拟合,试画出拟合曲线并打印方程,与第2章计算实习题2的结果比较。

试求3次、4次多项式的曲线拟合,再根据数据曲线形状,求一个另外函数的拟合曲线,用图示数据曲线及相应的三种拟合曲线。

3.使用快速傅里叶变换确定函数)cos()(2x x x f =在[-pi,pi]上的16次三角插值多项式。

二.实验理论1.,由此求出格拉姆矩阵G ,可写成矩阵形式:Ga=d 。

实验中,只要求出矩阵G 和向量d ,即可由Ga=d 得出ai(i=0,1,2 …n),进而可求出S(x)=∑ai*x^i.2.,可写成矩阵形式: Ga=d 。

实验中,只要求出矩阵G 和向量d ,即可由Ga=d 得出ai(i=0,1,2 …n)进而可求出S(x)=∑ai*x^i.3.FFT 计算公式如下:其中q=1,2,…p,k=0,1,…2^(p -q)-1,j=0,1,…2^(q -1)-1。

经过不断的二分迭代,可得到Ap(j).即Ck ,而ak=real(Ck),bk=image(Ck),∑-=+++=11)sin cos (21n k n k k a ky b ky a S三.实验程序1.function [ output_args ] = triRunge(m)n=m+1;x=zeros(1,11);y=zeros(1,11);x(1)=-1;for i =1:10x(i+1)=-1+0.2*i;end ```·,1,0,]),(==∑k d a k j j k ϕϕ ```·,1,0,]),(==∑k d a k j j k ϕϕ ```·,1,0,]),(==∑k d a k j j k ϕϕ ```·,1,0,]),(==∑k d a k j j k ϕϕ []12111111-q 11111)22(-)2()22(A )22()2()2(A -----------+++=++++++=+q k p q q q q q q p q q q q q q w j k A j k A j k j k A j k A j kfor i=1:11y(i)=1/(1+25*x(i)^2);endd=zeros(n,n); f=zeros(1,n); for i=1:nfor j=1:nfor k=1:11d(i,j)=d(i,j)+x(k)^(i+j-2);endendendfor i=1:nfor k=1:11f(i)=f(i)+x(k)^(i-1)*y(k);endenda=f/d; syms x;g=a(n)*x+a(n-1);for i=1:n-2g=g*x+a(n-2-i+1);endvpa(g);g=collect(g);g=vpa(g,3); ezplot(g,[-1,1]);gtext('拟合曲线');k=char(g);hold onezplot('1/(1+25*x^2)',[-1,1]);gtext('龙格函数1/(1+25x^2)');gtext(k)title('三次曲线拟合');end注:蓝色为3次拟合曲线,红色为龙格函数曲线可以看出:三次拟合曲线与龙格函数基本不重合,拟合效果差。

计算方法实验报告

计算方法实验报告

实验报告课程名称:计算方法院系:数学科学系专业班级:学号:学生姓名:指导教师:开课时间:2015至2016学年第二学期一、学生撰写要求按照实验课程培养方案的要求,每门实验课程中的每一个实验项目完成后,每位参加实验的学生均须在实验教师规定的时间内独立完成一份实验报告,不得抄袭,不得缺交。

学生撰写实验报告时应严格按照本实验报告规定的内容和要求填写。

字迹工整,文字简练,数据齐全,图表规范,计算正确,分析充分、具体、定量。

二、教师评阅与装订要求1.实验报告批改要深入细致,批改过程中要发现和纠正学生实验报告中的问题,给出评语和实验报告成绩,签名并注明批改日期。

实验报告批改完成后,应采用适当的形式将学生实验报告中存在的问题及时反馈给学生。

2.实验报告成绩用百分制评定,并给出成绩评定的依据或评分标准(附于实验报告成绩登记表后)。

对迟交实验报告的学生要酌情扣分,对缺交和抄袭实验报告的学生应及时批评教育,并对该次实验报告的分数以零分处理。

对单独设课的实验课程,如学生抄袭或缺交实验报告达该课程全学期实验报告总次数三分之一以上,不得同意其参加本课程的考核。

3.各实验项目的实验报告成绩登记在实验报告成绩登记表中。

本学期实验项目全部完成后,给定实验报告综合成绩。

4.实验报告综合成绩应按课程教学大纲规定比例(一般为10-15%)计入实验课总评成绩;实验总评成绩原则上应包括考勤、实验报告、考核(操作、理论)等多方面成绩;5.实验教师每学期负责对拟存档的学生实验报告按课程、学生收齐并装订,按如下顺序装订成册:实验报告封面、实验报告成绩登记表、实验报告成绩评定依据、实验报告(按教学进度表规定的实验项目顺序排序)。

装订时统一靠左侧按“两钉三等分”原则装订。

指导教师签字:年月日指导教师签字:年月日指导教师签字:年月日。

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

实验一——插值方法实验学时:4实验类型:设计 实验要求:必修一 实验目的通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C )编程实现数值方法的求解。

并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。

二 实验内容通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个采样点,并用这有限个采样点的连线,即折线,近似插值曲线。

取点越密集,所得折线就越逼近理论上的插值曲线。

本实验中将所取的点的横坐标存放于动态数组[]X n 中,通过插值方法计算得到的对应纵坐标存放于动态数组[]Y n 中。

以Visual C++.Net 2005为例。

本实验将Lagrange 插值、Newton 插值和三次样条插值实现为一个C++类CInterpolation ,并在Button 单击事件中调用该类相应函数,得出插值结果并画出图像。

CInterpolation 类为 class CInterpolation {public :CInterpolation();//构造函数CInterpolation(float *x1, float *y1, int n1);//结点横坐标、纵坐标、下标上限 ~ CInterpolation();//析构函数 ………… …………int n, N;//结点下标上限,采样点下标上限float *x, *y, *X;//分别存放结点横坐标、结点纵坐标、采样点横坐标float *p_H,*p_Alpha,*p_Beta,*p_a,*p_b,*p_c,*p_d,*p_m;//样条插值用到的公有指针,分别存放i h ,i α,i β,i a ,i b ,i c ,i d 和i m};其中,有参数的构造函数为CInterpolation(float *x1, float *y1, int n1) {//动态数组x1,y1中存放结点的横、纵坐标,n1是结点下标上限(即n1+1个结点) n=n1;N=x1[n]-x1[0]; X=new float [N+1]; x=new float [n+1]; y=new float [n+1];for (int i=0;i<=n;i++) {x[i]=x1[i]; y[i]=y1[i]; }for (int i=0;i<=N;i++) X[i]=x[0]+i; }2.1 Lagrange 插值()()nn i i i P x y l x ==∑,其中0,()nj i j j ni jx x l x x x =≠-=-∏对于一个自变量x ,要求插值函数值()n P x ,首先需要计算对应的Lagrange 插值基函数值()i l xfloat l(float xv,int i) //求插值基函数()i l x 的值 {float t=1;for (int j=0;j<=n;j++) if (j!=i)t=t*(xv-x[j])/(x[i]-x[j]); return t; }调用函数l(float x,int i),可求出()n P xfloat p_l(float x) //求()n P x 在一个点的插值结果{float t=0;for (int i=0;i<=n;i++) t+=y[i]*l(x,i); return t; }调用p_l(float x)可实现整个区间的插值float *Lagrange() //求整个插值区间上所有采样点的插值结果 {float *Y=new float [N+1]; for (int k=0;k<=N;k++) Y[k]=p_l(x[0]+k*h); return Y; } 2.2 Newton 插值010()(,,)()nn i i i P x f x x x x ω==∑,其中101,0()(),0i i j j i x x x i ω-==⎧⎪=⎨-≠⎪⎩∏,0100,()(,,)()ik i nk k j j j kf x f x x x x x ==≠=-∑∏对于一个自变量x ,要求插值函数值()n P x ,首先需要计算出01(,,)i f x x x 和()i x ωfloat *f(){//该函数的返回值是一个长度为n +1的动态数组,存放各阶差商 }float w(float x, int i) {//该函数计算()i x ω }在求()n P x 的函数中调用*f()得到各阶差商,然后在循环中调用w(float x)可得出插值结果 float p_n(float x) {//该函数计算()n P x 在一点的值}调用p_n(float x)可实现整个区间的插值 float *Newton() {//该函数计算出插值区间内所有点的值 }2.3 三次样条插值三次样条插值程序可分为以下四步编写:(1) 计算结点间的步长i hi 、i α、i β;(2) 利用i hi 、i α、i β产生三对角方程组的系数矩阵和常数向量; (3) 通过求解三对角方程组,得出中间结点的导数i m ; (4)对自变量x ,在对应区间1[,]i i x x +上,使用Hermite 插值;(5) 调用上述函数,实现样条插值。

将每步写成函数: (1)void GetH(void ) {//该函数计算数组i hi }void GetAlpha(void ) {//该函数计算数组i α }void GetBeta(void ) {//该函数计算数组i β }(2)void Geta(void ) {//该函数计算数组下对角线i a }void Getb(void ) {//该函数计算数组主对角线i b }void Getc(void ) {//该函数计算数组上对角线i c }void Getd(void ) {//该函数计算方程组右端常数项i d }(3)float *Chasing(float *pa,float *pb,float *pc,float *pd,int n) {//追赶过程,计算各点斜率i m }(4)float F0(float x) {//该函数计算函数0()x ϕ的值 }float F1(float x) {//该函数计算函数1()xϕ的值}float P0(float x){//该函数计算函数0()xψ的值}float P1(float x){//函数计算函数1()xψ的值}调用上述函数,实现三次样条插值float *Cubic_Spline(){//该函数计算所有点的插值结果}三实验组织运行要求实验前,由任课教师落实实验任务,每个学生事先编写好算法设计源程序代码。

集中上机、调试并通过计算机图形可视化演示操作实例来测试、验证所学的数值分析理论。

四实验条件为每个学生提供一台具有WINDOWS 98/XP/NT/2000操作系统的计算机;同时提供VC++/VB/JAVA/TC等集成语言开发环境来编程设计计算方法的上机实验。

五实验步骤1.根据实验内容和算法流程图预先编好程序初稿,上机调试、运行,输出正确的结果。

2.三种类型的插值函数所生成的图形要显示在同一坐标轴上,并用三种不同的颜色分别表示出来。

3.分析它们的运行结果,并比较三种插值函数各自不同的特点。

4.实验完毕后提交实验报告六实验代码#pragma onceclass CInterpolation{public:CInterpolation(void);~CInterpolation(void);CInterpolation(float* x1, float* y1, int n1);float l(float xv, int i);float p_l(float x);float* lagrange(void);int n, N;//结点下标上限,采样点下标上限float *x, *y, *X, *Y,*dq;//分别存放结点横坐标、结点纵坐标、采样点横坐标float *p_H,*p_Alpha,*p_Beta,*p_a,*p_b,*p_c,*p_d,*p_m,*p_s;float *f();float w(float x1,int i);float p_n(float x);float* Newton(void);void GetH(void);void GetAlaph(void);void GetBeta(void);void Geta(void);void Getb(void);void Getc(void);void Getd(void);void Getm(void);float F0(float x);float F1(float x);float P0(float x);float P1(float x);float S3(float x1);float* Cubic_Spline(void);};#include"stdafx.h"#include"Lagrange.h"CInterpolation::CInterpolation(void){}CInterpolation::~CInterpolation(void){}CInterpolation::CInterpolation(float* x1, float* y1, int n1){n=n1;N=x1[n]-x1[0];X=new float[N+1];x=new float[n+1];y=new float[n+1];for(int i=0;i<=n;i++){x[i]=x1[i];y[i]=y1[i];}for(int i=0;i<=N;i++)X[i]=x[0]+i;}float CInterpolation::l(float xv, int i){float t=1;for(int j=0;j<=n;j++)if(j!=i)t=t*(xv-x[j])/(x[i]-x[j]);return t;}float CInterpolation::p_l(float x){float t=0;for(int i=0;i<=n;i++)t+=y[i]*l(x,i);return t;}float* CInterpolation::lagrange(void){float *Y=new float[N+1];for(int k=0;k<=N;k++)Y[k]=p_l(x[0]+k);return Y;}float * CInterpolation::f()//该函数的返回值是一个长度为n+1的动态数组,存放各阶差商{for(int i=0;i<n;i++){dq[i]=0;for(int k=0;k<=i;k++){float t=1;for(int j=0;j<=i;j++)if(j!=k)t=t*(x[k]-x[j]);dq[i]=dq[i]+y[k]/t;}}return dq;}float CInterpolation::w(float x1,int i)//该函数计算w(x){if(i==0)return 1;else{float t=1;for(int j=0;j<i;j++)t=t*(x1-x[j]);return t;}}//在求的函数中调用*f()得到各阶差商,然后在循环中调用w(float x)可得出插值结果float CInterpolation::p_n(float x1)//该函数计算在一点的值{float *dq =f();float t=0;for(int i=0;i<=n;i++)t=t+dq[i]*w(x1,i);return t;}float* CInterpolation::Newton(void){float *Y=new float[N+1];for(int i=0;i<=N;i++)Y[i] = p_n(x[0]+i);return Y;}void CInterpolation::GetH(void)//计算数组hi{p_H =new float[n];for(int i=0;i<n;i++)p_H[i]=x[i+1]-x[i];}void CInterpolation::GetAlaph(void)//计算数组a{p_Alpha =new float[n];for(int i=1;i<n;i++)p_Alpha[i]=p_H[i-1]/(p_H[i-1]+p_H[i]);}void CInterpolation::GetBeta(void)//计算数组b{for(int i=1;i<n;i++){p_Beta[i]=3*((1-p_Alpha[i])*(y[i]-y[i-1])/p_H[i-1]+p_Alpha[i]*(y[i+1]-y[i])/p_H[i]) ;}}void CInterpolation::Geta(void){p_a=new float[n+1];for(int i=1;i<n+1;i++)p_a[i]=1-p_Alpha[i];}void CInterpolation::Getb(void){p_b=new float[n+1];for(int i=1;i<n+1;i++)p_b[i]=2;}void CInterpolation::Getc(void){p_c=new float[n+1];for(int i=1;i<n+1;i++)p_c[i]=p_Alpha[i];}void CInterpolation::Getd(void){float m0=5.0,mn=20.0;p_d=new float[n+1];for(int i=2;i<n;i++)p_d[i]=p_Beta[i];p_d[1] =p_Beta[1]-(1-p_Alpha[1])*m0;p_d[n]=p_Beta[n]-p_Alpha[n]*mn;}void CInterpolation::Getm(void)//计算各点斜率{p_m = new float[n + 1];p_m[0] = 5.0; p_m[n] = 20.0;float *beta, *r, *s;beta = new float[n + 1];r = new float[n];s = new float[n + 1];beta[1] = p_b[1]; r[1] = p_c[1] / beta[1];for(int i = 2; i < n; i++){beta[i] = p_b[i] - r[i - 1] * p_a[i];r[i] = p_c[i] / beta[i];}beta[n] = p_b[n] - r[n - 1] * p_a[n];s[1] = p_d[1] / p_b[1];for(int i = 2; i < n+1; i++)s[i] = (p_d[i] - s[i - 1] * p_a[i]) / beta[i];p_m[n - 1] = s[n - 1];for(int i = n - 2; i > 0; i--)p_m[i] = s[i] - r[i] * p_m[i + 1];}float CInterpolation::F0(float x){return (x - 1) * (x - 1) * (2 * x + 1);}float CInterpolation::F1(float x){return x * x * (-2 * x + 3);}float CInterpolation::P0(float x){return x * (x - 1) * (x - 1);}float CInterpolation::P1(float x){return x * x * (x - 1);}float CInterpolation::S3(float x1){p_s = new float[n];for (int i = 0; i < n; i ++){p_s[i] = y[i]*F0((x1 - x[i])/p_H[i]) + y[i + 1] * F1((x1 - x[i]) / p_H[i]) + p_H[i]*p_m[i]*P0((x1-x[i])/p_H[i])+ p_H[i] * p_m[i + 1] * P1((x1- x[i]) / p_H[i]);}int j;for(j = 0; j < n; j++){if(x[j] <= x1 && x1 <= x[j + 1]) break;}return p_s[j];}float* CInterpolation::Cubic_Spline(void){float *Y=new float[N+1];GetH();GetAlaph();GetBeta();Geta();Getb();Getc();Getd();Getm();for (int i = 0; i <= N; i++){Y[i] = S3(X[0]+i);}return Y;}void C实验一Dlg::OnPaint(){if (IsIconic()){CPaintDC dc(this); // 用于绘制的设备上下文SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);int cxIcon = GetSystemMetrics(SM_CXICON);// 使图标在工作区矩形中居中int cyIcon = GetSystemMetrics(SM_CYICON);CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxIcon + 1) / 2;int y = (rect.Height() - cyIcon + 1) / 2;dc.DrawIcon(x, y, m_hIcon); // 绘制图标}else{CDialogEx::OnPaint();}pWnd->Invalidate(); //使static控件区域无效pWnd->UpdateWindow();//更新窗口此时才真正向系统发送重绘消息没有这句绝对出问题CDC *pDC = pWnd->GetDC(); //获取控件的CDC指针pDC->Rectangle(0, 0, 500, 380); //画一个矩形框CPen *pPenRed = new CPen(); //创建画笔对象pPenRed ->CreatePen(PS_SOLID, 1, RGB(0, 0, 255)); //红色画笔CPen *pPen = NULL;CGdiObject*pOldPen = pDC ->SelectObject(pPenRed);//选中当前红色画笔并保存以前的画笔pDC ->MoveTo(20, 20); //绘制坐标轴pDC ->LineTo(20, 360); //竖起轴pDC ->LineTo(480, 360); //水平轴for(i = 0; i <= 10; i ++)//写X轴刻度{str.Format(_T("%ld"), i);pDC ->MoveTo(i * 40 + 20, 360); //绘制X轴刻度pDC ->LineTo(i * 40 + 20, 355);}for(i = 1; i <= 10; i ++) //写Y轴刻度值{str.Format(_T("%ld"), i);pDC ->MoveTo(25, 360 - 30 * i);////绘制Y轴刻度pDC ->LineTo(20, 360 - 30 * i);}pDC ->MoveTo(470, 357);//绘制X箭头pDC ->LineTo(480, 360);pDC ->LineTo(470, 363);pDC ->MoveTo(17, 30);//绘制Y箭头pDC ->LineTo(20, 20); //绘制左边箭头pDC ->LineTo(23, 30); //绘制右边箭头pDC ->SelectObject(pOldPen);//恢复以前的画笔delete pPenRed;if(pPen != NULL)delete pPen;ReleaseDC(pDC);}HCURSOR C实验一Dlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void C实验一Dlg::OnLButtonDblClk(UINT nFlags, CPoint point)//双击取点函数{CDC *pDC=GetDC();pDC->Ellipse(point.x-3,point.y-3,point.x+3,point.y+3);g_arrPoint.push_back(point);ReleaseDC(pDC);CDialog::OnLButtonDblClk(nFlags, point);CDialogEx::OnLButtonDblClk(nFlags, point);}void C实验一Dlg::OnBnClickedButton1(){int count = g_arrPoint.size();float *x = new float[count];float *y = new float[count];int i = 0;std::vector<CPoint>::iterator iter;for (iter = g_arrPoint.begin(); iter != g_arrPoint.end(); iter++) {x[i] = (*iter).x;y[i] = (*iter).y;i++;}CInterpolation CIP = CInterpolation(x, y, count - 1);CIP.Y=grange();CDC *pDC = GetDC();pDC->SelectObject(new CPen(PS_SOLID, 0, RGB(255,100, 0)));pDC->MoveTo(CIP.X[0], CIP.Y[0]);for(int i = 1; i <= CIP.N; i++)pDC->LineTo(CIP.X[i], CIP.Y[i]);ReleaseDC(pDC);}void C实验一Dlg::OnBnClickedButton2(){Invalidate(TRUE);g_arrPoint.size();}void C实验一Dlg::OnBnClickedButton3(){int count = g_arrPoint.size();float *x = new float[count];float *y = new float[count];int i = 0;std::vector<CPoint>::iterator iter1;for (iter1 = g_arrPoint.begin(); iter1 != g_arrPoint.end(); iter1++) {x[i] = (*iter1).x;y[i] = (*iter1).y;i++;}CInterpolation ND = CInterpolation(x, y, count - 1);ND.Y=ND.Newton();CDC *pDC = GetDC();pDC->SelectObject(new CPen(PS_SOLID, 0, RGB(0,100, 255)));pDC->MoveTo(ND.X[0], ND.Y[0]);for(int i = 1; i <= ND.N; i++)pDC->LineTo(ND.X[i], ND.Y[i]);ReleaseDC(pDC);}void C实验一Dlg::OnBnClickedButton4(){int count = g_arrPoint.size();float *x = new float[count];float *y = new float[count];int i = 0;std::vector<CPoint>::iterator iter2;for (iter2 = g_arrPoint.begin(); iter2 != g_arrPoint.end(); iter2++) {x[i] = (*iter2).x;y[i] = (*iter2).y;i++;}CInterpolation CS = CInterpolation(x, y, count - 1);CS.Y=CS.Cubic_Spline();CDC *pDC = GetDC();pDC->SelectObject(new CPen(PS_SOLID, 0, RGB(0,255,0)));pDC->MoveTo(CS.X[0], CS.Y[0]);for(int i = 1; i <= CS.N; i++)pDC->LineTo(CS.X[i], CS.Y[i]);ReleaseDC(pDC);}七.实验结果八.实验二——数值积分实验学时:2实验类型:设计实验要求:必修一 实验目的通过该课程实习,学会使用数值积分的各种方法求解定积分计算的问题,体会各种方法的精度差异。

相关文档
最新文档