ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:22.34KB ,
资源ID:3020265      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-3020265.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数值计算方法编程作业C语言版.docx)为本站会员(b****2)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

数值计算方法编程作业C语言版.docx

1、数值计算方法编程作业C语言版1:第二章(1)二分法求解非线性方程:#include#include #define f(x) (x*x-1)*x-1) void main() float a,b,x,eps; int k=0; printf(intput epsn);/* 容许误差 */ scanf(%f,&eps); printf(a,b=n); for(;) scanf(%f, %f,&a ,&b); if(f(a)*f(b)=0) /* 判断是否符合二分法使用的条件 */ printf(二分法不可使用,请重新输入:n); else break; do x=(a+b)/2; k+; if(

2、f(a)*f(x)0) /* 如果f(a)*f(x)0) /* 否则根在区间的右半部分 */ a=x; else break; while(fabs(b-a)eps);/*判断是否达到精度要求,若没有达到,继续循环*/ x=(a+b)/2; /* 取最后的小区间中点作为根的近似值 */ printf(n The root is x=%f, k=%dn,x,k);运行结果:intput epsa,b=2,-5 The root is x=, k=20Press any key to continue总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快,但缺点是只能求解单

3、根。 (2)牛顿法求解非线性方程:#include #include float f(float x) /* 定义函数f(x) */ return(-3*x+4)*x-5)*x+6; float f1(float x) /* 定义函数f(x)的导数 */ return (-9*x+8)*x-5; void main() float eps,x0,x1=; printf(input eps:n); scanf(%f,&eps); /* 输入容许误差 */ do x0=x1; /* 准备下一次迭代的初值 */ x1=x0-f(x0)/f1(x0); /* 牛顿迭代 */ while(fabs(x1

4、-x0)eps); /*当满足精度,输出近似根*/ printf(x=%fn,x1);程序运行结果:x=总结:关键是牛顿迭代的应用,程序中最大缺点是函数及其导数已唯一给出确定不可求的随意函数的根,牛顿法比二分法收敛快,可以求重根。2:第三章(1)列主元素消去法求解线性方程:#include#include#define N 20using namespace std;void load();float aNN;int m;int main() int i,j; int c,k,n,p,r; float xN,lNN,s,d; coutm; coutendl; cout请按顺序输入增广矩阵a:e

