东南大学计算方法与实习上机实验一
计算方法与实习答案
计算方法与实习答案【篇一:《基础会计学习指导、习题与实训》答案】名词解释1.会计:是以货币为主要计量单位,以凭证为依据,运用专门的技术方法,对一定主体的经济活动进行连续、系统、全面的核算与监督,以提高经济效益为目标,向有关方面提供会计信息的一种经济管理活动。
2.会计职能:是指会计在经济管理中所具有的功能,即会计在经济管理中能发挥什么作用。
3.会计核算职能:是指以货币为主要计量单位,对企事业单位一定时期的经济活动进行真实、连续、系统、完整的记录、计量和报告。
4.会计监督职能:是指依据监督标准,利用会计核算所提供的会计信息对各单位的经济活动全过程的合法性、合理性和有效性进行的指导、控制和检查。
5.会计对象:是指会计所要核算和监督的内容,即会计工作的内容。
6.会计要素:是对会计对象按经济特性所做的基本分类,是会计对象的具体内容。
7.资产:是指企业过去的交易或者事项形成的、由企业拥有或者控制的、预期会给企业带来未来经济利益的资源。
8.负债:是指企业过去的交易或者事项形成的、预期会导致经济利益流出企业的现时义务。
9.所有者权益:是指企业资产扣除负债后由所有者享有的剩余权益,包括实收资本、资本公积、盈余公积和未分配利润。
10.收入:是指企业在日常活动中形成的、会导致所有者权益增加的、与所有者投入资本无关的经济利益的总流入,包括销售商品收入、劳务收入、利息收入等。
11.费用:是指企业在日常活动中发生的、会导致所有者权益减少的、与向所有者分配利润无关的经济利益的总流出。
12.利润:是指企业在一定会计期间的经营成果,包括收入减去费用后的净额、直接计入当期利润的利得和损失等。
13.会计方法:是为实现会计核算、进行会计管理和完成会计任务所采用的手段。
14.会计核算方法:是对单位已经发生的经济活动进行连续、系统、全面的核算所采用的方法,包括设置账户、复式记账、审核和填制会计凭证、登记账簿、成本计算、财产清查和编制财务会计报告。
东南大学计算机网络实验一
东南大学自动化学院实 验 报 告课程名称: 信息通信网络概论第1次实验实验名称:TCP/IP协议与Socket编程认识实验院(系):自动化专业:自动化姓名:施恺然学号:08013425实验室:金智楼实验组别:无同组人员:无实验时间:2015年12 月6日评定成绩:审阅教师:目录一.实验目的和要求 (3)二.实验原理 (3)三.实验方案与实验步骤 (4)四.实验设备与器材配置 (4)五.实验记录 (4)六.实验总结 (5)七.思考题或讨论题 (7)(要求:给出一级目录,宋体加粗,四号字,1.5倍行距。
)(报告正文部分的格式):(要求:正文部分一律用五号字,宋体,单倍行距。
一级大标题靠左,四号,宋体,加粗。
二级大标题靠左,小四,宋体,不加粗。
)实验报告内容:一. 实验目的和要求实验目的:1) 学习使用MFC制作界面2) 学会利用已有函数添加进入MFC内容中3) 了解学习DNS域名解析协议的机制实验要求1)使用MFC制作一个界面2)将已给函数的语法与原理解释清楚3)将已给函数中的特定固有函数解释清楚二. 实验原理1)MFC的制作:微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是一个微软公司提供的类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。
其中包含的类包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。
2)Gethostbyaddr函数Gethostbyaddr函数的基本作用就是通过已知的域名获得该域名对应的IP地址。
其原理就是DNS域名解析协议。
函数返回对应于给定地址的包含主机名字和地址信息的hostent结构指针。
也就是说返回的是一个包含关于给定地址详细信息的指针,通过解析指针内容可以获得想要主机信息。
3)Gethostbyname函数Gethostbyname函数也是通过DNS服务的获得IP对应的域名。
计算方法上机实验
1.拉格朗日插值多项式,用于离散数据的拟合#include <stdio.h>#include <conio.h>#include <alloc.h>float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/{ int i,j;float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项式*/a=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++){ a[i]=y[i];for(j=0;j<=n-1;j++)if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);yy+=a[i];}free(a);return yy;}main(){ int i,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error!The value of n must in (0,20)."); getch();return 1;} if(n<=0) {printf("Error! The value of n must in (0,20)."); getch(); return 1;} for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");printf("Input xx:");scanf("%f",&xx);yy=lagrange(x,y,xx,n);printf("x=%f,y=%f\n",xx,yy);getch();}2.牛顿插值多项式,用于离散数据的拟合#include <stdio.h>#include <conio.h>#include <alloc.h>void difference(float *x,float *y,int n){ float *f;int k,i;f=(float *)malloc(n*sizeof(float));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];}return;}main(){ int i,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error! The value of n must in (0,20)."); getch(); return 1;} if(n<=0) {printf("Error! The value of n must in (0,20).");getch(); return 1;} for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");difference(x,(float *)y,n);printf("Input xx:");scanf("%f",&xx);yy=y[20];for(i=n-1;i>=0;i--) yy=yy*(xx-x[i])+y[i];printf("NewtonInter(%f)=%f",xx,yy);getch();}3.高斯列主元消去法,求解其次线性方程组第一种#include<stdio.h>#include <math.h>#define N 20int main(){ int n,i,j,k;int mi,tmp,mx;float a[N][N],b[N],x[N];printf("\nInput n:");scanf("%d",&n);if(n>N){ printf("The input n should in(0,N)!\n");getch();return 1;}if(n<=0){ printf("The input n should in(0,N)!\n");getch();return 1;}printf("Now input a(i,j),i,j=0...%d:\n",n-1); for(i=0;i<n;i++){ for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("Now input b(i),i,j=0...%d:\n",n-1);for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n-2;i++){ for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++) if(fabs(a[j][i])>mx){ mi=j;mx=fabs(a[j][i]);}if(i<mi){ tmp=b[i];b[i]=b[mi];b[mi]=tmp;for(j=i;j<n;j++){ tmp=a[i][j];a[i][j]=a[mi][j];a[mi][j]=tmp;}}for(j=i+1;j<n;j++){ tmp=-a[j][i]/a[i][i];b[j]+=b[i]*tmp;for(k=i;k<n;k++)a[j][k]+=a[i][k]*tmp;}}x[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){ x[i]=b[i];for(j=i+1;j<n;j++)x[i]-=a[i][j]*x[j];x[i]/=a[i][i];}for(i=0;i<n;i++)printf("Answer:\n x[%d]=%f\n",i,x[i]); getch();return 0;}第二种#include<math.h>#include<stdio.h>#define NUMBER 20#define Esc 0x1b#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;int flag,n;exchange(int r,int k);float max(int k);message();main(){float x[NUMBER];int r,k,i,j;char celect;clrscr();printf("\n\nUse Gauss.");printf("\n\n1.Jie please press Enter."); printf("\n\n2.Exit press Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n input n=");scanf("%d",&n);printf(" \n\nInput matrix A and B:"); for(i=1;i<=n;i++){printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);for(j=1;j<=n+1;j++) scanf("%f",&A[i][j]);}for(k=1;k<=n-1;k++){ark=max(k);if(ark==0){printf("\n\nIt's wrong!");message();}else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];}x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++){me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}for(i=1;i<=n;i++){printf(" \n\nx%d=%f",i,x[i]);}message();}exchange(int r,int k){int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k){int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){temp=fabs(A[i][k]);flag=i;}return temp;}message(){printf("\n\n Go on Enter ,Exit press Esc!");switch(getch()){case Enter: main();case Esc: exit(0);default:{printf("\n\nInput error!");message();} }}4.龙贝格求积公式,求解定积分#include<stdio.h>#include<math.h>#define f(x) (sin(x)/x)#define N 20#define MAX 20#define a 2#define b 4#define e 0.00001float LBG(float p,float q,int n){ int i;float sum=0,h=(q-p)/n;for (i=1;i<n;i++)sum+=f(p+i*h);sum+=(f(p)+f(q))/2;return(h*sum);}void main(){ int i;int n=N,m=0;float T[MAX+1][2];T[0][1]=LBG(a,b,n);n*=2;for(m=1;m<MAX;m++){ for(i=0;i<m;i++)T[i][0]=T[i][1];T[0][1]=LBG(a,b,n);n*=2;for(i=1;i<=m;i++)T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);if((T[m-1][1]<T[m][1]+e)&&(T[m-1][1]>T[m][1]-e)){ printf("Answer=%f\n",T[m][1]); getch();return ;}}}5.牛顿迭代公式,求方程的近似解#include<stdio.h>#include<math.h>#include<conio.h>#define N 100#define PS 1e-5#define TA 1e-5float Newton(float (*f)(float),float(*f1)(float),float x0 ) { float x1,d=0;int k=0;do{ x1= x0-f(x0)/f1(x0);if((k++>N)||(fabs(f1(x1))<PS)){ printf("\nFailed!");getch();exit();}d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);x0=x1;printf("x(%d)=%f\n",k,x0);}while((fabs(d))>PS&&fabs(f(x1))>TA) ;return x1;}float f(float x){ return x*x*x+x*x-3*x-3; }float f1(float x){ return 3.0*x*x+2*x-3; }void main(){ float f(float);float f1(float);float x0,y0;printf("Input x0: ");scanf("%f",&x0);printf("x(0)=%f\n",x0);y0=Newton(f,f1,x0);printf("\nThe root is x=%f\n",y0); getch();}。
计算方法与实习 第四版 (孙志忠 著) 东南大学出版社 课后答案
2
ww
w.
kh
da
w.
co
∗ − y | → ∞, 计算过程不稳定。 注 :此题中,|yn n
m
× 10−3 .
w.
n = 1, 2, · · ·
co m
e2 e2 r r = . 1 + er 1 − er
w.
课后答案网
aw . kh d
∗ − y | = 510 e ≤ n = 10时,|yn n 0
√ 计算到y100 , 若取 783 ≈ 27.982 (5位有效数字),试问计算到y100 将有多大误差? √ 答 :设x∗ = 783, x = 27.982, x∗ = x + e.
−2 ∗ = y∗ yn n−1 − 10 (x + e), yn = yn−1 − 10−2 x,
1 √ 783, 100
概率与数理统计 第二, C语言程序设计教程 第 西方经济学(微观部分) C语言程序设计教程 第 复变函数全解及导学[西 三版 (浙江大学 三版 (谭浩强 张 (高鸿业 著) 中 二版 (谭浩强 张 安交大 第四版]
社区服务
社区热点
进入社区
/
2009-10-15
ww
er − er = er −
e2 e e 1 r = . = e − = e − r r x∗ e+x 1 + er 1 + e1 r ·········
7. 设y0 = 28, 按递推公式
案 答
yn = yn−1 −
网 课 后
1 2
6. 机器数–略。
w. kh da
∗ −y |=e≤ n = 100时,|yn n
课后答案网
东南大学计算方法实验报告
计算方法与实习实验报告学院:电气工程学院指导老师:***班级: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.方法概要假定()f x 在[,]a b 上连续,()()0f a f b <且()f x 在(,)a b 内仅有一实根*x 取区间中点c ,若()0f c =,则c 恰为其根,否则,根据()()0f a f c <是否成立,可判断出根所属的新的有根子区间(,)a c 或(,)c b ,为节省内存,仍称其为(,)a b 。
运算重复进行,直到满足精度要求为止,即*||c x b a ε-<-<。
式中,a b 为新的有根子区间的端点。
2.计算框图Nowton 迭代法 1.方法概要0x 为初始猜测,则由递推关系1()()k k k k f x x x f x +=-' 产生逼近解*x 的迭代序列{}k x ,这个递推公式就是Newton 法。
当0x 距*x 较近时,{}k x 很快收敛于*x 。
但当0x 选择不当时,会导致{}k x 发散。
故我们事先规定迭代的最多次数。
若超过这个次数,还不收敛,则停止迭代另选初值。
2.计算框图(二)目的掌握二分法与牛顿法的基本原理及应用 (三)要求1.用二分法计算方程2sin 02x x -=在(1,2)内的根的近似值 2.用二分法计算方程310x x --=在(1,1.5)内的根的近似值5(0.510)ε-=⨯。
3.用牛顿法求下列非线性方程的近似根。
① 10xxe -= 00.5x = ② 310x x --= 01x =③ 2(1)(21)0x x --= 00.45x = 00.65x =4.用改进的牛顿法12()()k k k k f x x x f x +=-'计算方程20(1)(21)00.55x x x --==的近似根,并与要求3.中的③的结果进行比较。
二、Gauuss 列主元消去法(一)问题的提出由地一般线性方程组在使用Gauss 消去法求解时,从求解过程中可以清楚地看到,若(1)0k kk a -=,必须施以行交换的手续,才能使消去过程继续下去。
计算方法与实习上机实验报告
计算方法与实习上机实验报告一、引言本文旨在介绍和展示我们在“计算方法”课程中的实习上机实验环节所完成的一些关键任务和所取得的成果。
该实验课程的目标是让我们更深入地理解和应用各种计算方法,并在实际操作中提高我们的编程和问题解决能力。
二、实验内容与目标实验的主要内容是利用各种计算方法解决实际数学问题。
我们被要求使用编程语言(如Python或Java)来实现和解决这些问题。
这些问题包括使用牛顿法求解平方根,使用蒙特卡洛方法计算圆周率,以及使用最优化方法求解函数的最小值等。
实验的目标不仅是让我们掌握计算方法的基本理论,更是要让我们能够在实际操作中运用这些方法。
我们需要在实习过程中,通过与同伴们合作,共同解决问题,提高我们的团队合作能力和问题解决能力。
三、实验过程与问题解决策略在实验过程中,我们遇到了许多问题,如编程错误、理解困难和时间压力等。
我们通过相互讨论、查阅资料和寻求教师帮助等方式,成功地解决了这些问题。
例如,在实现牛顿法求解平方根时,我们一开始对导数的计算和理解出现了一些错误。
但我们通过查阅相关资料和讨论,最终理解了导数的正确计算方法,并成功地实现了牛顿法。
四、实验结果与结论通过这次实习上机实验,我们不仅深入理解了计算方法的基本理论,还在实际操作中提高了我们的编程和问题解决能力。
我们的成果包括编写出了能有效求解平方根、计算圆周率和求解函数最小值的程序。
这次实习上机实验非常成功。
我们的团队不仅在理论学习和实践操作上取得了显著的进步,还在团队合作和问题解决方面积累了宝贵的经验。
这次实验使我们对计算方法有了更深的理解和认识,也提高了我们的编程技能和解决问题的能力。
五、反思与展望回顾这次实验,我们意识到在实验过程中,我们需要更好地管理我们的时间和压力。
在解决问题时,我们需要更有效地利用我们的知识和资源。
在未来,我们希望能够更加熟练地运用计算方法,并能够更有效地解决问题。
我们也希望能够将所学的计算方法应用到更广泛的领域中,如数据分析、科学研究和工业生产等。
东南大学数值分析上机报告完整版
数值分析上机实验报告目录1.chapter1舍入误差及有效数 (1)2.chapter2Newton迭代法 (3)3.chapter3线性代数方程组数值解法-列主元Gauss消去法 (7)4.chapter3线性代数方程组数值解法-逐次超松弛迭代法 (8)5.chapter4多项式插值与函数最佳逼近 (10)1.chapter1舍入误差及有效数1.1题目设S N =∑1j 2−1N j=2,其精确值为)11123(21+--N N 。
(1)编制按从大到小的顺序11131121222-+⋯⋯+-+-=N S N ,计算S N 的通用程序。
(2)编制按从小到大的顺序1211)1(111222-+⋯⋯+--+-=N N S N ,计算S N 的通用程序。
(3)按两种顺序分别计算64210,10,10S S S ,并指出有效位数。
(编制程序时用单精度)(4)通过本次上机题,你明白了什么? 1.2编写相应的matlab 程序 clear;N=input('please input N:'); AValue=((3/2-1/N-1/(N+1))/2); sn1=single(0); sn2=single(0); for i=2:Nsn1=sn1+1/(i*i-1); %从大到小相加的通用程序% endep1=abs(sn1-AValue); for j=N:-1:2sn2=sn2+1/(j*j-1); %从小到大相加的通用程序% endep2=abs(sn2-AValue);fprintf('精确值为:%f\n',AValue);fprintf('从大到小的顺序累加得sn=%f\n',sn1); fprintf('从大到小相加的误差ep1=%f\n',ep1); fprintf('从小到大的顺序累加得sn=%f\n',sn2); fprintf('从小到大相加的误差ep2=%f\n',ep2); disp('================================='); 1.3matlab 运行程序结果 >> chaper1please input N:100 精确值为:0.740050从大到小的顺序累加得sn=0.740049 从大到小相加的误差ep1=0.000001 从小到大的顺序累加得sn=0.740050 从小到大相加的误差ep2=0.000000 >> chaper1please input N:10000 精确值为:0.749900从大到小的顺序累加得sn=0.749852 从大到小相加的误差ep1=0.000048 从小到大的顺序累加得sn=0.749900 从小到大相加的误差ep2=0.000000please input N:1000000精确值为:0.749999从大到小的顺序累加得sn=0.749852 从大到小相加的误差ep1=0.000147 从小到大的顺序累加得sn=0.749999 从小到大相加的误差ep2=0.0000001.4结果分析以及感悟按照从大到小顺序相加的有效位数为:5,4,3。
东南大学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.逆序计算结果分析:两种不同顺序计算结果是一样的,顺序计算误差从一开始就很小,而逆序计算误差最开始十分大,后来结果正确。
计算方法上机实验报告
. 《计算方法》上机实验报告班级:XXXXXX小组成员:XXXXXXXXXXXXXXXXXXXXXXXXXXXX任课教师:XXX二〇一八年五月二十五日前言通过进行多次的上机实验,我们结合课本上的内容以及老师对我们的指导,能够较为熟练地掌握Newton 迭代法、Jacobi 迭代法、Gauss-Seidel 迭代法、Newton 插值法、Lagrange 插值法和Gauss 求积公式等六种算法的原理和使用方法,并参考课本例题进行了MATLAB 程序的编写。
以下为本次上机实验报告,按照实验内容共分为六部分。
实验一:一、实验名称及题目: Newton 迭代法例2.7(P38):应用Newton 迭代法求在附近的数值解,并使其满足.二、解题思路:设'x 是0)(=x f 的根,选取0x 作为'x 初始近似值,过点())(,00x f x 做曲线)(x f y =的切线L ,L 的方程为))((')(000x x x f x f y -+=,求出L 与x 轴交点的横坐标)(')(0001x f x f x x -=,称1x 为'x 的一次近似值,过点))(,(11x f x 做曲线)(x f y =的切线,求该切线与x 轴的横坐标)(')(1112x f x f x x -=称2x 为'x 的二次近似值,重复以上过程,得'x 的近似值序列{}n x ,把)(')(1n n n n x f x f x x -=+称为'x 的1+n 次近似值,这种求解方法就是牛顿迭代法。
三、Matlab 程序代码:function newton_iteration(x0,tol) syms z %定义自变量 format long %定义精度 f=z*z*z-z-1; f1=diff(f);%求导 y=subs(f,z,x0);y1=subs(f1,z,x0);%向函数中代值 x1=x0-y/y1; k=1;while abs(x1-x0)>=tol x0=x1;y=subs(f,z,x0); y1=subs(f1,z,x0); x1=x0-y/y1;k=k+1; endx=double(x1) K四、运行结果:实验二:一、实验名称及题目:Jacobi 迭代法例3.7(P74):试利用Jacobi 迭代公式求解方程组要求数值解为方程组的精确解. 二、解题思路:首先将方程组中的系数矩阵A 分解成三部分,即:U D L A ++=,D 为对角阵,L 为下三角矩阵,U 为上三角矩阵。
东南大学计算方法与实习实验报告
东南大学计算方法与实习实验报告计算方法与实习实验报告学院:学号:姓名:完成日期:实习题一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 。
计算机上机报告
计算方法上机实验报告上课时间: 2014-2015学年秋学期, 6~14周一. 拉格朗日插值------------------------------------------------------1二. 牛顿插值------------------------------------------------------------3三. 改进欧拉法---------------------------------------------------------5四. 四阶龙格-库塔-----------------------------------------------------7五. 牛顿迭代------------------------------------------------------------9 六.复化Simpson公式------------------------------------------------11七. Romberg算法------------------------------------------------------14八. Seidel迭代法------------------------------------------------------17九. Gauss列主元消去法----------------------------------------------20一.拉格朗日插值1.程序代码#include<iostream.h>void Lagrange(){int i=0;double a[10],b[10],L,L1,L2,L3,L4,x;cout<<"x=";for(i=0;i<4;i++){cin>>a[i];}cout<<"y=";for(i=0;i<4;i++){cin>>b[i];}cout<<"x=";cin>>x;L1=(x-a[1])*(x-a[2])*(x-a[3])*b[0]/(a[0]-a[1])/(a[0]-a[2])/(a[0]-a[3]);L2=(x-a[0])*(x-a[2])*(x-a[3])*b[1]/(a[1]-a[0])/(a[1]-a[2])/(a[1]-a[3]);L3=(x-a[0])*(x-a[1])*(x-a[3])*b[2]/(a[2]-a[0])/(a[2]-a[1])/(a[2]-a[3]);L4=(x-a[0])*(x-a[1])*(x-a[2])*b[3]/(a[3]-a[0])/(a[3]-a[1])/(a[3]-a[2]);L=L1+L2+L3+L4;cout<<"L="<<L;}void main(){Lagrange();cout<<endl;}2.例子3.运行结果二. 牛顿插值1.程序代码#include <iostream.h>#include<conio.h>void main(){int n,i,j;double A[50][50],*x,*y;cout<<"请输入插值节点数: ";cin>>n;x=new double[n];y=new double[n];cout<<"请输入这"<<n<<"个插值节点(xi,yi): "<<endl;for(i=0;i<=n-1;i++)cin>>x[i]>>y[i];double K=1,xx,N=0,P;for(i=0;i<=n-1;i++){A[i][0]=x[i];A[i][1]=y[i];}for(j=2;j<=n;j++)for(i=1;i<=n-1;i++){A[i][j]=(A[i][j-1]-A[i-1][j-1])/(A[i][0]-A[i-j+1][0]);}for(i=0;i<=n-1;i++)cout<<"输出第"<<i+1<<"阶差商为: "<<A[i][i+1]<<endl;cout<<"请输入预求值x=";cin>>xx;for(i=0;i<n-1;i++){K*=xx-x[i];N+=A[i+1][i+2]*K;P=A[0][1]+N;}cout<<"Newton插值结果为: y="<<P<<endl;getch();}2.例子3.运行结果三. 改进欧拉法1.程序代码#include<iostream.h>#include<conio.h>double fun(double x,double y){return(-0.9*y/(1+2*x));}void main(){double a,b,*y,h,*x,yp,yc;int n,k;cout<<"常微分方程为y'=-0.9*y/(1+2*x)"<<endl;cout<<"其中0<=x<=1"<<endl;cout<<"初值为y(0)=1"<<endl;cout<<"请输入计算区间(a,b): ";cin>>a>>b;cout<<"请输入步长h: ";cin>>h;cout<<"请输入计算次数: ";cin>>n;y=new double[n];x=new double[n];cout<<"请输入初值y(0)=";cin>>y[0];x[0]=a;for(k=0;k<=n;k++){yp=y[k]+h*fun(x[k],y[k]);yc=y[k]+h*fun(x[k]+h,yp);y[k+1]=0.5*(yp+yc);x[k+1]=x[k]+h;}cout<<"迭代结果为: "<<endl;for(k=0;k<=n;k++)cout<<"x"<<k<<"="<<x[k]<<'\t'<<"y"<<k<<"="<<y[k]<<endl;getch();}2.例子3.运行结果四. 四阶龙格-库塔1.程序代码#include<iostream.h>#include<conio.h>double fun(double x,double y){return(x-y);}void main(){double a,b,*y,h,x,k1,k2,k3,k4;int n,k;cout<<"常微分方程为y'=x-y"<<endl;cout<<"其中0<=x<=1"<<endl;cout<<"初值为y(0)=0"<<endl;cout<<"请输入计算区间(a,b): ";cin>>a>>b;cout<<"请输入步长h: ";cin>>h;cout<<"请输入计算次数: ";cin>>n;y=new double[n];cout<<"请输入初值y(0): ";cin>>y[0];x=a;cout<<"Runge-Kutta迭代法结果为: "<<endl;cout<<"x0="<<x<<'\t'<<"y0="<<y[0]<<endl;for(k=0;k<=n-1;k++){k1=fun(x,y[k]);k2=fun(x+h/2,y[k]+k1*h/2);k3=fun(x+h/2,y[k]+k2*h/2);k4=fun(x+h,y[k]+k3*h);y[k+1]=y[k]+(h/6)*(k1+2*(k2+k3)+k4);cout<<"x"<<k+1<<"="<<x+h<<'\t'<<"y"<<k+1<<"="<<y[k+1]<<endl;x=x+h;}getch();}2.例子3.运行结果五. 牛顿迭代法1.程序代码(C++代码)#include<iostream>#include<cmath>using namespace std;double newtondiedai(double a,double b,double c,double d,double x); int main(){double a,b,c,d;double x=1.5;cout<<"请依次输入方程四个系数: ";cin>>a>>b>>c>>d;x=newtondiedai(a,b,c,d,x);cout<<x<<endl;return 0;}double newtondiedai(double a,double b,double c,double d,double x) {while(abs(a*x*x*x+b*x*x+c*x+d)>0.000001){x=x-(a*x*x*x+b*x*x+c*x+d)/(3*a*x*x+2*b*x+c);}return x;}2.例子3.运行结果六. 复化Simpson公式1.程序代码(C++代码)#include<iostream.h>#include<math.h>double function1(double x)//被积函数{double s;s=x/(4+x*x);return s;}double function2(double x)//被积函数{double s;s=sqrt(x);return s;}double ReiterationOfSimpson(double a,double b,double n,double f(double x))//复化Simpson公式{double h,fa,fb,xk,xj;h=(b-a)/n;fa=f(a);fb=f(b);double s1=0.0;double s2=0.0;for(int k=1;k<n;k++){xk=a+k*h;s1=s1+f(xk);}for(int j=0;j<n;j++){xj=a+(j+0.5)*h;s2=s2+f(xj);}double sn;//和sn=h/6*(fa+fb+2*s1+4*s2);//复化Simpson公式return sn;}main(){double a,b,Result,n;cout<<"请输入积分下限:"<<endl;cin>>a;cout<<"请输入积分上限:"<<endl;cin>>b;cout<<"请输入分割区间数n:"<<endl;cin>>n;cout<<"复化Simpson 公式计算结果:";Result=ReiterationOfSimpson(a, b, n,function1); cout<<Result<<endl;}2.例子 (620(n 3)4x I dx x ==+⎰)3.运行结果七. Romberg算法1.程序代码(C++代码)#include<iostream>#include<cmath>using namespace std;#define f(x) (4/(1+x*x))#define epsilon 0.0001#define MAXREPT 10double Romberg(double aa,double bb) { int m,n;double h,x;double s,q;double ep;double *y =new double[MAXREPT]; double p;h=bb-aa;y[0]=h*(f(aa)+f(bb))/2.0;m=1;n=1;ep=epsilon+1.0;while((ep>=epsilon)&&(m<MAXREPT)) { p =0.0;for(int i=0;i<n;i++){ x=aa+(i+0.5)*h;p=p+f(x);}p=(y[0] + h*p)/2.0;s=1.0;for(int k=1;k<=m;k++){ s=4.0*s;q=(s*p-y[k-1])/(s-1.0); y[k-1]=p;p=q;}p=fabs(q-y[m-1]);m=m+1;y[m-1]=q;n=n+n;h=h/2.0;}return (q);}int main(){double a,b;cout<<"Romberg积分,请输入积分范围a,b:"<<endl; cin>>a>>b;cout<<"积分结果:"<<Romberg(a,b)<<endl;system("pause");return 0;}2.例子(1241I dxx=+⎰)3.运行结果八. Seidel迭代法1.程序代码(C++代码)# include <math.h># include <stdio.h># define max 100# define EPS 1e-6float a[3][3]={{10,-1,-2},{-1,10,-2},{-1,-1,5}}; float b[3]={7.2,8.3,4.2};float x[3]={0,0,0};float y[3];float S(int m){int n;float S=0;float y;for(n=0;n<3;n++){if(m==n){}else{S+=a[m][n]*x[n];}}y=(b[m]-S)/a[m][m];return y;}void main(){int i;int F,T=1,k=1;do{F=0;if(T){T=0;}else{k++;for(i=0;i<3;i++){x[i]=y[i];}}for(i=0;i<3;i++){y[i]=S(i);}for(i=0;i<3;i++){if(fabs(x[i]-y[i])>EPS){F=1;}}printf("%d\n",k);}while(((F==1)&&k!=max));printf("迭代次数:%d\n",k);for(i=0;i<3;i++){printf("x[%d]=%1.6f\n",i,y[i]); }}2.例子(1012237.21102238.31253 4.2x x xx x xx x x--=⎧⎪-+-=⎨⎪--+=⎩)3.运行结果九. Gauss列主元消去法1.程序代码(C++代码)#include <stdio.h>#include<conio.h>#include <math.h>#define max_dimension 20int n;static float a[max_dimension][max_dimension]; static float b[max_dimension];static float x[max_dimension];void main(){int i;int j;int d;int row;float temp;float known_items;float l[max_dimension][max_dimension];printf("请输入阶数:");scanf("%d",&n);printf("\n");printf("请输入系数矩阵的值: ");printf("\n");for(i=0; i<n; i++){ printf("输入第%d行的值:",i+1);for (j=0; j<n; j++){scanf("%f",&a[i][j]);}printf("\n");}printf("请输入常数项的值: ");for(i=0; i<n; i++)scanf("%f",&b[i]);printf("\n");for(d=0; d<n-1; d++){row=d;for(i=d+1; i<n; i++){if(fabs(a[i][d])>fabs(a[row][d]))row=i;}if(row!=d){for(j=d; j<n; j++){temp=a[row][j];a[row][j]=a[d][j];a[d][j]=temp;}temp=b[row];b[row]=b[d];b[d]=temp;}for(i=d+1; i<n; i++){l[i][d]=-a[i][d]/a[d][d];for (j=d; j<n; j++){a[i][j]=a[i][j]+a[d][j]*l[i][d];}b[i]=b[i]+b[d]*l[i][d];}}printf("\n");for (i=n-1; i>-1; i--){known_items=0;for(j=1; j<n-i; j++){known_items=known_items+a[i][i+j]*x[i+j]; }x[i]=(b[i]-known_items)/a[i][i];}printf("方程组的根为:\n\n");for(i=0; i<n; i++)printf("%.5f ",x[i]);printf("\n\n");getch();}2.例子3.运行结果。
东南大学数值分析上机报告完整版
数值分析上机实验报告目录1.chapter1舍入误差及有效数 (2)2.chapter2Newton迭代法 (3)3.chapter3线性代数方程组数值解法-列主元Gauss消去法 (7)4.chapter3线性代数方程组数值解法-逐次超松弛迭代法 (9)5.chapter4多项式插值与函数最佳逼近 (10)1.chapter1舍入误差及有效数1.1题目设S N =∑1j 2−1N j=2,其精确值为)11123(21+--N N 。
(1)编制按从大到小的顺序11131121222-+⋯⋯+-+-=N S N ,计算S N 的通用程序。
(2)编制按从小到大的顺序1211)1(111222-+⋯⋯+--+-=N N S N ,计算S N 的通用程序。
(3)按两种顺序分别计算64210,10,10S S S ,并指出有效位数。
(编制程序时用单精度)(4)通过本次上机题,你明白了什么?1.2编写相应的matlab 程序clear;N=input('please input N:');AValue=((3/2-1/N-1/(N+1))/2);sn1=single(0);sn2=single(0);for i=2:Nsn1=sn1+1/(i*i-1); %从大到小相加的通用程序%endep1=abs(sn1-AValue);for j=N:-1:2sn2=sn2+1/(j*j-1); %从小到大相加的通用程序%endep2=abs(sn2-AValue);fprintf('精确值为:%f\n',AValue);fprintf('从大到小的顺序累加得sn=%f\n',sn1);fprintf('从大到小相加的误差ep1=%f\n',ep1);fprintf('从小到大的顺序累加得sn=%f\n',sn2);fprintf('从小到大相加的误差ep2=%f\n',ep2);disp('=================================');1.3matlab 运行程序结果>> chaper1please input N:100精确值为:0.740050从大到小的顺序累加得sn=0.740049从大到小相加的误差ep1=0.000001从小到大的顺序累加得sn=0.740050从小到大相加的误差ep2=0.000000>> chaper1please input N:10000精确值为:0.749900从大到小的顺序累加得sn=0.749852从大到小相加的误差ep1=0.000048从小到大的顺序累加得sn=0.749900从小到大相加的误差ep2=0.000000>> chaper1please input N:1000000精确值为:0.749999从大到小的顺序累加得sn=0.749852从大到小相加的误差ep1=0.000147从小到大的顺序累加得sn=0.749999从小到大相加的误差ep2=0.0000001.4结果分析以及感悟按照从大到小顺序相加的有效位数为:5,4,3。
计算方法上机实习一
计算方法上机实习一实习内容一 拉格朗日插值多项式的构造1、方法简介:设y=f(x)是区间[a,b]上的连续函数,已知它在[a,b]上的n+1个互不相同的点x0,x1,…xn 上取值y0,y1,…yn, 希望构造一个函数P(x)作为f(x)的近似表达式,且满足:P(xi)=f(xi)=yi (I=0,1,…n),这类问题即为插值问题。
拉格朗日插值多项式的公式为:2、使用说明:输入参数:N 整变量,插值节点个数。
X0 N 个元素的一维实数组,存放给定的插值节点。
Y0 N 个元素的一维实数组,存放给定的插值节点上相应的函数值。
X 实变量,插值点。
输出参数:Y 实变量,插值结果。
3、实例:(1)据探测资料已知:各标准等压面(300hPa, 500hPa,700hPa, 850hPa, 1000hPa )上各个网格点(100*100)的位势高度值(8280gpm ,5800gpm ,3140gpm ,1520gpm ,770gpm ),用拉格朗日插值多项式求400hPa, 600hPa, 800hPa 个层网格上的位势高度值。
Subroutine LAGR (X0,Y0,N,X,y)Dimension X0(N),Y0(n)Y=0.0Do 30 I=1,nP=1,0Do 20 J=1,nIf(i.ne.j) p=p*(x-x0(j)/(x0(i)-x0(j))20 continue30 y=y+p*y0(i)ReturnEndi j i j n ji j n i n y x x x x x P y ∙--==∏∑≠==)()(004、流程图:5 实习要求及实习报告要求按以上过程完成实习内容,将结果输出到文件中,完成实习报告。
实习报告包括:实习内容,要求,基本原理,运行结果,结果分析和总结。
数值计算方法上机实验报告1
数值计算方法上机实验报告1华北电力大学上机实验报告课程名称:数值计算方法专业班级:学生姓名:学号:指导教师:张建成实验目的:复习和巩固数值计算方法的基本数学模型,全面掌握运用计算机进行数值计算的具体过程及相关问题。
利用计算机语言独立编写、调试数值计算方法程序,培养学生利用计算机和所学理论知识分析解决实际问题的能力。
上机练习任务:利用计算机基本C 语言编写并调试一系列数值方法计算通用程序,并能正确计算给定题目,掌握调试技能。
掌握文件使用编程技能,如文件的各类操作,数据格式设计、通用程序运行过程中文件输入输出运行方式设计等。
一、列主元素消去法求解线性方程组 1、算法原理为避免绝对值很小的元素作为主元,在每次消元之前增加一个选主元的过程,将绝对值大的元素交换到主对角线的位置。
列主元素消元法是当变换到第k 步时,从k 列的kk a 及以下的各元素中选取绝对值最大的元素,然后通过二交换将其交换到kk a 的位置上。
2、输入输出变量ija :为系数矩阵的各个系数K :表示到第k 步消元 3、具体算例输入增广矩阵为: 3 1 2 -3 8 2 1 3 22 3 2 1 28解得:1x =6,2x =4,3x =2;二、LU 分解法求解线性方程组1、算法原理应用高斯消去法解n 阶线性方程Ax b =经过1n -步消去后得出一个等价的上三角形方程组()()n n A x b =,对上三角形方程组用逐步回代就可以求出解来。
这个过程也可通过矩阵分解来实现。
将非奇异阵分解成一个下三角阵L 和上三角阵U 的乘积A LU =称为对矩阵A 的三角分解,又称LU 分解。
根据LU 分解,将Ax b =分解为Ly bUx y =??=?形式,简化了求解问题。
2、输入输出变量ij a 为系数矩阵元素i b 为常数矩阵系数,i j i jl u 分别为下、上三角矩阵元素 k 表示第k 步消元 3、具体算例输入增广矩阵 3 2 3 4 39 3 -2 2 14 4 2 3 43 解得: 6 5 3三、拉格朗日插值1、算法原理设函数()y f x =在区间[a,b]上有节点01,,,,n x x x 上的函数值,构造一个次数不超过n次的代数多项式1110()n n n n p x a x a x a x a --=++++ ,使 (),0,1,,i i P x y i n == 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
东南大学计算方法与实习实验报告
学院:电子科学与工程学院
学号:06A*****
姓名:***
指导老师:***
实习题1
4、设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++程序进行计算验证采用从大到小或者从小到大的递推公式算法得到的数值基本稳定
且误差不大。
而相比之下,从大到小比从小到大的误差更加小,则证明从大到小的算法更加
好。
需要说明的是C++程序所计算的结果事实上也同实际数值有些许误差。
在实验过程中发现
S2=1/3化成小数应该为0.3关于3的无限循环,而利用C++程序计算的结果为
0.33333333333333337,说明了其与实际数值依然存在有误差。
但是毕竟利用递推公式和计
算所给的精确值公式时都将计算机的误差计算进去了,所以理论上可以忽略这部分误差。
值得一提的是上文从大到小的算法程序中,我采取了34000作为最大值的初始值,而不是用
其他相对于比较容易取的特殊的值,譬如30000,50000,甚至于100000。
事实上在选取该
值的时候比较犹豫,于是采取了试值的方法,结果发现50000以后程序会跑飞,于是50000
以上的值便舍去。
在试比较大的例如从30000以上开始选取的时候,发现从30000开始增大
会使得计算出来的S2的值与1/3的理论计算值误差越来越小,到34000时达到最小,为
0.33333333333333304,,而到35000该值的误差又开始增大。
所以选取34000比较令我满意。