数值计算方法编程作业C语言版_第1页
数值计算方法编程作业C语言版_第2页
数值计算方法编程作业C语言版_第3页
数值计算方法编程作业C语言版_第4页
数值计算方法编程作业C语言版_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实用文案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(f(a)*f(x)0) /* 如果f(a)*f(x

2、)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 eps0.00001a,b=2,-5The root is x=1.324721, k=20Press any key to continue总结:本题关键在于两个端点的取值和误差的判断,此程序较容易。二分法收敛速度较快, 但缺点是只能求解单根。(2)牛顿法求解非线性方程:#incl

3、ude #include float f(float x) /* 定义函数 f(x) */ return(-3*x+4)*x-5)*x+6;标准文档实用文案float f1(float x) /* 定义函数 f(x)的导数 */ TOC o 1-5 h z return (-9*x+8)*x-5;void main() float eps,x0,x1=1.0;printf(input eps:n);scanf(%f,&eps); /*输入容许误差*/do x0=x1;/*准备下一次迭代的初值*/x1=x0-f(x0)/f1(x0);/* 牛顿迭代 */while(fabs(x1-x0)eps)

4、;/* 当满足精度,输出近似根*/printf(x=%fn,x1);程序运行结果:x=1.265328总结:关键是牛顿迭代的应用,程序中最大缺点是函数及其导数已唯一给出确定不可求的随意函数的根,牛顿法比二分法收敛快,可以求重根。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:

5、endl;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+ai j*xj;xi=(aim-d)/aii;/* 求解 */)cout该方程组的解为:endl;for(i=0;im;i+)coutxi=xi

6、t;system(pause);return 0;)void load()(标准文档实用文案int i,j;for(i=0;im;i+)for( j=0;jaij;)运行结果: TOC o 1-5 h z 下面请输入未知数的个数m=3请按顺序输入增广矩阵a:1 2 3 45 1 0 84 6 9 246920-6.5-11.255.50-1.86265e-008-0.1153853.92308该方程组的解为:x0=-9.99999x1=58 x2=-34Press any key to continue总结:列主元素消去法的目的是为了防止减去一个较小的数时大数淹没小数,而使结果产生较大误差,本

7、程序关键在每次消元时找到相应列中的最大项,然后交换两行位置,在进行计算。(2)LU分解法求解线性方程:#include标准文档实用文案void solve(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=-ui j; s2=s2+t*xj;xi=(yi+s2)/uii;标准文档实用文案)void main()float a

8、100100,l100100,u100100,x100,b100;int i,j,n,r,k;1*/float s1,s2;for(i=1;i=99;i+)/*将所有的数组置零,同时将 L矩阵的对角值设为for(j=1;j=99;j+)lij=0,uij=0;if( j=i) l皿=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);/*

9、读取列矩阵 B*/for(i=1;i=n;i+)scanf(%f,&bi);标准文档实用文案for(r=1;r=n;r+)/* 求解矩阵 L 和 U*/(for(i=r;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(%7.3f,lij);printf(n);标准文档

10、实用文案)printf(array U:n);/*输出矩阵 U*/for(i=1;i=n;i+)(for(j=1;j=n;j+)printf(%7.3f,uij);printf(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 -7标准文档实用文案array L:1.0000.0000.0002.0001.0000.000-1.0002.0001.000array U:2.0002

11、.0003.0000.0003.0001.0000.0000.0006.000解为:x1=2.000000 x2=-2.000000 x3=1.000000Press any key to continue总结:关键是把矩阵分解为L、U两个三角矩阵,回代过程比较简单。3:第四章(i)拉格朗日差值多项式#include#include#define MAX 100void main() int i,j,k,m,n,N,mi;float tmp,mx;标准文档实用文案float XMAXMAX,YMAX,xMAX,yMAX,aMAX;printf(n输入拟合多项式的次数:n);scanf(%d,&

12、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);Xi j=tmp;Xji=Xij;for(i=0;i=m;i+)tmp=0;标准文档实用文案for(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(X皿);imx)m

13、i=i;mx=fabs(Xi j);)if( jmi)tmp=Yj;Yj=Ymi;Ymi=tmp;for(k=j;k=m;k+)tmp=X jk;Xjk=Xmik;Xmik=tmp;标准文档实用文案)for(i=j+1;i=m;i+)(tmp=-Xi j/X jj;Yi+=Yj*tmp;for(k=j;k=0;i-)(ai=Yi;for( j=i+1;j=m;j+)ai-=Xi j*aj;ai/=Xii;)printf(n所求的二次多项式为:n);printf(P(x)=%f,a0);for(i=1;i=m;i+)printf(+(%f)*xA%d,ai,i);标准文档实用文案)运行结果:输入

14、拟合多项式的次数:5输入给定点的个数 n及坐标(x,y):31,25,34,2所求的二次多项式为:P(x)=1.980417+(0.282759)*xA1+(-0.299937)*xA2+(0.022071)*xA3+(0.016624)*xA4 +(-0.001934)*xA5Press any key to continue总结:拉格朗日计算公式中,只需要知道各个点即可4:第五章曲线拟合:#include#include#define MAX 100标准文档实用文案void main() int i,j,k,m,n,N,mi;float tmp,mx;float XMAXMAX,YMAX,

15、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);Xi j=tmp;Xji=Xij;标准文档实用文案for(i=0;i=m;i+)(tmp=0;for(k=0;kN;k+)tmp=tmp+yk*pow(xk,i);Yi=tmp;)

