数值计算方法课程设计123[沐风文苑].doc

上传人:scccc 文档编号:11111764 上传时间:2021-07-01 格式:DOC 页数:23 大小:144KB
返回 下载 相关 举报
数值计算方法课程设计123[沐风文苑].doc_第1页
第1页 / 共23页
数值计算方法课程设计123[沐风文苑].doc_第2页
第2页 / 共23页
数值计算方法课程设计123[沐风文苑].doc_第3页
第3页 / 共23页
数值计算方法课程设计123[沐风文苑].doc_第4页
第4页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《数值计算方法课程设计123[沐风文苑].doc》由会员分享,可在线阅读,更多相关《数值计算方法课程设计123[沐风文苑].doc(23页珍藏版)》请在三一文库上搜索。

1、 数值计算方法课程设计姓名 学号 班级 实验要求1 应用自己熟悉的算法语言编写程序,使之尽可能具有通用性。2 上机前充分准备,复习有关算法,写出计算步骤,反复检查,调试程序。(注:在练习本上写,不上交)3 完成计算后写出实验报告,内容包括:所用的算法语言,CPU时间,算法步骤叙述,变量说明,程序清单,输出计算结果,结构分析和小结等。(注:具体题目具体分析,并不是所有的题目的实验报告都包含上述内容!)4 至少需要选择5道必做题目。其余的也可以选择,如果多选,可酌情加分!5 独立完成,如有雷同,一律判为零分!6 上机期间不允许做其他任何与课程设计无关的事情,否则被发现一次扣10分,被发现三次判为零

2、分!上机实习题目1 编写秦九韶算法程序,并用该程序计算多项式在的值。public class Qinjiushao public double result; public double x=-2;/定义一个未知数x public double b; public double c; public int i; public String abc; public void calculate() / abc=x5+3*x3-2*x+6;多项式,可以截取字符串获取系数 double a=2,0,-3,3,-4;/多项式的系数 double b=new doublea.length; double

3、 c=new doubleb.length; for(i=0;ia.length;i+) if(i=0) ci=bi=ai; else bi=bi-1*x+ai; ci=ci-1*x+bi-1*x+ai; int j=a.length-1; System.out.println(结果值为:f(+x+)=+ca.length-2); public static void main(String agrs) Qinjiushao qjs=new Qinjiushao(); qjs.calculate(); /JFrame jframe=new JFrame(); /jframe.setTitle(

4、求结果); /jframe.setSize(400,400); /jframe.setVisible(true); 2 用选列主元高斯消去法解线性方程组#include#include#define N 4 void maxij(double (*table)N+1,int m);void zeros(double (*table)N+1,int m);double solution(double (*table)N+1,double *A,int n);main() double tableNN+1=-3,-1,0,0,1,-1,2,-1,0,0,0,-1,2,-1,0,0,-1,2,0;

5、double AN; int i,j,m,n; for(m=0;m=0;n-) if(tablenn!=0) An=solution(table,A,n); else An=0; for(i=0;in;p-) sum+=tablenp*Ap; result=(tablenN-sum)/tablenn; return result;void zeros(double (*table)N+1,int m) double zeroing; int i,j; for(i=m+1;iN;i+) if(tableim!=0) zeroing=-1*tableim/tablemm; tableim=0; f

6、or(j=m+1;j=N;j+) tableij+=tablemj*zeroing; void maxij(double (*table)N+1,int m) double exchange; int i,j,line=m; for(i=m;iN;i+) if(abs(tablelinem)abs(tableim) line=i; for(i=m;i=N;i+) exchange=tablemi; tablemi=tablelinei; tablelinei=exchange; 运行结果:x1=-0.266667,x2=-0.2,x3=-0.133333,x4=-0.06666673 分别用平

7、方根法和改进平方根法解线性方程组平方根法解线性方程组Axb#includemath.h #includestdio.hmain() int i,j,k; int n=3; float m,a33,b3,x3,l33,y3; printf(input matrix numbers of a:n); for(i=0;in;i+) for(j=0;jn;j+) scanf(%f,&aij); printf(n); printf(input numbers of b:n); for(i=0;in;i+) scanf(%f,&bi); printf(n); l00=sqrt(a00); for(i=1;

8、in;i+) li0=ai0/l00; l0i=li0; for(j=1;jn;j+) m=0.0; for(k=0;kj;k+) m+=ljk*ljk; ljj=sqrt(ajj-m); for(i=j+1;in;i+) m=0.0; for(k=0;kj;k+) m+=lik*ljk; lij=(aij-m)/ljj; lji=lij; y0=b0/l00; for(i=1;in;i+) m=0.0; for(k=0;k=0;i-) m=0.0; for(k=i+1;kn;k+) m+=lki*xk; xi=(yi-m)/lii; for(i=0;in;i+) printf(x(%d)=%

9、fn,i,xi); 结果用C语言实现改进平方根法, 程序代码如下:#include stdlib.h#include stdio.h#include conio.h#include string.h#include math.h#define N 100float Table(int n,float aNN,float bN) int i,j;printf(Please input the matrix A by row!n);for(i=0;in;i+)printf(Row %d:,i);for(j=0;jn;j+)scanf(%f,&aij);printf(Please input the

