东南大学计算方法实验报告
计算方法实验报告

计算方法实验报告计算方法实验报告概述:计算方法是一门研究如何用计算机解决数学问题的学科。
在本次实验中,我们将学习和应用几种常见的计算方法,包括数值逼近、插值、数值积分和常微分方程求解。
通过实验,我们将深入了解这些方法的原理、应用场景以及其在计算机科学和工程领域的重要性。
数值逼近:数值逼近是一种通过使用近似值来计算复杂函数的方法。
在实验中,我们通过使用泰勒级数展开和牛顿迭代法等数值逼近技术,来计算函数的近似值。
这些方法在科学计算和工程领域中广泛应用,例如在信号处理、图像处理和优化问题中。
插值:插值是一种通过已知数据点来估算未知数据点的方法。
在实验中,我们将学习和应用拉格朗日插值和牛顿插值等方法,以及使用这些方法来构造函数的近似曲线。
插值技术在数据分析、图像处理和计算机图形学等领域中具有重要的应用价值。
数值积分:数值积分是一种通过将函数曲线划分为小矩形或梯形来估算函数的积分值的方法。
在实验中,我们将学习和应用矩形法和梯形法等数值积分技术,以及使用这些方法来计算函数的近似积分值。
数值积分在物理学、金融学和统计学等领域中被广泛使用。
常微分方程求解:常微分方程求解是一种通过数值方法来求解微分方程的方法。
在实验中,我们将学习和应用欧拉法和龙格-库塔法等常微分方程求解技术,以及使用这些方法来求解一些常见的微分方程。
常微分方程求解在物理学、生物学和工程学等领域中具有广泛的应用。
实验结果:通过实验,我们成功地应用了数值逼近、插值、数值积分和常微分方程求解等计算方法。
我们得到了准确的结果,并且在不同的应用场景中验证了这些方法的有效性和可靠性。
这些实验结果将对我们进一步理解和应用计算方法提供重要的指导和支持。
结论:计算方法是计算机科学和工程领域中的重要学科,它提供了解决复杂数学问题的有效工具和方法。
通过本次实验,我们深入了解了数值逼近、插值、数值积分和常微分方程求解等计算方法的原理和应用。
这些方法在科学研究、工程设计和数据分析等领域中具有广泛的应用价值。
东南大学计算方法与实习上机实验一

东南大学计算方法与实习实验报告学院:电子科学与工程学院学号: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 的逐渐增大,两种算法的运行结果相差越来越大。
《计算方法》实验报告材料

《计算方法》实验报告材料引言:计算方法是一门应用数学的基础课程,通过实验教学,能够帮助学生更好地理解和掌握各种数值计算的方法和技巧。
本次实验旨在通过编程实现一些常用的数值计算方法,并通过对比分析实验结果,验证方法的有效性和可行性。
实验一:插值算法插值算法是利用已知的数据点,构建一个连续函数以逼近数据的方法。
本次实验中使用的插值算法为拉格朗日插值和牛顿插值。
通过编程实现这两种算法,并选取若干个数据点进行测试,得到插值函数的结果。
通过比较原始数据和插值函数的结果,可以验证插值算法的准确性和可行性。
实验二:方程求解方程求解是数值计算中的一个重要问题,求解非线性方程、线性方程组和特征值问题等都需要采用相应的迭代方法。
本次实验中,我们实现了常用的牛顿迭代法和二分法,并选择数学问题进行求解。
通过比较实验结果和理论值的误差,可以验证求解方法的精确性和可行性。
实验三:数值积分数值积分是利用数值方法对定积分进行近似求解的过程。
本次实验中,我们实现了矩形法、梯形法和辛普森法等常用的数值积分方法,并选取若干函数进行数值积分的计算。
通过比较数值积分的结果和解析解或数值解的误差,可以验证数值积分方法的准确性和可行性。
实验四:常微分方程求解常微分方程求解是数值计算中的一个重要问题,常常涉及到物理、化学、生物等科学领域。
本次实验中,我们实现了欧拉方法和龙格-库塔方法等常用的常微分方程求解算法,并选取若干常微分方程进行求解。
通过比较数值解和解析解或数值解的误差,可以验证常微分方程求解方法的精确性和可行性。
实验五:线性方程组求解线性方程组求解是数值计算中的一个重要问题,常常涉及到矩阵的运算和迭代方法。
本次实验中,我们实现了高斯消元法和追赶法等常用的线性方程组求解算法,并选择一些矩阵进行求解。
通过比较数值解和解析解或数值解的误差,可以验证线性方程组求解方法的精确性和可行性。
结论:通过本次实验,我们掌握了插值算法、方程求解、数值积分、常微分方程求解和线性方程组求解等常用的计算方法。
- 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;}。