东南大学数值分析上机解剖
东南大学数值分析上机报告完整版

数值分析上机实验报告目录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。
东南大学计算方法上机报告实验报告完整版

实习题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 的逐渐增大,两种算法的运行结果相差越来越大。
东南大学_数值分析_第七章_偏微分方程数值解法

第七章 偏微分方程数值解法——Crank-Nicolson 格式****(学号) *****(姓名)上机题目要求见教材P346,10题。
一、算法原理本文研究下列定解问题(抛物型方程)22(,) (0,0)(,0)() (0)(0,)(), (1,)() (0)u ua f x t x l t T t x u x x x l u t t u t t t T ϕαβ⎧∂∂-=<<≤≤⎪∂∂⎪=≤≤⎨⎪==<≤⎪⎩(1)的有限差分法,其中a 为正常数,,,,f ϕαβ为已知函数,且满足边界条件和初始条件。
关于式(1)的求解,采用离散化方法,剖分网格,构造差分格式。
其中,网格剖分是将区域{}0,0D x l t T =≤≤≤≤用两簇平行直线(0)(0)i k x x ih i M t t k k N τ==≤≤⎧⎨==≤≤⎩ 分割成矩形网格,其中,l Th M Nτ==分别为空间步长和时间步长。
将式(1)中的偏导数使用不同的差商代替,将得到不同的差分格式,如古典显格式、古典隐格式、Crank-Nicolson 格式等。
其中,Crank-Nicolson 格式具有更高的收敛阶数,应用更广泛,故本文采用Crank-Nicolson 格式求解抛物型方程。
Crank-Nicolson 格式推导:在节点(,)2i k x t τ+处考虑式(1),有22(,)(,)(,)222i k i k i k u u x t a x t f x t t x τττ∂∂+-+=+∂∂ (2)对偏导数(,)2i k u x t t τ∂+∂用中心差分展开 []2311+131(,)(,)(,)(,) ()224k k i k i k i k i i k i k u ux t u x t u x t x t t t t ττηητ++∂∂+=--<<∂∂ (3) 将22(,)2i k u x t x τ∂+∂在节点(,)i k x t 和1(,)i k x t +表示为222+122224+1221(,)=(,)+(,)22 (,) ()8i k i k i k k k i i k i k u u ux t x t x t x x x ux t t x tττηη⎡⎤∂∂∂+⎢⎥∂∂∂⎣⎦∂-<<∂∂ (4)对以上两个偏导数用二阶差分展开[]2112224i+141(,)(,)2(,)(,) (,) ()12i k i k i k i k kk i k i i u x t u x t u x t u x t x hh u t x x x ξξ+-∂=-+∂∂-<<∂ (5)[]211111122241i+141(,)(,)2(,)(,) (,) ()12i k i k i k i k k ki k i i u x t u x t u x t u x t x hh u t x x xξξ++++-++∂=-+∂∂-<<∂ (6)将式(4)(5)(6)分别代入式(3),略去高阶小量,用k i u 代替(,)i k u x t 并化简得()()()2111111112122,22k k k k k k k k i i i i i i i i i k a u u u u u u u u f x t h ττ+++++-+-⎛⎫⎡⎤---++-+=+ ⎪⎣⎦⎝⎭ (7) 令2/r a h τ=,将式(7)联合式(1)初始条件和边界条件,用矩阵的形式表示为:11112212211111221122221122221122 k k k k k kM M k k M M r r r r u u r r r r r ru u r r r r u u r r u u r r r r +++--+--⎡⎤⎡⎤+---⎢⎥⎢⎥⎢⎥⎢⎥⎡⎤⎡⎤⎢⎥⎢⎥-+--⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥-+--⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎢⎥⎢⎥⎢⎥⎢⎥-+-⎢⎥⎢⎥⎣⎦⎣⎦()()()()()()112211,22,2 ,2,22k k k k M k M k k k r f x t t t f x t f x t r f x t t t ττααττττττββ+--+⎡⎤⎛⎫+++ ⎪⎢⎥⎝⎭⎢⎥⎢⎥⎛⎫+ ⎪⎢⎥⎝⎭⎢⎥+⎢⎥⎢⎥⎛⎫⎢⎥+ ⎪⎢⎥⎝⎭⎢⎥⎛⎫⎢⎥+++ ⎪⎢⎥⎝⎭⎣⎦(8) Crank-Nicolson 格式的截断误差为22()R O h τ=+,具有较高的精度。
数值分析报告上机题课后作业全部-东南大学