10、 array b:);for(i=0;in;i+)scanf(%f,&bi); printf(nThe matrix A and array b:n);for(i=0;in;i+)for(j=0;jn;j+)printf(%10.4f,aij); printf(%10.4f,bi); printf(n);return 0;float decomposition(int n,float aNN,float lNN,float dNN) int i,j,k;float tNN,tmp1,tmp2; for(i=0;in;i+) for(j=0;jn;j+) if(i!=j) dij=0; if(i

11、j) tij=0; lij=0; if(i=j) lij=1; d00=a00; for(i=1;in;i+) for(j=0;ji;j+) tmp1=0; for(k=0;kj;k+) tmp1+=tik*ljk; tij=aij-tmp1; lij=tij/djj; tmp2=0; for(k=0;ki;k+) tmp2+=tik*lik; dii=aii-tmp2; printf(nAfter Cholesky triangular decomposition, the matrix L:n);for(i=0;in;i+) for(j=0;j=i;j+) printf(%8.4f,lij

12、); if(i=j) printf(n);printf(nAnd the matrix D:n); for(i=0;in;i+)for(j=0;j=i;j+) if(i!=j) for(k=0;k8;k+) printf( ); if(i=j) printf(%8.4fn,dij);return 0;float solve(int n,float lNN,float dNN,float bN) int i,j,k;float yN,xN,tmp1,tmp2;y0=b0; for(i=1;in;i+) tmp1=0; for(k=0;ki;k+) tmp1+=lik*yk; yi=bi-tmp1

13、; 4考虑阶三对角方程组 ,(1) 用选列主元高斯消去法求解,(2) 编写追赶法程序并求解,#include#includeint n;float *a,*b,*c,*d,*p,*q,*x;void print1() printf(设3对角方程组的形式如下:n); printf(b1*x1+c1*x2=d1n); printf(a2*x1+b2*x2+c2*x3=d2n); printf(ta3*x2+b3*x3+c3*x4=d3n); printf(tt.n); printf(ttt.n); printf(ttttan-1*xn-2+bn-1*xn-1+cn-1*xn=dn-1n); pri

14、ntf(tttttan*xn-1+bn*xn=dnn);void get_array() a=(float *)malloc(n+1)*sizeof(float); b=(float *)malloc(n+1)*sizeof(float); c=(float *)malloc(n+1)*sizeof(float); d=(float *)malloc(n+1)*sizeof(float); q=(float *)malloc(n+1)*sizeof(float); p=(float *)malloc(n+1)*sizeof(float); x=(float *)malloc(n+1)*size

15、of(float);void get_num() int i; printf(请输入系数a2-a%dn,n); for(i=2;i=n;i+) scanf(%f,&ai); a1=0; printf(请输入系数b1-b%dn,n); for(i=1;i=n;i+) scanf(%f,&bi); printf(请输入系数c1-c%dn,n-1); for(i=1;i=n-1;i+) scanf(%f,&ci); printf(请输入系数d1-d%dn,n); for(i=1;i=n;i+) scanf(%f,&di);void work() int i=0,k; float t; a1=cn=0

16、; p1=d1/b1; q1=c1/b1; /初始化 for(k=2;k=1;k-) xk=pk-qk*xk+1; /回代求解int main() /freopen(in.txt,r,stdin); int i=0; print1(); printf(请输入方程阶数n); scanf(%d,&n); get_array(); get_num(); work(); for(i=1;i0&x*x=1) result=x*Math.log(Math.sqrt(x*x-1)+x)-Math.sqrt(x*x-1)-0.5*x; else System.out.println(您输入的值不合法); re

17、turn result; public void judge() Erfenfa eff=new Erfenfa(); double c=eff.getResult(a); double d=eff.getResult(b); i+; if(i=5) if(c*d0)b=(a+b)/2;judge();elsea=(a+b)/2;judge(); else System.out.println(不合法,请重新取值); /* public int getlenth(double e)/此方法用来判断精度 Double dd=new Double(e); String s=dd.toString(

18、).substring(dd.toString().indexOf(.)+1); int length=s.length(); return length; */ public static void main(String args) Erfenfa eff=new Erfenfa(); eff.judge();Newton迭代法x=6;y=5;while abs(y-x)=0.0001x=(y*log(y2-1)1/2+y)-(y2-1)1/2)/0.5; y=x;endxx=6;y=2;while abs(y-x)=0.0001x=(y*log(y2-1)1/2+y)-(y2-1)1/2

