计算方法实验报告.docx
- 文档编号:17580548
- 上传时间:2023-07-26
- 格式:DOCX
- 页数:17
- 大小:226.02KB
计算方法实验报告.docx
《计算方法实验报告.docx》由会员分享,可在线阅读,更多相关《计算方法实验报告.docx(17页珍藏版)》请在冰点文库上搜索。
计算方法实验报告
杭州电子科技大学信息工程学院
实验报告
、、
课程名称:
计算方法
班级:
10092911
姓名:
陈彬燚
学号:
10929120
2012.12.11
一、实验目的:
(1)更好的了解各类计算方法的运用
(2)进一步熟练C语言编程
二、实验内容:
书上上机实验1,3大题:
第1大题三小题和第3大题。
第一大题①小题:
分段线性插值
内容:
计算f(0.15),f(0.31)及f(0.47)
x
0.0
0.1
0.195
0.3
0.401
0.5
f(x)
0.39894
0.39695
0.39142
0.38138
0.36812
0.35206
公式:
Si(x)=yi-1(x-xi/xi-1-xi)+yi(x-xi-1)/(xi-xi-1),=1,2,…..n
算法:
Step1:
输入n值及(xi,yi),i=0,1,…,n;
Step2:
输入i.;
Step3:
计算Si(x);Step4:
输出Si(x)
流程图(包括本实验2大题):
开始
输入已知点个数n
输入已知点X坐标
输入已知点Y坐标
输出结果
程序:
#include
#defineN100
structPOINT{doublex;doubley;};
voidmain(){
inti,n;doublex,S;
structPOINTps[N];
printf("pleaseinputn,0<=n<=100:
\n");
scanf("%d",&n);
printf("pleaseinputxi,yi:
\n");
for(i=0;i printf("Nowinputx: \n"); scanf("%lf",&x); printf("pleaseinputi: \n"); scanf("%d",&i); S=ps[i-1].y*(x-ps[i].x)/(ps[i-1].x-ps[i].x)+ps[i].y*(x-ps[i-1].x)/(ps[i].x-ps[i-1].x); printf("S%d(%lf)=%lf\n",i,x,S); } 运行结果: 第一大题②小题: 分段二次差值 程序: #include"stdio.h" #defineN100 voidmain(){ intn,j,i,I,k; floatx[N],y[N],a,p,Y=0.0,t; printf("pleaseinputn\n"); scanf("%d",&n); printf("pleaseinputx\n"); for(i=0;i scanf("%f",&x[i]); printf("pleaseinputy\n"); for(i=0;i scanf("%f",&y[i]); printf("pleaseinputa\n"); scanf("%f",&a); for(j=1;j p=0.5*(x[j]+x[j+1]); if(a for(k=I-1;k { for(j=I-1,t=1.0;j if(j! =k)t*=(a-x[j])/(x[k]-x[j]); } Y+=y[k]*t; } printf("%f%f",a,Y);break;} } if(a>0.5*(x[n-3]+x[n-2])) { I=n-2;for(k=I-1;k {for(j=I-1,t=1.0;j { if(j! =k)t*=(a-x[j])/(x[k]-x[j]); } Y+=y[k]*t; } printf("%f%f",a,Y);} } 运行结果: 同上 第一大题③小题: 全区间上拉格朗日差值 程序: #include"stdio.h" main(intargc,char*argv[]) { inti,j,n;floatx[10],y[10],lang=0.0,u; printf("inputnumbern=: \n"); scanf("%d",&n); printf("inputx[i]"); for(i=0;i scanf("%f",&x[i]); printf("inputy[i]"); for(i=0;i scanf("%f",&y[i]); printf("inputu"); scanf("%f",&u); for(i=0;i floattmp=1.0; for(j=0;j =j)tmp=tmp*(u-x[j])/(x[i]-x[j]); lang=lang+tmp*y[i]; } printf("lagrange=%f",lang); getch(); } 运行结果: 第二大题: 最小二乘法的C语言实现 1、实验目的: 进一步熟悉曲线拟合的最小二乘法。 掌握编程语言字符处理程序的设计和调试技术。 2、实验要求: 输入: 已知点的数目以及各点坐标。 输出: 根据最小二乘法原理以及各点坐标求出拟合曲线。 3、程序流程: (1)输入已知点的个数; (2)分别输入已知点的X坐标; (3)分别输入已知点的Y坐标; (4)通过调用函数,求出拟合曲线。 (5)求出最大偏差和均方误差 4、实验公式及方法: lny=lna+bx y=lnyx=x 根据书本实验,算出y的ln值,取代y值代入程序。 原表格: x 1 2 3 4 5 6 7 8 9 y 0.898 2.38 3.07 1.84 2.02 1.94 2.22 2.77 4.02 x 10 11 12 13 14 15 16 17 18 19 y 4.76 5.46 6.53 10.9 16.5 22.5 35.7 50.6 61.6 81.8 转换后表格: xi 1 2 3 4 5 6 7 8 9 yi -0.18 0.87 1.12 0.61 0.70 0.66 0.80 1.02 1.39 xi 10 11 12 13 14 15 16 17 18 19 yi 1.56 1.70 1.88 2.39 2.80 3.11 3.58 3.92 4.12 4.40 程序: #include #include #include #include floataverage(intn,float*x) {inti; floatav; av=0; for(i=0;i av+=*(x+i); av=av/n; return(av); } //平方和 floatspfh(intn,float*x) {inti; floata; a=0; for(i=0;i a+=(*(x+i))*(*(x+i)); return(a); } //和平方 floatshpf(intn,float*x) {inti; floata,b; a=0; for(i=0;i a=a+*(x+i); b=a*a/n; return(b); } //两数先相乘,再相加 floatdcj(intn,float*x,float*y) {inti; floata; a=0; for(i=0;i a+=(*(x+i))*(*(y+i)); return(a); } //两数先相加,再相乘 floatdjc(intn,float*x,float*y) {inti; floata=0,b=0; for(i=0;i {a=a+*(x+i); b=b+*(y+i); } a=a*b/n; return(a); } //系数a floatxsa(intn,float*x,float*y) {floata,b,c,d,e; a=spfh(n,x); b=shpf(n,x); c=dcj(n,x,y); d=djc(n,x,y); e=(c-d)/(a-b); //printf("%f%f%f%f",a,b,c,d); return(e); } floathe(intn,float*y) {inti; floata; a=0; for(i=0;i a=a+*(y+i); return(a); } floatxsb(intn,float*x,float*y,floata) {floatb,c,d; b=he(n,y); c=he(n,x); d=(b-a*c)/n; return(d); } voidmain() {intn,i; float*x,*y,a,b,c[100]; doubles,g,m,o,h,z[100],e; printf("请输入将要输入的有效数值组数n的值: "); scanf("%d",&n); x=(float*)calloc(n,sizeof(float)); if(x==NULL) {printf("内存分配失败"); exit (1); } y=(float*)calloc(n,sizeof(float)); if(y==NULL) {printf("内存分配失败"); exit (1); } printf("请输入x的值\n"); for(i=0;i printf("请输入y的值,请注意与x的值一一对应: \n"); for(i=0;i for(i=0;i {printf("x[%d]=%3.2f",i,*(x+i)); printf("y[%d]=%3.2f\n",i,*(y+i)); } a=xsa(n,x,y); b=xsb(n,x,y,a); printf("经最小二乘法拟合得到的一元线性方程为: \n"); printf("f(x)=%3.2fx+%3.2f\n",a,b); for(i=0;i c[i]=a*x[i]+b; } for(i=0;i printf("Y[%d]=%3.2f\n",i,c[i]); } for(i=0;i z[i]=fabs(c[i]-y[i]);} for(i=0;i h=z[0]; if(z[i]>a){ h=z[i]; } } printf("最大偏差=%3.2lf\n",h); e=0; for(i=0;i e=e+(z[i]*z[i]); } e=sqrt(e); printf("均方误差=%3.4lf\n",e); printf("原式a,b\n"); g=a; o=g; s=b; m=exp(s); printf("a=%3lf,b=%3.2lf\n",m,o); } 运行结果: 个人心得: 数字计算方法实验运用C语言进行编程,起初感觉很困难,网上找了些许资料,再结合自己多天的努力,终于于第二次实验课后12.11完成报告,受益颇多,更好的了解了数字方法在计算机上的方便运用以及其便利性,也因此次编写对各种计算方法有更深入的了解。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算方法 实验 报告
![提示](https://static.bingdoc.com/images/bang_tan.gif)