实用标准文案文档大全上机作业题报告2015.1.9 USER1.Chapter 11.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程序1.3运行结果1.4结果分析按从大到小的顺序,有效位数分别为:6,4,3。
按从小到大的顺序,有效位数分别为:5,6,6。
可以看出,不同的算法造成的误差限是不同的,好的算法可以让结果更加精确。
当采用从大到小的顺序累加的算法时,误差限随着N 的增大而增大,可见在累加的过程中,误差在放大,造成结果的误差较大。
因此,采取从小到大的顺序累加得到的结果更加精确。
2.Chapter 22.1题目(1)给定初值0x 及容许误差ε,编制牛顿法解方程f(x)=0的通用程序。
(2)给定方程03)(3=-=x xx f ,易知其有三个根3,0,3321=*=*-=*x x x○1由牛顿方法的局部收敛性可知存在,0>δ当),(0δδ+-∈x 时,Newton 迭代序列收敛于根x2*。
试确定尽可能大的δ。
○2试取若干初始值,观察当),1(),1,(),,(),,1(),1,(0+∞+-----∞∈δδδδx 时Newton 序列的收敛性以及收敛于哪一个根。
(3)通过本上机题,你明白了什么?2.2程序2.3运行结果(1)寻找最大的δ值。
算法为:将初值x0在从0开始不断累加搜索精度eps,带入Newton迭代公式,直到求得的根不再收敛于0为止,此时的x0值即为最大的sigma值。
运行Find.m,得到在不同的搜索精度下的最大sigma值。
东南大学数值分析上机实验题(下)

数值分析上机报告XX:学号:2013年12月22日第四章38.(上机题)3次样条插值函数(1)编制求第一型3次样条插值函数的通用程序;端点条件为'0y =0.8,'10y =0.2。
用所编制程序求车门的3次样条插值函数S(x),并打印出S(i+0.5)(i=0,1,…9)。
解:(1)#include <iostream.h> #include <math.h>floatx1[100],f1[100],f2[99],f3[98],m[100],a[100][101],x,d[100]; float c[99],e[99],h[99],u[99],w[99],y_0,y_n,arr ,s; int i,j,k,n,q;void selectprint(float y) {if ((y>0)&&(y!=1)) cout<<"+"<<y; else if (y==1) cout<<"+"; else if (y<0) cout<<y; }void printY(float y){ if (y!=0) cout<<y; }float calculation(float x){ for (j=1;j<=n;j++) if (x<=x1[j]) {s=(float)(f1[j-1]+c[j-1]*(x-x1[j-1])+m[j-1]/2.0*(x-x1[j-1])*(x-x1[j-1])+e[j-1]*(x-x1[j-1])*(x-x1[j-1])*(x-x1[j-1])); break; }return s; }void main() {do{cout<<"请输入n值:";cin>>n;if ((n>100)||(n<1)) cout<<"请重新输入整数(1..100):"<<endl;}while ((n>100)||(n<1));cout<<"请输入Xi(i=0,1,...,"<<n<<"):";for (i=0;i<=n;i++) cin>>x1[i];cout<<endl;cout<<"请输入Yi(i=0,1,...,"<<n<<"n):";for (i=0;i<=n;i++) cin>>f1[i];cout<<endl;cout<<"请输入第一型边界条件Y'0,Y'n:";cin>>y_0>>y_n;cout<<endl;for (i=0;i<n;i++) h[i]=x1[i+1]-x1[i];for (i=1;i<n;i++) u[i]=(float) (h[i-1]/(h[i-1]+h[i]));for (i=1;i<n;i++) w[i]=(float) (1.0-u[i]);for (i=0;i<n;i++) f2[i]=(f1[i+1]-f1[i])/h[i]; //一阶差商for (i=0;i<n-1;i++) f3[i]=(f2[i+1]-f2[i])/(x1[i+2]-x1[i]); //二阶差商for (i=1;i<n;i++) d[i]=6*f3[i-1]; //求出所有的d[i]d[0]=6*(f2[0]-y_0)/h[0];d[n]=6*(y_n-f2[n-1])/h[n-1];for (i=0;i<=n;i++)for (j=0;j<=n;j++)if (i==j) a[i][j]=2;else a[i][j]=0;a[0][1]=1;a[n][n-1]=1;for (i=1;i<n;i++){a[i][i-1]=u[i];a[i][i+1]=w[i];}for (i=0;i<=n;i++) a[i][n+1]=d[i];for (i=1;i<=n;i++) //用追赶法解方程,得M[i]{arr=a[i][i-1];for (j=0;j<=n+1;j++)a[i][j]=a[i][j]-a[i-1][j]*arr/a[i-1][i-1];}m[n]=a[n][n+1]/a[n][n];for (i=n-1;i>=0;i--) m[i]=(a[i][n+1]-a[i][i+1]*m[i+1])/a[i][i];for (i=0;i<n;i++) //计算S(x)的表达式c[i]=(float) (f2[i]-(1.0/3.0*m[i]+1.0/6.0*m[i+1])*h[i]);for (i=0;i<n;i++)e[i]=(m[i+1]-m[i])/(6*h[i]);for (i=0;i<n;i++){cout<<"X属于区间["<<x1[i]<<","<<x1[i+1]<<"]时"<<endl<<endl;cout<<"S(x)=";printY(f1[i]);if (c[i]!=0){selectprint(c[i]);cout<<"(x";printY(-x1[i]);cout<<")";}if (m[i]!=0){selectprint((float)(m[i]/2.0));for (q=0;q<2;q++){cout<<"(x";printY(-x1[i]);cout<<")";}}if (e[i]!=0){selectprint(e[i]);for (q=0;q<3;q++){cout<<"(x";printY(-x1[i]);cout<<")";}}cout<<endl<<endl;}cout<<"针对本题,计算S(i+0.5)(i=0,1,...,9):"<<endl;for (i=0;i<10;i++){if ((i+0.5<=x1[n])&&(i+0.5>=x1[0])){calculation((float)(i+0.5));cout<<"S("<<i+0.5<<")="<<s<<endl;}else cout<<i+0.5<<"超出定义域"<<endl;};cout<<endl;}(2)编制的程序求车门的3次样条插值函数S(x):x属于区间[0,1]时;S(x)=2.51+0.8(x)-0.0014861(x)(x)-0.00851395(x)(x)(x)x属于区间[1,2]时;S(x)=3.3+0.771486(x-1)-0.027028(x-1)(x-1)-0.00445799(x-1)(x-1)(x-1) x属于区间[2,3]时;S(x)=4.04+0.704056(x-2)-0.0404019(x-2)(x-2)-0.0036543(x-2)(x-2)(x-2)x属于区间[3,4]时;S(x)=4.7+0.612289(x-3)-0.0513648(x-3)(x-3)-0.0409245(x-3)(x-3)(x-3) x属于区间[4,5]时;S(x)=5.22+0.386786(x-4)-0.174138(x-4)(x-4)+0.107352(x-4)(x-4)(x-4) x属于区间[5,6]时;S(x)=5.54+0.360567(x-5)+0.147919(x-5)(x-5)-0.268485(x-5)(x-5)(x-5) x属于区间[6,7]时;S(x)=5.78-0.149051(x-6)-0.657537(x-6)(x-6)+0.426588(x-6)(x-6)(x-6) x属于区间[7,8]时;S(x)=5.4-0.184361(x-7)+0.622227(x-7)(x-7)-0.267865(x-7)(x-7)(x-7) x属于区间[8,9]时;S(x)=5.57+0.256496(x-8)-0.181369(x-8)(x-8)+0.0548728(x-8)(x-8)(x-8) x属于区间[9,10]时;S(x)=5.7+0.058376(x-9)-0.0167508(x-9)(x-9)+0.0583752(x-9)(x-9)(x-9)S(0.5)=2.90856 S(1.5)=3.67843 S (2.5)=4.38147 S(3.5)=4.98819 S(4.5)=5.38328 S(5.5)=5.7237S(6.5)=5.59441 S(7.5)=5.42989 S(8.5)=5.65976 S(9.5)=5.7323第六章21.(上机题)常微分方程初值问题数值解(1)编制RK4方法的通用程序;(2)编制AB4方法的通用程序(由RK4提供初值);(3)编制AB4-AM4预测校正方法的通用程序(由RK4提供初值);(4)编制带改进的AB4-AM4预测校正方法的通用程序(由RK4提供初值);(5)对于初值问题h=,应用(1)~(4)中的四种方法进行计算,并将计算结果和精确解取步长0.13=+作比较;y x x()3/(1)(6)通过本上机题,你能得到哪些结论?解:#include<iostream.h>#include<fstream.h>#include<stdlib.h>#include<math.h>ofstream outfile("data.txt");//此处定义函数f(x,y)的表达式//用户可以自己设定所需要求得函数表达式double f1(double x,double y){double f1;f1=(-1)*x*x*y*y;return f1;}//此处定义求函数精确解的函数表达式double f2(double x){double f2;f2=3/(1+x*x*x);return f2;}//此处为精确求函数解的通用程序void accurate(double a,double b,double h){double x[100],accurate[100];x[0]=a;int i=0;outfile<<"输出函数准确值的程序结果:\n";do{x[i]=x[0]+i*h;accurate[i]=f2(x[i]);outfile<<"accurate["<<i<<"]="<<accurate[i]<<'\n';i++;}while(i<(b-a)/h+1);}//此处为经典Runge-Kutta公式的通用程序void RK4(double a,double b,double h,double c) {int i=0;double k1,k2,k3,k4;double x[100],y[100];y[0]=c;x[0]=a;outfile<<"输出经典Runge-Kutta公式的程序结果:\n"; do{x[i]=x[0]+i*h;k1=f1(x[i],y[i]);k2=f1((x[i]+h/2),(y[i]+h*k1/2));k3=f1((x[i]+h/2),(y[i]+h*k2/2));k4=f1((x[i]+h),(y[i]+h*k3));y[i+1]=y[i]+h*(k1+2*k2+2*k3+k4)/6;outfile<<"y"<<"["<<i<<"]="<<y[i]<<'\n';i++;}while(i<(b-a)/h+1);}//此处为4阶Adams显式方法的通用程序void AB4(double a,double b,double h,double c) {double x[100],y[100],y1[100];double k1,k2,k3,k4;y[0]=c;x[0]=a;outfile<<"输出4阶Adams显式方法的程序结果:\n";for(int i=0;i<=2;i++){x[i]=x[0]+i*h;k1=f1(x[i],y[i]);k2=f1((x[i]+h/2),(y[i]+h*k1/2));k3=f1((x[i]+h/2),(y[i]+h*k2/2));k4=f1((x[i]+h),(y[i]+h*k3));y[i+1]=y[i]+h*(k1+2*k2+2*k3+k4)/6;}int j=3;y1[0]=y[0];y1[1]=y[1];y1[2]=y[2];y1[3]=y[3];do{x[j]=x[0]+j*h;y1[j+1]=y1[j]+(55*f1(x[j],y1[j])-59*f1(x[j-1],y1[j-1])+37*f1(x[j-2],y1[j-2])-9*f1(x[j-3],y1[ j-3]))*h/24;outfile<<"y1"<<"["<<j<<"]="<<y1[j]<<'\n';j++;}while(j<(b-a)/h+1);}//主函数void main(void){double a,b,h,c;cout<<"输入上下区间、步长和初始值:\n";cin>>a>>b>>h>>c;accurate(a,b,h);RK4(a,b,h,c);AB4(a,b,h,c);}float si(int u,int v){float sum=0; int q;for(q=0;q<k;q++)sum+=a[u][q]*a[q][v];sum=a[u][v]-sum;return sum;}void exchange(int g){int t; float temp;for(t=0;t<n;t++){temp=a[k][t];a[k][t]=a[g][t];a[g][t]=temp;}}void analyze(){int t;float si(int u,int v);for(t=k;t<n;t++)a[k][t]=si(k,t);for(t=(k+1);t<m;t++)a[t][k]=(float)(si(t,k)/a[k][k]);}void ret(){int t,z;float sum;x[m-1]=(float)a[m-1][m]/a[m-1][m-1];for(t=(m-2);t>-1;t--){sum=0;for(z=(t+1);z<m;z++)sum+=a[t][z]*x[z];x[t]=(float)(a[t][m]-sum)/a[t][t];}}(5)由经典Runge-Kutta公式得出的结果列在下面的表格中,以及精确值y(x i)和精确值和数值解的误差:由AB4方法得出的结果为:Y1[0]=3 y1[1]=2.997 y1[2]=2.97619 y1[3]=2.92113 y1[4]=2.81839 y1[5]=2.66467 y1[6]=2.4652 y1[7]=2.23308 y1[8]=1.98495 y1[9]=1.73704 y1[10]=1.50219 y1[11]=1.28876 y1[12]=1.10072 y1[13]=0.93871 y1[14]=0.801135y1[15]=0.685335(6)本次上机作业让我知道了在遇到复杂问题中,无法给出解析式的情况下,要学会灵活使用各种微分数值解法,并且能计算出不同方法的精度大小。
东南大学出版社第二版《数值分析》上机作业答案(前三章)

for (i=k+1;i<N;i++) // { lik=a[i][k]/a[k][k]; //实施消去过程,得到上三角系数增广矩阵 for (j=k;j<M;j++) // { a[i][j]=a[i][j]‐lik*a[k][j]; // } } } cout<<"经列主元高斯消去法得到的数组为:"<<endl; // for (b=0;b<N;b++) // { cout<<endl; //输出经过列主元消去法处理过的系数增广矩阵 for (c=0;c<M;c++) { cout<<setw(7)<<a[b][c]; // } } cout<<endl; double x[N]; // double s; int f,g; x[N‐1]=a[N‐1][M‐1]/a[N‐1][N‐1]; // for (f=N‐2;f>=0;f‐‐) // { s=0; for (g=f+1;g<N;g++) //由上三角形的系数增广矩阵求出方程组的解 { s=s+a[f][g]*x[g]; // } x[f]=(a[f][N]‐s)/a[f][f]; // } cout<<"方程组的解为:"<<endl; for (b=0;b<N;b++) //输出方程组的解 {
1
当 n=10000 时,s3=0.7499 Press any key to continue (分析 S1 的 6 位数字中,有效位数为 4 位; S2 的所有数字都是有效数字。 ) 当 n=1000000 时,s1=‐14.2546 当 n=1000000 时,s2=‐14.2551 当 n=1000000 时,s3=0.749999 Press any key to continue (分析: S1 的 6 位数字中,没有有效数字; S2 的 6 位数字中,没有有效数字。 ) 由运行结果可知,当精度比较低时,按从大数开始累加到小数的计算结果的精度低于按从小数 累加到大数的计算结果的精度。 至于当 n=1000000 时,S1 和 S2 得出了负数结果,可能是由于循环次数过多,导致数据溢出, 从而得出错误结果。 习题 2 20.程序如下: //给定误差限为:0.5e‐6 //经过试算得当 delta 最大取道 0.7745966 时,迭代得到的根都收敛于 0 #include <iostream.h> #include <math.h> void main () { double x,u; int count=0; u=10.0; cout<<"请输入 x 的初值"<<endl; cin>>x; for (count=0;abs(u)>5;count++) { x=x‐(x*x*x‐3*x)/(3*(x*x‐1)); u=10000000*x; if(count>5000) { cout<<"迭代结果不收敛于 0!"<<endl; break; } } cout<<"x="<<x<<endl<<endl;
数值分析上机题Matlab(东南大学)3

0.22 0.24 0.26 0.28 0.30 0.32 0.34 0.36 0.38 0.40 0.42 0.44 0.46 0.48 0.50 0.52 0.54 0.56 0.58 0.60 0.62 0.64 0.66 0.68 0.70 0.72
152 139 128 119 110 103 96 90 85 80 76 72 68 65 62 59 56 53 51 49 47 45 43 41 39 38
========================================================================================================================
======================================================================================================================================================================== 习题 3_36 ======================================================================================================================================================================== Omega n x1 x2 x3 x4 x5 x6 x7 x8 x9
-0.71279 -0.71280 -0.71280 -0.71280 -0.71280 -0.71280 -0.71280 -0.71280 -0.71280 -0.71280 -0.71280 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281 -0.71281
最新东南大学数值分析上机题matlab(前三章)

数值分析上机题第一章(17题)(1)从2依次累加到N的程序function sn = sum1( n )sn=0;sn=single(sn);for i=2:nai=1/(i^2-1);sn=sn+ai;endend(2)从N依次累加到2的程序function sn = sum2( n )sn=0;sn=single(sn);for i=n:-1:2ai=1/(i^2-1);sn=sn+ai;endend(3)编制求精确值的求和函数sum0function sn = sum0( n )sn=0;sn=single(sn);sn=1/2*(3/2-1/n-1/(n+1));end按第一种顺序得到的值及有效位数如下:N=100时sn0=sum0(100);sn=sum1(100)n=fix(-log10(2*abs(sn-sn0)))得到:sn =0.7400495 n =7N=10e4时sn0=sum0(10e4);sn=sum1(10e4)n=fix(-log10(2*abs(sn-sn0)))得到:sn =0.7498521 n =3N=10e6时sn0=sum0(10e6);sn=sum1(10e6)n=fix(-log10(2*abs(sn-sn0)))得到:sn =0.7498521 n =3按第二种顺序得到的值及有效位数如下:N=100时sn0=sum0(100);sn=sum2(100)n=fix(-log10(2*abs(sn-sn0)))得到:sn =0.7400495 n =7N=10e4时sn0=sum0(10e4);sn=sum2(10e4)n=fix(-log10(2*abs(sn-sn0)))得到:sn =0.7499900 n =7N=10e6时sn0=sum0(10e6);sn=sum2(10e6)n=fix(-log10(2*abs(sn-sn0)))得到:sn =0.7499999 n =7(4)通过这道上机题,我明白了,应用计算机进行求和运算时,求和的顺序不同对结果的精度是有影响的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第一章一、题目设∑=-=Nj N j S 2211,其精确值为)11123(21+--N N 。
(1)编制按从大到小的顺序11131121222-+⋯⋯+-+-=N S N ,计算SN 的通用程序。
(2)编制按从小到大的顺序1211)1(111222-+⋯⋯+--+-=N N S N ,计算SN 的通用程序。
(3)按两种顺序分别计算64210,10,10S S S ,并指出有效位数。
(编制程序时用单精度) (4)通过本次上机题,你明白了什么? 二、MATLAB 程序N=input('请输入N(N>1):');AccurateValue=single((0-1/(N+1)-1/N+3/2)/2); %single 使其为单精度 Sn1=single(0); %从小到大的顺序 for a=2:N; Sn1=Sn1+1/(a^2-1); endSn2=single(0); %从大到小的顺序 for a=2:N; Sn2=Sn2+1/((N-a+2)^2-1); endfprintf('Sn 的值 (N=%d)\n',N);disp('____________________________________________________') fprintf('精确值 %f\n',AccurateValue); fprintf('从大到小计算的结果 %f\n',Sn1); fprintf('从小到大计算的结果 %f\n',Sn2);disp('____________________________________________________')三、结果请输入N(N>1):100Sn的值(N=100)____________________________________________________精确值0.740049从大到小计算的结果0.740049从小到大计算的结果0.740050____________________________________________________请输入N(N>1):10000Sn的值(N=10000)____________________________________________________精确值0.749900从大到小计算的结果0.749852从小到大计算的结果0.749900____________________________________________________请输入N(N>1):1000000Sn的值(N=1000000)____________________________________________________精确值0.749999从大到小计算的结果0.749852从小到大计算的结果0.749999____________________________________________________四、结果分析可以得出,算法对误差的传播又一定的影响,在计算时选一种好的算法可以使结果更为精确。
从以上的结果可以看到从大到小的顺序导致大数吃小数的现象,容易产生较大的误差,求和运算从小数到大数算所得到的结果才比较准确。
第二章一、题目(1)给定初值0x 及容许误差ε,编制牛顿法解方程f(x)=0的通用程序。
(2)给定方程03)(3=-=x x x f ,易知其有三个根3,0,3321=*=*-=*x x x①由牛顿方法的局部收敛性可知存在,0>δ当),(0δδ+-∈x 时,Newton 迭代序列收敛于根x 2*。
试确定尽可能大的δ。
②试取若干初始值,观察当),1(),1,(),,(),,1(),1,(0+∞+-----∞∈δδδδx 时Newton 序列的收敛性以及收敛于哪一个根。
(3)通过本上机题,你明白了什么?二、MATLAB 程序文件fx.mfunction Fx=fx(x) %% 定义函数f(x) Fx=x^3/3-x;文件dfx.mfunction Fx=dfx(x) %% 定义导函数df(x) Fx=x^2-1;%% Newton 法求方程的根%% clearef=10^-6; %这里取容许误差10^-6 k=0;x0=input('请输入 Xo 的值:');disp('k Xk'); %使用空格将其分隔开 fprintf('0 %f\n',x0); flag=1;while flag==1 && k<=10^3 x1=x0-fx(x0)/dfx(x0); if abs(x1-x0)<efflag=0;endk=k+1;x0=x1;fprintf('%d %f\n',k,x0);end%%寻找最大的delta值%%clear%%flag=1;k=1;x0=0;while flag==1delta=k*10^-6; %delta与k有关x0=delta;k=k+1;m=0;flag1=1;while flag1==1 && m<=10^3x1=x0-fx(x0)/dfx(x0);if abs(x1-x0)<10^-6flag1=0; %给定容许误差endm=m+1;x0=x1;endif flag1==1||abs(x0)>=10^-6 %未小于给定误差时停止循环flag=0;endendfprintf(' delta 的最大值是%f\n',delta);三、结果1.运行search.m文件结果为:delta 的最大值为0.774597即得最大的δ为0.774597,Newton迭代序列收敛于根*x=0的最大区间为2(-0.774597,0.774597)。
2.(1)区间(,1)-∞-上取-1000,-100,-50,-30,-10,-8,-7,-5,-3x。
结果显示,以上初值迭代序列均收敛于-1.732051,即根*1(2) 在区间(1,)δ--即区间(-1,-0.774597)上取-0.774598,-0.8,-0.85,-0.9,-0.99,计算结果如下:x,局部收敛于1.730251,计算结果显示,迭代序列局部收敛于-1.732051,即根*1x。
即根*3(3) 有上题可知,在区间(-0.774597,0.774597)上,在整个区间上均收敛x。
于0,即根*2(4) 在区间(,1)即区间(0.774597,1)上取0.774598,0.8,0.85,0.9,0.99,计算结果如下:x,局部收敛于1.730251,计算结果显示,迭代序列局部收敛于-1.732051,即根*1x。
即根*3(5) 区间(1,)上取100,60,20,10,7,6,4,3,1.5,计算结果如下:结果显示,以上初值迭代序列均收敛于1.732051,即根*3x 。
四、结果分析综上所述:(,1)-∞-区间收敛于-1.73205, (1,)δ--区间局部收敛于1.73205,局部收敛于-1.73205,(,)δδ-区间收敛于0,(,1)δ区间类似于(1,)δ--区间,(1,)+∞收敛于1.73205。
通过本上机题,明白了对于多根方程,Newton 法求方程根时,迭代序列收敛于某一个根有一定的区间限制,在一个区间上,可能会局部收敛于不同的根。
第三章一、题目列主元Gauss消去法对于某电路的分析,归结为求解线性方程组RI V=。
其中3113000100001335901100000931*******00107930000900030577050000074730000000030410000005002720009000229 R--⎛⎫⎪---⎪⎪--⎪--- ⎪⎪=---⎪--⎪⎪-⎪-- ⎪⎪--⎝⎭()15,27,23,0,20,12,7,7,10TTV=----(1)编制解n阶线性方程组Ax b=的列主元高斯消去法的通用程序;(2)用所编程序线性方程组RI V=,并打印出解向量,保留5位有效数;二、MATLAB程序%% 列主元Gauss消去法求解线性方程组%%%%参数输入n=input('请输入矩阵A的阶数: n='); %输入线性方程组阶数nb=zeros(1,n);A=input('请输入矩阵A:');b(1,:)=input('请输入行向量b:'); %输入行向量bb=b'; %得到列向量bC=[A,b]; %得到增广矩阵%%列主元消去得上三角矩阵for i=1:n-1[maximum,index]=max(abs(C(i:n,i))); %将最大元素位置放在index行中index=index+i-1;T=C(index,:); %T作为一个中转站,交换两行C(index,:)=C(i,:);C(i,:)=T;for k=i+1:n %%列主元消去if C(k,i)~=0C(k,:)=C(k,:)-C(k,i)/C(i,i)*C(i,:);endendend%% 回代求解%%x=zeros(n,1);x(n)=C(n,n+1)/C(n,n);for i=n-1:-1:1x(i)=(C(i,n+1)-C(i,i+1:n)*x(i+1:n,1))/C(i,i);endA=C(1:n,1:n);disp('上三角矩阵为:')for k=1:nfprintf('%f ',A(k,:));fprintf('\n');enddisp('方程的解为:');fprintf('%.5g\n',x); %以5位有效数字输出结果三、结果请输入矩阵A的阶数: n=9请输入矩阵A:[31 -13 0 0 0 -10 0 0 0;-13 35 -9 0 -11 0 0 0 0;0 -9 31 -10 0 0 0 0 0;0 0 -10 79 -30 0 0 0 -9;0 0 0 -30 57 -7 0 -5 0;0 0 0 0 -7 47 -30 0 0;0 0 0 0 0 -30 41 0 0;0 0 0 0 -5 0 0 27 -2;0 0 0 -9 0 0 0 -2 9]请输入行向量b: [-15 27 -23 0 -20 12 -7 7 10]上三角矩阵为:31.000000 -13.000000 0.000000 0.000000 0.000000 -10.000000 0.000000 0.000000 0.000000 0.000000 29.548387 -9.000000 0.000000 -11.000000 -4.193548 0.000000 0.000000 0.000000 0.000000 0.000000 28.258734 -10.000000 -3.350437 -1.277293 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 75.461271 -31.185629 -0.451999 0.000000 0.000000 -9.000000 0.000000 0.000000 0.000000 0.000000 44.602000 -7.179695 0.000000 -5.000000 -3.577994 0.000000 0.000000 0.000000 0.000000 -0.000000 45.873193 -30.000000 -0.784718 -0.561543 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 21.380698 -0.513187 -0.367236 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 26.413085 -2.419996 0.000000 0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 0.000000 27.389504 方程的解为:-0.289230.34544-0.71281-0.22061-0.43040.15431-0.0578230.20105第四章:多项式插值与函数最佳逼近一、题目:(1)编制求第一型3次样条插值函数的通用程序;(2)已知汽车曲线型值点的数据如下:端点条件为'0=0.8y,'10=0.2y。