19、)/0.5; y=x;endxx=6;y=0;while abs(y-x)=0.0001x=(y*log(y2-1)1/2+y)-(y2-1)1/2)/0.5; y=x;endxx=2;y=-3;while abs(y-x)=0.0001x=(y*log(y2-1)1/2+y)-(y2-1)1/2)/0.5; y=x;endxx = 4.3321x = 2.0111x = 1x = -8elapsed_time = 0.17206求解下列非线性方程组在原点附近的根:Matlab首先建立一个m文件 我取的名字叫 syfs0000function y=syfs0000(x)y=9*x(1)2+36

20、*x(2)2+4*x(3)2-36;x(1)2-2*x(2)2-20*x(3);16*x(1)-x(1)3-2*x(2)2-16*x(3)2;end然后在command window输入fsolve(syfs0000,0 0 0)得到ans=0.1342 0.9972 -0.09857分别写出解线性方程组收敛的Jacobi迭代格式,Gauss-Seidel迭代格式,SOR迭代格式。收敛的Jacobi迭代格式#include#includeint main(void) double A33 = 5,2,1, -1,4,2, 2,-3,10 ; double b3 = -12,20,3; doub

21、le x3 = 0; /第k+1次迭代的结果 double xx3 = 0; /第k次迭代的结果 int size = 3; int Max = 43; /最大迭代次数 double residual = 0.0; / double sum = 0.0; double dis = 0.0; double dif = 1.0; /相邻迭代的结果差 double eps = 1.0e-3; /迭代精度 for(int k=1;(keps);k+) dif = 0.0; printf(n第%d次迭代的结果:n,k); for(int i=0;isize;i+) for(int j=0;jsize;j

22、+) if(i!=j) sum +=Aij*xxj; xi = (bi-sum)/Aii; sum = 0.0; residual=0.0; /计算相邻迭代的结果差 for(int m=0;mresidual) residual=dis; dif=residual; /打印第k次的结果 for(i=0;isize;i+) printf(%12.8f ,xi); xxi=xi; printf(n与上次计算结果的距离(2范数):%12.8f n,dif); printf(n迭代计算的结果为:n); for(k=0;k=tol x0=x; x=G*x0+d1; n=n+1;endn然后在matlab

23、命令主窗口输入A=5,2,1;-1,4,2;2,-3,10;b=-12,20,3;x= Gauss_seidel (A,b)得n =11x =-4.00000013381170 2.99999992601601 2.00000000456714SOR迭代格式%-逐次超松弛迭代法-%-successive over-reaxation iteration methodclear;clc;A=5,2,1;-1,4,2;2,-3,10;b=-12,20,3;N=length(b); %解向量的维数fprintf(库函数计算结果:);x=inv(A)*b %库函数计算结果x=zeros(N,1);%迭

24、代初始值%-(A=D-E-F)-D=diag(diag(A);E=-tril(A,-1);%下三角F=-triu(A,1);%上三角w=1.1; %松弛因子,一般0w2B=inv(D-w*E)*(1-w)*D+w*F;g=w*inv(D-w*E)*b;eps=0.00001;%相邻解的距离小于该数时,结束迭代%-开始迭代-for k=1:43最大迭代次数为43 fprintf(第%d次迭代:,k); y=B*x+g; if abs(x-y)eps break; end x=yendx运行得 结果为x = -4.00000000000000 3.00000000000000 2.00000000

25、0000008用Romberg积分计算积分时,要求结果的误差限为。#includestdlib.h#includemath.h#includeiostreamusing namespace std;double function( double x)return x=0?1:sin(x)/x;int print_romberg(double a,double b,double e) int k=1; double h=b-a; double t1,t2,s1,s2,c1,c2,s,x,r2,r1; t1=h*(function(a)+function(b)/2; goto loop; loop

26、: s=0; x=a+h/2; do s=s+function(x); x=x+h; while(xb); t2=t1/2+h*s/2; s2=t2+(t2-t1)/3; if(k=1) k=k+1; h=h/2; t1=t2; s1=s2; goto loop; c2=s2+(s2-s1)/15; if(k=2) c1=c2; k=k+1; h=h/2; t1=t2; s1=s2; goto loop; r2=c2+(c2-c1)/63; if(k=3) r1=r2; c2=c1; k=k+1; h=h/2; t1=t2; s1=s2; goto loop; if(fabs(r2-r1)e)

27、 coutthe result is :r2endl; return 1; else r1=r2; c2=c1; k=k+1; h=h/2; t1=t2; s1=s2; goto loop; int main()double a,b;double e,y;y=function(0.2);char flag; do couta; coutendl; coutb; coutendl; coute; coutendl; print_romberg(a,b,e); coutdo you want to replay this process!endl; coutenter y to continue,any others to exit?flag;while(flag=y);return 1;9取,由改进Euler格式解微分方程: 改进欧拉算法10应用经典四阶龙格库塔方法求Lorenz方程要求:参数,初值,步长.,t从0到10应用经典的四阶龙格库塔方法来求解上述初值问题。23详参照

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1