5、ndl; load(); for(i=0;im;i+) for(j=i;jfabs(aii)?j:i; /*找列最大元素*/ for(n=0;nm+1;n+) s=ain; ain=acn; acn=s; /*将列最大数防在对角线上*/ for(p=0;pm+1;p+) coutaipt; coutendl; for(k=i+1;km;k+) lki=aki/aii; for(r=i;r=0;i-) d=0; for(j=i+1;jm;j+) d=d+aij*xj; xi=(aim-d)/aii; /*求解*/ cout该方程组的解为:endl; for(i=0;im;i+) coutxi=x

6、it; /system(pause); return 0;void load()int i,j;for(i=0;im;i+)for(j=0;jaij; 运行结果:下面请输入未知数的个数m=3请按顺序输入增广矩阵a:1 2 3 45 1 0 84 6 9 24 6 9 20 0 该方程组的解为:x0= x1=58 x2=-34 Press any key to continue总结:列主元素消去法的目的是为了防止减去一个较小的数时大数淹没小数,而使结果产生较大误差,本程序关键在每次消元时找到相应列中的最大项,然后交换两行位置,在进行计算。(2)LU分解法求解线性方程:#includevoid s

7、olve(float l100,float u100,float b,float x,int n)int i,j;float t,s1,s2;float y100;for(i=1;i=n;i+) /* 第一次回代过程开始 */ s1=0; for(j=1;j=1;i-) /* 第二次回代过程开始 */ s2=0; for(j=n;ji;j-) t=-uij; s2=s2+t*xj; xi=(yi+s2)/uii; void main()float a100100,l100100,u100100,x100,b100;int i,j,n,r,k;float s1,s2;for(i=1;i=99;i

8、+)/*将所有的数组置零,同时将L矩阵的对角值设为1*/ for(j=1;j=99;j+) lij=0,uij=0; if(j=i) lij=1; printf (input n:n);/*输入方程组的个数*/scanf(%d,&n);printf (input array A:n);/*读取原矩阵A*/for(i=1;i=n;i+) for(j=1;j=n;j+) scanf(%f,&aij);printf (input array B:n);/*读取列矩阵B*/for(i=1;i=n;i+) scanf(%f,&bi);for(r=1;r=n;r+)/*求解矩阵L和U*/ for(i=r;

9、i=n;i+) s1=0; for(k=1;k=r-1;k+) s1=s1+lrk*uki; uri=ari-s1; for(i=r+1;i=n;i+) s2=0; for(k=1;k=r-1;k+) s2=s2+lik*ukr; lir=(air-s2)/urr; printf(array L:n);/*输出矩阵L*/for(i=1;i=n;i+) for(j=1;j=n;j+) printf(% ,lij); printf(n);printf(array U:n);/*输出矩阵U*/for(i=1;i=n;i+) for(j=1;j=n;j+) printf(% ,uij); printf

10、(n);solve(l,u,b,x,n);printf(解为:n);for(i=1;i=n;i+)printf(x%d=%fn,i,xi);运行结果:input n:3input array A:2 2 34 7 7-2 4 5input array B:3 1 -7array L: array U: 解为:x1=x2=x3=Press any key to continue总结:关键是把矩阵分解为L、U两个三角矩阵,回代过程比较简单。3:第四章(1)拉格朗日差值多项式;#include#include#define MAX 100void main() int i,j,k,m,n,N,mi;

11、 float tmp,mx; float XMAXMAX,YMAX,xMAX,yMAX,aMAX; printf(n 输入拟合多项式的次数:n); scanf(%d,&m); printf(n 输入给定点的个数n及坐标(x,y):n); scanf(%d,&N); printf(n); for(i=0;iN;i+) scanf(%f,%f,&xi,&yi); for(i=0;i=m;i+) for(j=i;j=m;j+) tmp=0; for(k=0;kN;k+) tmp=tmp+pow(xk,(i+j); Xij=tmp; Xji=Xij; for(i=0;i=m;i+) tmp=0; fo

12、r(k=0;kN;k+) tmp=tmp+yk*pow(xk,i); Yi=tmp; for(j=0;jm;j+) for(i=j+1,mi=j,mx=fabs(Xjj);imx) mi=i; mx=fabs(Xij); if(jmi) tmp=Yj; Yj=Ymi; Ymi=tmp; for(k=j;k=m;k+) tmp=Xjk; Xjk=Xmik; Xmik=tmp; for(i=j+1;i=m;i+) tmp=-Xij/Xjj; Yi+=Yj*tmp; for(k=j;k=0;i-) ai=Yi; for(j=i+1;j=m;j+) ai-=Xij*aj; ai/=Xii; print

13、f(n 所求的二次多项式为:n); printf(P(x)=%f,a0); for(i=1;i=m;i+) printf(+(%f)*x%d,ai,i);运行结果: 输入拟合多项式的次数:5 输入给定点的个数n及坐标(x,y):31,25,34,2 所求的二次多项式为:P(x)=+*x1+*x2+*x3+*x4+01934)*x5Press any key to continue总结:拉格朗日计算公式中,只需要知道各个点即可4:第五章(1)曲线拟合:#include#include#define MAX 100void main() int i,j,k,m,n,N,mi; float tmp,

14、mx; float XMAXMAX,YMAX,xMAX,yMAX,aMAX; printf(n 输入拟合多项式的次数:n); scanf(%d,&m); printf(n 输入给定点的个数n及坐标(x,y):n); scanf(%d,&N); printf(n); for(i=0;iN;i+) scanf(%f,%f,&xi,&yi); for(i=0;i=m;i+) for(j=i;j=m;j+) tmp=0; for(k=0;kN;k+) tmp=tmp+pow(xk,(i+j); Xij=tmp; Xji=Xij; for(i=0;i=m;i+) tmp=0; for(k=0;kN;k+

15、) tmp=tmp+yk*pow(xk,i); Yi=tmp; for(j=0;jm;j+) for(i=j+1,mi=j,mx=fabs(Xjj);imx) mi=i; mx=fabs(Xij); if(jmi) tmp=Yj; Yj=Ymi; Ymi=tmp; for(k=j;k=m;k+) tmp=Xjk; Xjk=Xmik; Xmik=tmp; for(i=j+1;i=m;i+) tmp=-Xij/Xjj; Yi+=Yj*tmp; for(k=j;k=0;i-) ai=Yi; for(j=i+1;j=m;j+) ai-=Xij*aj; ai/=Xii; printf(n 所求的二次多项

16、式为:n); printf(P(x)=%f,a0); for(i=1;i=m;i+) printf(+(%f)*x%d,ai,i); 输入拟合多项式的次数:2 输入给定点的个数n及坐标(x,y):51,25,32,48,3-1,5 所求的二次多项式为:P(x)=+*x1+*x2Press any key to continue5:第六章(1)辛普生求积方法:#include #define N 16 /* 等分数 */float func(float x) float y; y=(1+x*x); return(y);void gedianzhi(float y,float a,float h)

17、 int i; for(i=0;i=N;i+) yi=func(a+i*h);float simpson(float y,float h) float s,s1,s2; int i; s1=y1; s2=; for(i=2;i=N-2;i=i+2) s1+=yi+1; /* 计算奇数项的函数值之和 */ s2+=yi; /* 计算偶数项的函数值之和 */ s=y0+yN+*s1+*s2; return(s*h/;main() float a,b,h,s,fN+1; scanf(%f,%f,&a,&b); h=(b-a)/( float)N; gedianzhi(f,a,h); s=simpso

18、n(f,h); printf(s=%fn,s);运行结果:1,3s=Press any key to continue总结:辛普生算法是一种积分方法,采用三点法插值,如果h较小的话,误差很小,因为它的插值余项,辛普生算法比较精确,程序关键是对所取的点的取和,注意6:第七章(1)改进欧拉法求解常微分方程的初值问题#include float func(float x,float y) return(y-x);float euler(float x0,float xn,float y0,int N) float x,y,yp,yc,h; int i; x=x0; y=y0; h=(xn-x0)/(

19、float)N; for(i=1;i=N;i+) yp=y+h*func(x,y); x=x0+i*h; yc=y+h*func(x,yp); y=(yp+yc)/; return(y);main() float x0,xn,y0,e; int n; printf(ninput n:n ); scanf(%d,&n); printf(input x0,xn:n ); scanf(%f,%f,&x0,&xn); printf(input y0:n ); scanf(%f,&y0); e=euler(x0,xn,y0,n); printf(y(%f)=%,y0,e);input n: 20inpu

20、t x0,xn: 1,6input y0: 2y= any key to continue(2)四阶龙格库塔法#include float func(float x,float y) return(x-y);float runge_kutta(float x0,float xn,float y0,int N) float x,y,y1,y2,h,xh; float d1,d2,d3,d4; int i; x=x0; y=y0; h=(xn-x0)/(float)N; for(i=1;i=N;i+) xh=x+h/2; d1=func(x,y); d2=func(xh,y+h*d1/; d3=f

21、unc(xh,y+h*d2/; d4=func(xh,y+h*d3); y=y+h*(d1+2*d2+2*d3+d4)/; x=x0+i*h; return(y); main() float x0,xn,y0,e; int N; printf(ninput n:n ); scanf(%d,&N); printf(input x0,xn:n ); scanf(%f,%f,&x0,&xn); printf(input y0:n ); scanf(%f,&y0); e=runge_kutta(x0,xn,y0,N); printf(y(%f)=%,y0,e);input n: 10input x0,

22、xn: 1,2input y0: 5y= any key to continue2-2 Gauss-Seidel方法#include #includeint gsdl(a,b,n,x,eps)int n;double a,b,x,eps;int i,j,u,v;double p,t,s,q;for(i=0;i=n-1;i+)u=i*n+i;p=;xi=;for(j=0;j=fabs(au)printf(“failn”);return(-1);p=eps+;while(p=eps)for(i=0;i=n-1;i+)t=xi;s=;for(j=0;jp)p=q;return(1);main()int i;double eps;static double a44=7,2,1,-29,15,3,-2-2,-2,11,51,3,2,13;static double x5,b4=4,7,-1,0;eps=;if(dsdl(a,b,4,x,eps)0)for(i=0;i=3;i+)printf(“x(%d)=%n”,i,xi);

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2