16、for( j=0;jm;j+)(for(i=j+1,mi=j,mx=fabs(X皿);imx)(mi=i;mx=fabs(Xi j);)if( jmi)(tmp=Yj;Yj=Ymi;Ymi=tmp;for(k=j;k=m;k+)(标准文档实用文案tmp=X jk;Xjk=Xmik;Xmik=tmp;)for(i=j+1;i=m;i+)(tmp=-Xi j/X jj;Yi+=Yj*tmp;for(k=j;k=0;i-)(ai=Yi;for( j=i+1;j=m;j+)ai-=Xi j*aj;ai/=Xii;)printf(n所求的二次多项式为:n);标准文档实用文案printf(P(x)=%f,

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

18、float a,float h) 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=0.0;*/*/for(i=2;i=N-2;i=i+2) s1+=yi+1;/*计算奇数项的函数值之和s2+=yi;/*计算偶数项的函数值之和)s=y0+yN+4.0*s1+2.0*s2;return(s*h/3.0);标准文档实用文案)main() float a,b,h,s,fN+1;scanf(%f,%f,&a,&b);h=(b-a)/( float)N;ged

19、ianzhi(f,a,h);s=simpson(f,h);printf(s=%fn,s);)运行结果:1,3s=1.854590Press any key to continue总结:辛普生算法是一种积分方法,采用三点法插值,如果 h较小的话,误差很小,因为4 b a h . (4) 它的插值余项R(f)f(4)(),辛普生算法比较精确,程序关键是对所取的180 2点的取和,注意6:第七章改进欧拉法求解常微分方程的初值问题#include float func(float x,float y) return(y-x);标准文档实用文案)float euler(float x0,float xn

20、,float y0,int N) float x,y,yp,yc,h;int i;x=x0;y=y0;h=(xn-x0)/(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)/2.0;)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

21、);e=euler(x0,xn,y0,n);printf(y(%f)=%6.4f,y0,e);input n:20input x0,xn:1,6input y0:2y(2.000000)=7.0000Press 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+hd1=func(x,y);d2=func(xh,y+h*d1/2.0);d3=func(xh,y+h*d2/2.0);d4=func(xh,y+h*d3);y=y+h*(d1+2*d2+2*d3+d4)/6.0;x=x0+i*h; return(y);main() float x0,xn,y0,e;int N;pri

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论