东南大学计算方法实验报告
计算方法实验报告
计算方法实验报告计算方法实验报告概述:计算方法是一门研究如何用计算机解决数学问题的学科。
在本次实验中,我们将学习和应用几种常见的计算方法,包括数值逼近、插值、数值积分和常微分方程求解。
通过实验,我们将深入了解这些方法的原理、应用场景以及其在计算机科学和工程领域的重要性。
数值逼近:数值逼近是一种通过使用近似值来计算复杂函数的方法。
在实验中,我们通过使用泰勒级数展开和牛顿迭代法等数值逼近技术,来计算函数的近似值。
这些方法在科学计算和工程领域中广泛应用,例如在信号处理、图像处理和优化问题中。
插值:插值是一种通过已知数据点来估算未知数据点的方法。
在实验中,我们将学习和应用拉格朗日插值和牛顿插值等方法,以及使用这些方法来构造函数的近似曲线。
插值技术在数据分析、图像处理和计算机图形学等领域中具有重要的应用价值。
数值积分:数值积分是一种通过将函数曲线划分为小矩形或梯形来估算函数的积分值的方法。
在实验中,我们将学习和应用矩形法和梯形法等数值积分技术,以及使用这些方法来计算函数的近似积分值。
数值积分在物理学、金融学和统计学等领域中被广泛使用。
常微分方程求解:常微分方程求解是一种通过数值方法来求解微分方程的方法。
在实验中,我们将学习和应用欧拉法和龙格-库塔法等常微分方程求解技术,以及使用这些方法来求解一些常见的微分方程。
常微分方程求解在物理学、生物学和工程学等领域中具有广泛的应用。
实验结果:通过实验,我们成功地应用了数值逼近、插值、数值积分和常微分方程求解等计算方法。
我们得到了准确的结果,并且在不同的应用场景中验证了这些方法的有效性和可靠性。
这些实验结果将对我们进一步理解和应用计算方法提供重要的指导和支持。
结论:计算方法是计算机科学和工程领域中的重要学科,它提供了解决复杂数学问题的有效工具和方法。
通过本次实验,我们深入了解了数值逼近、插值、数值积分和常微分方程求解等计算方法的原理和应用。
这些方法在科学研究、工程设计和数据分析等领域中具有广泛的应用价值。
东南大学计算方法与实习上机实验一
东南大学计算方法与实习实验报告学院:电子科学与工程学院学号:06A*****姓名:***指导老师:***实习题14、设S N=Σ(1)编制按从大到小的顺序计算S N的程序;(2)编制按从小到大的顺序计算S N的程序;(3)按两种顺序分别计算S1000,S10000,S30000,并指出有效位数。
解析:从大到小时,将S N分解成S N-1=S N-,在计算时根据想要得到的值取合适的最大的值作为首项;同理从小到大时,将S N=S N-1+ ,则取S2=1/3。
则所得式子即为该算法的通项公式。
(1)从大到小算法的C++程序如下:/*从大到小的算法*/#include<iostream>#include<iomanip>#include<cmath>using namespace std;const int max=34000; //根据第(3)问的问题,我选择了最大数为34000作为初值void main(){int num;char jus;double cor,sub;A: cout<<"请输入你想计算的值"<<'\t';cin>>num;double smax=1.0/2.0*(3.0/2.0-1.0/max-1.0/(max+1)),temps;double S[max];// cout<<"s["<<max<<"]="<<setprecision(20)<<smax<<'\n';for(int n=max;n>num;){temps=smax;S[n]=temps;n--;smax=smax-1.0/((n+1)*(n+1)-1.0);}cor=1.0/2.0*(3.0/2.0-1.0/num-1.0/(num+1.0)); //利用已知精确值公式计算精确值sub=fabs(cor-smax); //double型取误差的绝对值cout<<"用递推公式算出来的s["<<n<<"]="<<setprecision(20)<<smax<<'\n';cout<<"实际精确值为"<<setprecision(20)<<cor<<'\n';cout<<"则误差为"<<setprecision(20)<<sub<<'\n';cout<<"是否继续计算S[N],是请输入Y,否则输入N!"<<endl;cin>>jus;if ((int)jus==89||(int)jus==121) goto A;}(2)从小到大算法的C++程序如下:/*从小到大的算法*/#include<iostream>#include<iomanip>#include<cmath>using namespace std;void main(){int max;A: cout<<"请输入你想计算的数,注意不要小于2"<<'\t';cin>>max;double s2=1.0/3.0,temps,cor,sub;char jus;double S[100000];for(int j=2;j<max;){temps=s2;S[j]=temps;j++;s2+=1.0/(j*j-1.0);}cor=1.0/2.0*(3.0/2.0-1.0/j-1.0/(j+1.0)); //利用已知精确值公式计算精确值sub=fabs(cor-s2); //double型取误差的绝对值cout<<"用递推公式算出来的s["<<j<<"]="<<setprecision(20)<<s2<<'\n';cout<<"实际精确值为"<<setprecision(20)<<cor<<'\n';cout<<"则误差为"<<setprecision(20)<<sub<<'\n';cout<<"是否继续计算S[N],是请输入Y,否则输入N!"<<endl;cin>>jus;if ((int)jus==89||(int)jus==121) goto A;}(3)(注:因为程序中setprecision(20)表示输出数值小数位数20,则程序运行时所得到的有效数字在17位左右)ii.选择从小到大的顺序计算S1000、S10000、S30000的值需要计算的项S1000S10000S30000计算值0.74900049950049996 0.74966672220370571 0.74996666722220728实际精确值0.74900049950049952 0.74990000499950005 0.74996666722220373误差 4.4408920985006262*10-16 5.6621374255882984*10-15 3.5527136788005009*10-15有效数字17 17 17附上部分程序运行图:iii.实验分析通过C++程序进行计算验证采用从大到小或者从小到大的递推公式算法得到的数值基本稳定且误差不大。
东南大学数学实验报告
东南大学数学实验报告
实验题目:热传导
实验目的:
1. 通过实验探究热传导的规律以及热传导的特性;
2. 认识热传导的概念与重要性,在实验中了解其应用;
3. 学习使用实验仪器并掌握相应的实验操作方法。
实验流程和原理:
在实验室准备好实验所需的仪器材料,包括热传导仪器、测试温度计、计时器、热导特性测试样品等。
1. 首先,准备好两个相同的热导测试样品,将它们连接到仪器的不同端口,并将一个温度计夹在热导测试样品的中间,另一个温度计则放在测试样品的一侧。
2. 然后,通电使得热传导仪器工作,在一段时间内观察测量的
数据的变化,并记录下来。
3. 在得到足够多的数据之后,按照实验流程进行数据处理和分析,计算出热传导系数以及对获得的结果进行解释和分析。
实验结果:
通过实验,我得到了两个样品之间热传导系数的实验结果,结
果显示,在热导测试样品中,热传导系数随着时间的递增而增加,且两样品热传导系数不同,在测试过程中,样品之间的温度差也
随之增加。
实验结论:
从实验结果中可以得到,热传导系数和材料本身的热导率,温度、时间和热导特性等因素有着密切的关系。
此外,通过实验,
我还对于热传导技术的使用和应用有了更深的认识,它在工业生产、环境监测等各个领域有着重要的应用价值。
实验总结:
通过本次实验,我学习了热传导的基本概念和特性,同时也掌握了使用实验仪器进行实验的方法和技巧。
对于数学和物理等领域的学科知识,有了更加深入的了解和认识。
同时,我也注意到实验结果的不确定性和误差存在,需要在日后的实验学习中加以注意和掌握。
大学计算方法实验报告
《计算方法》实验报告实验题目实验报告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)进行计算。
计算方法上上机实习报告
计算方法上上机实习报告在本次计算方法的上机实习中,我深入体验了数值计算的魅力和挑战,通过实际操作和实践,对计算方法有了更深刻的理解和认识。
实习的目的在于将课堂上学到的理论知识运用到实际的计算中,熟悉各种数值算法的实现过程,提高编程能力和解决实际问题的能力。
我们使用了具体编程语言和软件名称进行编程和计算。
在实习过程中,我首先接触到的是数值逼近的相关内容。
通过多项式插值和曲线拟合的练习,我明白了如何用简单的函数去近似复杂的曲线。
例如,拉格朗日插值法和牛顿插值法让我能够根据给定的离散数据点构建出一个连续的函数,从而对未知点进行预测。
在实际操作中,我需要仔细处理数据的输入和输出,以及算法中的细节,如边界条件和误差控制。
数值积分是另一个重要的部分。
通过梯形公式和辛普森公式,我学会了如何对给定的函数进行数值积分。
在编程实现时,要合理地选择积分区间和步长,以达到所需的精度。
同时,我也了解到了数值积分方法的误差来源和误差估计方法,这对于评估计算结果的可靠性非常重要。
线性方程组的求解是计算方法中的核心内容之一。
我分别使用了高斯消元法和迭代法(如雅克比迭代法和高斯赛德尔迭代法)来求解线性方程组。
在实际编程中,我深刻体会到了算法的效率和稳定性的重要性。
对于大规模的线性方程组,选择合适的算法可以大大提高计算速度和精度。
在非线性方程求根方面,我运用了二分法、牛顿法和割线法等方法。
这些方法各有特点,二分法简单但收敛速度较慢,牛顿法收敛速度快但需要计算导数。
在实际应用中,需要根据方程的特点和求解的要求选择合适的方法。
在实习中,我也遇到了不少问题和挑战。
首先是编程中的错误,如语法错误、逻辑错误等,这需要我耐心地调试和修改代码。
其次,对于一些复杂的算法,理解其原理和实现细节并不容易,需要反复查阅资料和思考。
还有就是数值计算中的误差问题,有时候由于误差的积累,导致计算结果与预期相差较大,需要通过调整算法参数或者采用更精确的算法来解决。
东南大学计算方法实验报告
计算方法与实习实验报告学院:电气工程学院指导老师:***班级: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)是一次式。
东南大学计算方法上机报告实验报告完整版
实习题11. 用两种不同的顺序计算644834.11000012≈∑=-n n,试分析其误差的变化解:从n=1开始累加,n 逐步增大,直到n=10000;从n=10000开始累加,n 逐步减小,直至1。
算法1的C 语言程序如下: #include<stdio.h> #include<math.h> void main() { float n=0.0; int i; for(i=1;i<=10000;i++) { n=n+1.0/(i*i); } printf("%-100f",n); printf("\n"); float m=0.0; int j; for(j=10000;j>=1;j--) { m=m+1.0/(j*j); } printf("%-7f",m); printf("\n"); }运行后结果如下:结论: 4.设∑=-=Nj N j S 2211,已知其精确值为)11123(21+--N N 。
1)编制按从大到小的顺序计算N S 的程序; 2)编制按从小到大的顺序计算N S 的程序;3)按2种顺序分别计算30000100001000,,S S S ,并指出有效位数。
解:1)从大到小的C语言算法如下:#include<stdio.h>#include<math.h>#include<iostream>using namespace std;void main(){float n=0.0;int i;int N;cout<<"Please input N"<<endl;cin>>N;for(i=N;i>1;i--){n=n+1.0/(i*i-1);N=N-1;}printf("%-100f",n);printf("\n");}执行后结果为:N=2时,运行结果为:N=3时,运行结果为:N=100时,运行结果为:N=4000时,运行结果为:2)从小到大的C语言算法如下:#include<stdio.h>#include<math.h>#include<iostream>using namespace std;void main(){float n=0.0;int i;int N;cout<<"Please input N"<<endl;cin>>N;for(i=2;i<=N;i++){n=n+1.0/(i*i-1);}printf("%-100f",n);printf("\n");}执行后结果为:N=2时,运行结果为:N=3时,运行结果为:N=100时,运行结果为:N=4000时,运行结果为:结论:通过比较可知:N 的值较小时两种算法的运算结果相差不大,但随着N 的逐渐增大,两种算法的运行结果相差越来越大。
《计算方法》实验报告材料
《计算方法》实验报告材料引言:计算方法是一门应用数学的基础课程,通过实验教学,能够帮助学生更好地理解和掌握各种数值计算的方法和技巧。
本次实验旨在通过编程实现一些常用的数值计算方法,并通过对比分析实验结果,验证方法的有效性和可行性。
实验一:插值算法插值算法是利用已知的数据点,构建一个连续函数以逼近数据的方法。
本次实验中使用的插值算法为拉格朗日插值和牛顿插值。
通过编程实现这两种算法,并选取若干个数据点进行测试,得到插值函数的结果。
通过比较原始数据和插值函数的结果,可以验证插值算法的准确性和可行性。
实验二:方程求解方程求解是数值计算中的一个重要问题,求解非线性方程、线性方程组和特征值问题等都需要采用相应的迭代方法。
本次实验中,我们实现了常用的牛顿迭代法和二分法,并选择数学问题进行求解。
通过比较实验结果和理论值的误差,可以验证求解方法的精确性和可行性。
实验三:数值积分数值积分是利用数值方法对定积分进行近似求解的过程。
本次实验中,我们实现了矩形法、梯形法和辛普森法等常用的数值积分方法,并选取若干函数进行数值积分的计算。
通过比较数值积分的结果和解析解或数值解的误差,可以验证数值积分方法的准确性和可行性。
实验四:常微分方程求解常微分方程求解是数值计算中的一个重要问题,常常涉及到物理、化学、生物等科学领域。
本次实验中,我们实现了欧拉方法和龙格-库塔方法等常用的常微分方程求解算法,并选取若干常微分方程进行求解。
通过比较数值解和解析解或数值解的误差,可以验证常微分方程求解方法的精确性和可行性。
实验五:线性方程组求解线性方程组求解是数值计算中的一个重要问题,常常涉及到矩阵的运算和迭代方法。
本次实验中,我们实现了高斯消元法和追赶法等常用的线性方程组求解算法,并选择一些矩阵进行求解。
通过比较数值解和解析解或数值解的误差,可以验证线性方程组求解方法的精确性和可行性。
结论:通过本次实验,我们掌握了插值算法、方程求解、数值积分、常微分方程求解和线性方程组求解等常用的计算方法。
计算方法实习报告
实习报告一、前言计算方法是计算机科学中的基础学科之一,涉及到计算机算法、数据结构、编程语言等多个方面。
为了更好地理解和掌握计算方法的知识,我选择了计算方法实习,通过实习,我对计算方法有了更深入的了解和掌握。
二、实习内容实习的主要内容包括但不限于:了解并掌握常见的排序算法和查找算法,实现一些基本的算法,例如冒泡排序、选择排序、插入排序、二分查找等;学习并应用图论算法,例如最短路径算法、最小生成树算法等;掌握并运用动态规划、分治算法等高级算法技巧。
三、实习过程在实习过程中,我首先学习了排序算法和查找算法。
通过学习和实践,我掌握了冒泡排序、选择排序、插入排序、二分查找等算法的原理和实现方法。
然后,我进一步学习了图论算法,包括最短路径算法和最小生成树算法。
我通过实现这些算法,了解了它们在解决实际问题中的应用。
最后,我学习了动态规划和分治算法等高级算法技巧,并成功地将其应用于实际问题的解决中。
四、实习收获通过实习,我深入学习了计算方法的各种算法和技巧,提高了自己的编程能力和解决问题的能力。
我学会了如何分析问题、设计算法和实现算法,掌握了算法的时间复杂度和空间复杂度分析方法,了解了不同算法在解决不同问题上的优缺点。
同时,我也学会了如何使用一些常用的数据结构,例如数组、链表、栈、队列等,以及如何使用一些常用的编程语言,例如 C++、Java 等。
五、实习反思通过这次实习,我认识到计算方法在计算机科学中的重要性,它是解决实际问题的关键和基础。
同时,我也认识到计算方法的实习不仅需要理论学习,更需要实践操作。
只有通过实践,才能真正理解和掌握计算方法的知识。
六、总结总的来说,这次计算方法实习是一次非常有意义的经历。
我通过实习,不仅深入学习了计算方法的知识,提高了自己的编程能力和解决问题的能力,也对自己的专业有了更深入的了解和认识。
我相信这次实习对我未来的学习和工作都会有很大的帮助。
东南大学2012年计算方法实习1-2matlab部分
东南大学2012年计算方法实习1-2matlab部分实习11、用2种不同的顺序计算644834.11000012≈∑=-n n,分析其误差变化。
>> %按从小到大的顺序计算>> y=0; %y 用来记录结果>> for(n=1:10000)y=y+1/(n*n);end>> fprintf('the result is :y=%f\n',y)the result is :y=1.644834%按从大到小的顺序计算>> y=0;n=10000;while(n>0)y=y+1/(n*n);n=n-1;endfprintf('the result is :y=%f\n',y)the result is :y=1.644834分析比较两者的结果均为y=1.644834,故而误差值相同,无变化注:这是在64位计算机上的结果4,设∑=-=N j N j S 2211,已知其精确度为??? ??+--1112321N N 。
1)编制按从大到小的顺序的计算S N 的程序。
2)编制按从小到大顺序的计算S N 的程序。
3)按两种顺序分别计算S S S 30000100001000,,,并指出有效位数。
1)在函数名为fun1的M 文件程序如下:function s=fun1(N);s=0;j=N;while (j>=2)s=s+1/(j*j-1);j=j-1;end ;2)在函数名为fun2的M 文件程序如下:function s=fun2(N);s=0;for(j=2:N)s=s+1/(j*j-1);end;3)在命令栏里面程序如下:>> s1000=fun1(1000); %从大到小顺序计算fprintf('s1000=%f\n',s1000)s1000=0.749000>> s10000=fun1(10000);fprintf('s10000=%f\n',s10000)s10000=0.749900>> s30000=fun1(30000);fprintf('s30000=%f\n',s30000)s30000=0.749967>>s1000=fun2(1000); %按从小到大的顺序计算>> fprintf('s1000=%f\n',s1000)s1000=0.749000>> s10000=fun2(10000);fprintf('s10000=%f\n',s10000)s10000=0.749900>> s30000=fun2(30000);>> fprintf('s30000=%f\n',s30000)s30000=0.749967实习题21,用牛顿迭代法求下列方程的根:Share.m的程序如下:eps=5e-6;delta=1e-6;N=100;k=0;x0=1.0;while(1)x1=x0-fun_2(x0)/fun_1(x0);k=k+1;if(k>N| abs(x1)<eps)< p="">disp('Nemton method failed')break;endif (abs(x1)<1)d=x1-x0;elsed=(x1-x0)/x1;x0=x1;if(abs(d)<eps|abs(fun_2(x1))<delta)< p=""> break;endendfprintf('Newton method is :x=%f',x0) 1);02=-xe x在函数名为fun_1的M 文件程序如下: function y=fun_1(x)y=2*x-exp(x);end 在函数名为fun_2的M 文件中程序如下:命令栏程序如下:function y=fun_2(x)y=x*x-exp(x);en公共代码段存于share.m 中,程序如上:命令栏中输出结果如下:Newton method is :x=-0.7034673).02lg =-+x x在函数名为fun_1的M 文件程序如下:function y=fun_1(x) %μ?oˉêyy=1/(x*log(10))+1;end在函数名为fun_2的M 文件中程序如下:function y=fun_2(x)y=log10(x)+x-2;end公共代码段存于share.m 中,程序如上:命令栏中输出结果如下:Newton method is :x=1.7555792.编写一个割线法的程序求解上述方程公共代码存于share.m 中,程序如下:eps=5e-6;delta=1e-6;k=0;x0=1.0;x1=2.0;while(1)x2=x1-fun_2(x1)/(fun_2(x1)-fun_2(x0))*(x1-x0); k=k+1;if(k>N| abs(x2)<eps)< p="">disp('割线法失效!')break;endif (abs(x2)<1)d=x2-x1;elsed=(x2-x1)/x2;endx0=x1;x1=x2;if(abs(d)<eps|abs(fun_2(x2))<delta)< p="">break;endendfprintf('割线法的结果:x=%f',x2)1);02=-xe x在函数名为fun_2的M 文件中程序如下: function y=fun_2(x) y=x*x-exp(x);end 命令栏中输出结果如下:割线法的结果:x=-0.7034673).02lg =-+x x在函数名为fun_2的M 文件中程序如下: function y=fun_2(x) y=log10(x)+x-2;end命令栏中输出结果如下:割线法的结果:x=1.755580>></eps|abs(fun_2(x2))<delta)<></eps)<></eps|abs(fun_2(x1))<delta)<></eps)<>。
计算方法与实习上机报告
计算方法与实习——上机报告学院:电子工程学院学号:姓名:刘波2015.1.4计算方法与实习上机报告习题一:1 舍入误差及稳定性一、实验目的(1)通过上机编程,复习巩固以前所学程序设计语言及上机操作指令;(2)通过上机计算,了解舍入误差所引起的数值不稳定性二、实验内容1、用两种不同的顺序计算1000021n n -=∑,分析其误差的变化 2、已知连分数()101223//(.../)n n a f b b a b a a b =++++,利用下面的算法计算f : 11,i n n i i i a d b d b d ++==+(1,2,...,0)i n n =-- 0f d = 写一程序,读入011,,,...,,,...,,n n n b b b a a 计算并打印f 3、给出一个有效的算法和一个无效的算法计算积分1041nn x y dx x =+⎰ (0,1,...,10)n = 4、设2211N N j S j ==-∑,已知其精确值为1311221N N ⎛⎫-- ⎪+⎝⎭ (1)编制按从大到小的顺序计算N S 的程序 (2)编制按从小到大的顺序计算N S 的程序(3)按两种顺序分别计算10001000030000,,,S S S 并指出有效位数三、实验步骤、程序设计、实验结果及分析1、用两种不同的顺序计算1000021n n -=∑,分析其误差的变化 (1)实验步骤:分别从1~10000和从10000~1两种顺序进行计算,应包含的头文件有stdio.h 和math.h(2)程序设计:a.顺序计算#include<stdio.h>#include<math.h>void main(){double sum=0;int n=1;while(1){sum=sum+(1/pow(n,2));if(n%1000==0)printf("sun[%d]=%-30f",n,sum);if(n>=10000)break;n++;}printf("sum[%d]=%f\n",n,sum);}b.逆序计算#include<stdio.h>#include<math.h>void main(){double sum=0;int n=10000;while(n!=0){sum=sum+(1/pow(n,2));if(n%200==0)printf("sum[%d]=%-10f",n,sum);if(n<1)break;n--;}printf("sum[%d]=%f\n",n,sum);}(3)实验结果及分析:程序运行结果:a.顺序计算b.逆序计算结果分析:两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。
东南大学计算方法与实习实验报告
东南大学计算方法与实习实验报告计算方法与实习实验报告学院:学号:姓名:完成日期:实习题一4、设2211Nn j S j ==-∑,已知其精确值为。
1)编制按从大到小的顺序计算S n 的程序; 2)编制按从小到大的顺序计算S n 的程序;3)按两种顺序分别计算S 1000,S 10000,S 30000,并指出有效位数。
● 实验代码 C 语言程序如下:#include #include using namespace std; int main(){ float Sn=0; int N; cin>>N; for(float j=2;j<=N;j++){ Sn=1/(j*j-1)+Sn; } cout<<"从小到大计算的结果为"<<sn<for(j=N;j>=2;j--){ Sn=1/(j*j-1)+Sn;}cout<<"从大到小计算的结果为"<<sn<<=""> ● 运行窗口实习题二1、用牛顿法求下列方程的根:1) 20xx e -=实验代码C 语言程序代码如下:#include #include #define N 100 #define eps 1e-6 #define eta 1e-8using namespace std;float Newton(float f(float),float fl(float),float x0){ float x1,d; int k=0;do{x1=x0-f(x0)/fl(x0);if(k++>N||fabs(fl(x1))<eps){cout<<"发散"<<endl;break;}< p="">d=fabs(x1)<1?x1-x0:(x1-x0)/x1;x0=x1;cout<<"x="<<x0<<endl;< p="">}while(fabs(d)>eps&&fabs(f(x1))>eta);return x1;}float f(float x){return x+log10(x)-2;}float fl(float x){return 1+1/x;}void main(){float x0,y0;cin>>x0;y0=Newton(f,fl,x0);cout<<"方程的根为"<<y0<<endl;< p="">}运行窗口实习题三1、用列主元消去法解方程组:1)12434x x x ++= 123421x x x x +-+=1234333x x x x --+=-1234234x x x x -++-=实验代码C 语言程序代码如下: #include #include using namespace std;void ColPivot(float *c,int n,float x[]) { int i,j,t,k; float p; for(i=0;i<=n-2;i++){ k=i; for(j=i+1;j<=n-1;j++) if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=j) for(j=i;j<=n;j++){ p=*(c+i*(n+1)+j); *(c+i*(n+1)+j)=*(c+k*(n+1)+j); *(c+k*(n+1)+j)=p; } for(j=i+1;j<=n-1;j++){ p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i)); for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t)); } } for(i=n-1;i>=0;i--){ for(j=n-1;j>=i+1;j--) (*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j)); x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i)); } } int main(){ void ColPivot(float*,int,float[]); int i;float x[4];float c[4][5]={1,1,0,3,4,2,1,-1,1,1,3,-1,-1,3,-3,-1,2,3,-1,4};ColPivot(c[0],4,x);for(i=0;i<=3;i++)printf("[x%d]=%f\n",i,x[i]);return 0;}●运行窗口4、编写用追赶法解三对角线性方程组的程序,并解下列方程组:,其中2)Ax bA10x10=-4 11 -4 11 -4 1. . .. . .1 -4 11 -4b= -27-15…-15●实验代码C语言程序如下:#include#includeusing namespace std;void ColPivot(float *c,int n,float x[]){int i,j,t,k;float p;for(i=0;i<=n-2;i++){k=i;for(j=i+1;j<=n-1;j++)if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i)))) k=j; if(k!=j)for(j=i;j<=n;j++){p=*(c+i*(n+1)+j);*(c+i*(n+1)+j)=*(c+k*(n+1)+j);*(c+k*(n+1)+j)=p;}for(j=i+1;j<=n-1;j++){p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));for(t=i;t<=n;t++)*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t)); }}for(i=n-1;i>=0;i--){for(j=n-1;j>=i+1;j--)(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));}}int main(){void ColPivot(float*,int,float[]);int i;float x[10];float c[10][11]={-4,1,0,0,0,0,0,0,0,0,-27, 1,-4,1,0,0,0,0,0,0,0,-15,0,1,-4,1,0,0,0,0,0,0,-15,0,0,1,-4,1,0,0,0,0,0,-15,0,0,0,1,-4,1,0,0,0,0,-15,0,0,0,0,1,-4,1,0,0,0,-15,0,0,0,0,0,1,-4,1,0,0,-15,0,0,0,0,0,0,1,-4,1,0,-15,0,0,0,0,0,0,0,1,-4,1,-15,0,0,0,0,0,0,0,0,1,-4,-15};ColPivot(c[0],10,x);for(i=0;i<=9;i++)printf("[x%d]=%f\n",i,x[i]); return 0;}●运行窗口实习题四123●实验代码C语言程序如下:#include#includeusing namespace std;#define N 5void Difference(float x[],float y[],int n){float *f=new float[n+1];int k,i;for(k=1;k<=n;k++){f[0]=y[k];for(i=0;i<k;i++)< p="">f[i+1]=(f[i]-y[i])/(x[k]-x[i]);y[k]=f[k];}delete f;return;}int main(){int i;float a,b,c,varx=0.46,vary=0.55,varz=0.60;float x[N+1]={0.30,0.42,0.50,0.58,0.66,0.72};floaty[N+1]={1.04403,1.08462,1.11803,1.15603,1.19817,1.23223};Difference(x,y,N); a=y[N];b=y[N];c=y[N]; for(i=N-1;i>=0;i--) a=a*(varx-x[i])+y[i]; for(i=N-1;i>=0;i--) b=b*(vary-x[i])+y[i]; for(i=N-1;i>=0;i--) c=c*(varz-x[i])+y[i];printf("Nn(%f)=%f\n",varx,a); printf("Nn(%f)=%f\n",vary,b); printf("Nn(%f)=%f\n",varz,c); return 0;}● 运行窗口实习题六1、用复化梯形公式和复化辛卜生公式计算积分I 1(f )=?+202x cos 1πdx 。
《计算方法》课内实验报告(实验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。
计算方法实验报告
计算方法实验报告实验目的: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、插值与拟合拉格朗日插值法和牛顿插值法在给定节点处能够准确插值,但对于节点之外的区域,可能会出现较大偏差。
计算方法实验报告(20210313193700)
实验报告一、求方程f(x)=x A3-sinx-12x+1 的全部根,€=le-61、用一般迭代法;2、用牛顿迭代法;并比较两种迭代的收敛速度。
一、首先,由题可求得:/W =3x2-cosx-12 .其次,分析得到苴根所在的区间。
①令f(x)- 0,可得到%3 -12x4-1 = sinx.②用一阶导数分析得到X3-12X+ 1和sinx两个函数的增减区间:再用二阶导数分析得到两个函数的拐点以及凹凸区间.③在直角坐标轴上描墓出X3-12X+1= 0和sinx = 0的图,在图上可以看到他们的交点, 然后估计交点所在的区间,即是所要求的根的区间。
经过估计,得到根所在的区间为[-4-3], [0,1]和[3,4].1、一般迭代法(1)算法步骤:设e为给定的允许精度,迭代法的计算步骤为:①选定初值A().|h /(A)=0确定函数g(x),得等价形式x = g(x).②计算gg).由迭代公式得X|=g(x。
).③如果|x,-x0|<^,则迭代结束,取“为解的近似值;否则,用“代替儿,重复步骤②和步骤③.(2)程丿了:代码:①在区间[-4,-3]内,代码:clcx0=-3•5; $初值心iter_max=100; $迭代的最大次数ep=le-6; $允许精度£k=0;while k<=iter_max $]<从0开始至ljiter_max循坯;xl=(sin(x0)+12*x0-l) ."(1/3); 貂弋入儿,算出旺的值if abs (xl-xO) <ep %|x, -x0\与允许精度作比较break;匕条件卜|一对5£成立,跳出循环endxO=xl; 务条件|Xj -X Q\<£不成立,用“代替兀0k=k+l; %kiniendx_star=xl, iter=k 为解的近似值,iter为迭代次数运行结果:x_star = -3.4101 : iter =14②在区间[0,1]内,代码:clcxO=O . 5; $初值旺iter_max=100; $迭代的最大次数ep=le-6; $允许精度gk=0;while k<=iter_max $1<从0开始至ljiter_max循坯;xl=(l/12) * (x0.^3-sin(x0) +1); 貂弋入心,算岀“的值if abs (xl-xO) <ep %|xj -x0|与允许精度作比较break; 务条件\x{ -x()| < s成立,跳出循环endxO=xl;匕条件|x, -X Q\<£不成立,用“代替儿k=k+l; Ek 力mendx_star=xl, iter=k 为解的近似值,iter为迭代次数结果:x_star = 0.07696 ; iter =6③在区间[3,4]内,代码:clcx0=3.5; &初值心iter_max=100; $迭代的最大次数ep=le-6; $允许精度£k=0;while k<=iter_max 靱从0开始至ljiter_max循环xl=(sin(x0)+12*x0-l) (1/3); 訂弋入心,算出“的值if abs(xl-xO)<ep 引召-对与允许精度作比较break; 匕条件-x()| <£•成立,跳岀循环endxO=xl; $条件|Xj -x0| < £不成立,用X]代替X。
计算方法实验报告
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次拟合曲线,红色为龙格函数曲线可以看出:三次拟合曲线与龙格函数基本不重合,拟合效果差。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算方法与实习实验报告学院:电气工程学院指导老师:***班级: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)是一次式。
拟合曲线光顺性差实验2 牛顿插值法一、方法原理及基本思路在拉格朗日插值方法中,若增加一个节点数据,其插值的多项式需重新计算。
现构造一个插值多项式Nn(x),只需对Nn-1(x)作简单修正(如增加某项)即可得到,这样计算方便。
利用牛顿插值公式,当增加一个节点时,只需在后面多计算一项,而前面的计算仍有用;另一方面Nn(x)的各项系数恰好又是各阶差商,而各阶差商可用差商公式来计算。
由线性代数知,对任何一个不高n次的多项式P(x)=b0+b1x+b2x2+…+bnxn (幂基) ①也可将其写成P(x)=a0+a1(x-x0)+a2(x-x0) (x-x1)+…+a n(x-x0) …(x-x n-1)其中ai为系数,xi为给定节点,可由①求出ai 一般情况下,牛顿插值多项式Nn(x)可写成:Nn(x)= a0+a1(x-x0)+a2(x-x0) (x-x1)+…+a n(x-x0) …(x-x n-1))只需求出系数ai,即可得到插值多项式。
二、计算方法及过程1.先后输入节点个数n和节点的横纵坐标,插值点的横坐标,最后输入精度e2. 用do-while循环语句得到跳出循环时k的值3.将k值与n-1进行比较,若在达到精度时k<n-1,则输出计算结果;若此时k=n-1,则计算失败!函数语句与形参说明程序源代码如下:#include<iostream>#include<math.h>using namespace std;#define MAX 100void main(){ float x[MAX],y[MAX];float x0,y0,e,N1;float N0=0;int i,k,n;cout<<"输入节点的个数,n=";cin>>n;cout<<"请输入插值节点!"<<endl;for(i=0;i<n;i++) cin>>x[i];cout<<"请输入对应的函数值!"<<endl;for(i=0;i<n;i++) cin>>y[i];cout<<"请输入插值点,x0=";cin>>x0;cout<<"请输入精度,e=";cin>>e;y0=1; N1=y[0]; k=0;do { k++;N0=N1;y0=y0*(x0-x[k-1]);for(i=0;i<k;i++) y[k]=(y[k]-y[i])/(x[k]-x[i]);N1=N0+y0*y[k];} while (fabs(N1-N0) > e && k<(n-1));if (k==(n-1)) cout<<"计算失败!";if (k<(n-1)) cout<<"输出结果y[x0]="<<N1<<endl; system("pause");}三.运行结果测试:实习题二1.用牛顿法求下列方程的根:3)lg20 x x+-=实验代码:#include <stdio.h>#include <math.h>#define N 100#define eps 1e-6#define eta 1e-8float Newton(float(*f)(float),float(*f1)(float),float x0) {float x1,d;int k=0;do{x1=x0-(*f)(x0)/(*f1)(x0);if(k++>N||fabs((*f1)(x1))<eps){printf("\n Newton 迭代发散");break;}d=fabs(x1)<1?x1-x0:(x1-x0)/x1;x0=x1;printf("x(%d)=%f\t",k,x0);}while(fabs(d)>eps&&fabs((*f)(x1))>eta);return x1;}float f(float x){return log10(x)+x-2;}float fl(float x){return 1.0/(x*log(10))+1;}void main(){float x0,y0;printf("请输入迭代初值x0\n");scanf("%f",&x0);printf("x(0)=%f\n",x0);y0=Newton(f,fl,x0);printf("方程的根为: %f\n",y0);}运行窗口:实习题三4.编写用追赶法解三对角线性方程组的程序,并解下列方程组:2)Ax b实验代码#include<iostream>#include<cmath>using namespace std;void main(){float a=1;float b=-4;float c=1;float d[11]={0,-27,-15,-15,-15,-15,-15,-15,-15,-15,-15};float l[11];float bb[11];float y[11];float x[11];bb[1]=b;y[1]=d[1];int i;for(i=2;i<11;i++){l[i]=a/bb[i-1];bb[i]=b-l[i]*c;y[i]=d[i]-l[i]*y[i];}x[10]=y[10]/bb[10];for(i=9;1>0;i--){x[i]=(y[i]-c*x[i+1])/bb[i];}for(i=1;i<11;i++)cout<<'x'<<i<<':'<<x[i]<<endl;}运行窗口#include<stdio.h>#include<string.h>#include<math.h>#include<conio.h>#include<stdlib.h>#define N 11main(){float a[N]={0,0,1,1,1,1,1,1,1,1,1};float b[N]={0,-4,-4,-4,-4,-4,-4,-4,-4,-4,-4};float c[N]={0,1,1,1,1,1,1,1,1,1,0};float d[N]={0,-27,-15,-15,-15,-15,-15,-15,-15,-15,-15};float x[N]={0,0,0,0,0,0,0,0,0,0,0};float r[N]={0,0,0,0,0,0,0,0,0,0,0};float y[N]={0,0,0,0,0,0,0,0,0,0,0};float q;//clrscr();int k;r[1]=c[1]/b[1];y[1]=d[1]/b[1];for(k=2;k<N-1;k++){q=b[k]-r[k-1]*a[k];r[k]=c[k]/q;y[k]=(d[k]-y[k-1]*a[k])/q;}y[N-1]=(d[N-1]-y[N-2]*a[N-1])/(b[N-1]-r[N-2]*a[N-1]);x[N-1]=y[N-1];for(k=N-2;k>=1;k--)x[k]=y[k]-r[k]*x[k+1];for(k=1;k<N;k++)printf("x[%d]=%f\n",k,x[k]);getch();return 0 ; }● 运行窗口5.12310211x x x -+=-2348311x x x -+=-1232106x x x -+=123431125x x x x -+-+=雅克比迭代法● 实验代码#include<stdio.h>#include<math.h>#define eps 1e-6#define max 100void Jacobi(float *a,int n,float x[]){int i,j,k=0;float epsilon,s;float *y=new float[n];for(i=0;i<n;i++)x[i]=0;while(1){epsilon=0;k++;for(i=0;i<n;i++){s=0;for(j=0;j<n;j++){if(j==i)continue;s+=*(a+i*(n+1)+j)*x[j];}y[i]=(*(a+i*(n+1)+n)-s)/(*(a+i*(n+1)+i));epsilon+=fabs(y[i]-x[i]);}for(i=0;i<n;i++)x[i]=y[i];if(epsilon<eps){printf("迭代次数为:%d\n",k);return;}if(k>=max){printf("迭代发散");return;}}delete y;}void main(){int i;float a[4][5]={10,-1,2,0,-11,0,8,-1,3,-11,2,-1,10,0,6,-1,3,-1,11,25};float x[4];Jacobi(a[0],4,x);for(i=0;i<4;i++)printf("x[%d]=%f\n",i,x[i]);}运行窗口高斯-塞德尔迭代法实验代码#include<stdio.h>#include<math.h>#define N 500void main(){int i;float x[4];float c[4][5]={10,-1,2,0,-11,0,8,-1,3,-11,2,-1,10,0,6,-1,3,-1,11,25};void GaussSeidel(float *,int,float[]);GaussSeidel(c[0],4,x);for(i=0;i<4;i++)printf("x[%d]=%f\n",i,x[i]);}void GaussSeidel(float *a,int n,float x[]){int i,j,k=1;float d,dx,eps;for(i=0;i<n;i++)x[i]=0.0;while(1){eps=0;for(i=0;i<n;i++){d=0;for(j=0;j<n;j++){if(j==i)continue;d+=*(a+i*(n+1)+j)*x[j];}dx=(*(a+i*(n+1)+n)-d)/(*(a+i*(n+1)+i));eps+=fabs(dx-x[i]);x[i]=dx;}if(eps<1e-6){printf("迭代次数为:%d\n",k);return;}if(k>N){printf("迭代发散\n");return;}k++;}}●运行窗口实习题四Xi 0.30 0.42 0.50 0.58 0.66 0.72Yi 1.04403 1.08462 1.11803 1.15603 1.19817 1.23223●实验代码#include <stdio.h>#define N 5void Difference(float x[],float y[],int n){float *f=new float[n+1];int k,i;for(k=1;k<=n;k++){f[0]=y[k];for(i=0;i<k;i++)f[i+1]=(f[i]-y[i])/(x[k]-x[i]);y[k]=f[k];}delete f;return;}void main(){int i;float a,b,c,varx=0.46,vary=0.55,varz=0.60;float x[N+1]={0.30,0.42,0.50,0.58,0.66,0.72};float y[N+1]={1.04403,1.08462,1.11803,1.15603,1.19817,1.23223};Difference(x,y,N);a=y[N];b=y[N];c=y[N];for(i=N-1;i>=0;i--)a=a*(varx-x[i])+y[i];for(i=N-1;i>=0;i--)b=b*(vary-x[i])+y[i];for(i=N-1;i>=0;i--)c=c*(varz-x[i])+y[i];printf("Nn(%f)=%f\n",varx,a);printf("Nn(%f)=%f\n",vary,b);printf("Nn(%f)=%f\n",varz,c);}运行窗口实习题51.Xi 1 1.5 2 2.5 3 3.5Yi 33.4 79.50 122.65 159.05 189.15 214.15 Xi 4 4.5 5 5.5 6 6.5Yi 238.65 252.50 267.55 280.50 296.65 301.40实验运行代码://最小二乘法拟合曲线#include<iostream>#include<cmath>using namespace std;const int n=15;//数据对个数const int m=3;//线性无关函数个数class ColPivot{friend class Approx;private:double c[m][m+1];double x[m];public:ColPivot(){for(int i=0;i<m;i++){for(int j=0;j<m+1;j++) c[i][j]=0;x[i]=0;}}void Cal();};void ColPivot::Cal(){int i,j,t,k;double p;for(i=0;i<m-1;i++){k=i;for(j=i+1;j<m;j++){if(fabs(c[j][i])>fabs(c[k][i])) k=j;}if(k!=j){for(j=i;j<m+1;j++){p=c[i][j];c[i][j]=c[k][j];c[k][j]=p;}}for(j=i+1;j<m;j++){p=c[j][i]/c[i][i];for(t=i;t<m+1;t++){c[j][t]-=p*c[i][t];}}}for(i=m-1;i>=0;i--){p=c[i][m];for(j=m-1;j>i;j--){p-=c[i][j]*x[j];}if(c[i][i]==0) x[i]=0;else x[i]=p/c[i][i];}}class Approx{private:double x[n],y[n],a[3],b[2];public:void GetValue(double[],double[]);void Para();void Expo();void Show();};void Approx::GetValue(double a[n],double b[n]) {for(int i=0;i<n;i++){x[i]=a[i];y[i]=b[i];}}void Approx::Para(){int i,j,t;ColPivot col;for(i=0;i<3;i++){for(j=0;j<3;j++){for(t=0;t<n;t++) col.c[i][j]+=pow(x[t],i)*pow(x[t],j);}for(t=0;t<n;t++) col.c[i][3]+=y[t]*pow(x[t],i);}col.Cal();for(i=0;i<3;i++) a[i]=col.x[i];}void Approx::Expo(){int i,j,t;ColPivot col;for(i=0;i<2;i++){for(j=0;j<2;j++){for(t=0;t<n;t++) col.c[i][j]+=pow(x[t],i)*pow(x[t],j);}for(t=0;t<n;t++) col.c[i][3]+=log(y[t])*pow(x[t],i);}col.Cal();b[0]=exp(col.x[0]);b[1]=col.x[1];}void Approx::Show(){cout<<"用抛物线拟合:"<<endl;cout<<"a="<<a[0]<<endl;cout<<"b="<<a[1]<<endl;cout<<"c="<<a[2]<<endl;cout<<"用指数曲线拟合:"<<endl;cout<<"a="<<b[0]<<endl;cout<<"b="<<b[1]<<endl;}int main(){Approx ap;double x[15];for(int i=0;i<15;i++) x[i]=1+i*0.5;doubley[15]={33.4,79.5,122.65,159.05,189.15,214.15,238.65,252.5,267.55,280.5,296.65,301.4,310. 4,318.15,325.15};ap.GetValue(x,y);ap.Para();ap.Expo();ap.Show();return 0;}。