计算方法实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一:插值法
一、实验目的
通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/Turbo C)编程实现数值方法的求解。并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。
二、实验内容
先在屏幕上用随机函数按适当比例画出若干个点(至少7~9),分别用拉格朗日插值,牛顿插值,三次样条插值对上述离散点进行拟和,并用该软件的绘图功能来显示其插值函数。
三、源程序
⒈拉格朗日插值:(Lagrange)
#include
void main()
{
float x[3];
float y[3];
for(int m=0;m<3;m++)
cin>>x[m];
for(int n=0;n<3;n++)
cin>>y[n];
for(int k=0;k<3;k++)
{
float s=0;
for(int i=0;i<3;i++)
{
float p=1;
for(int j=0;j<3;j++)
if(i!=j)
p=p*((x[k]-x[j])/(x[i]-x[j]));
s=s+y[i]*p;
}
cout<<"("< } } 2.牛顿插值: #include void main() { float x[5]; float y[5]; float f[5]; for(int m=0;m<3;m++) cin>>x[m]; for(int n=0;n<3;n++) cin>>y[n]; float t=1; for(int k=0;k<5;k++) { f[k]=y[k]; for(int j=0;j<5;j++) t=t*(x[k]-x[j-1]); for(int i=0;i<(5-j);i++) f[i]=(f[i+1]-f[i])/(x[j+i]-x[i]); y[k]=f[k]+t*f[k]; cout<<"y="< } } 四、实验结果 五、实验心得 通过此次实验编程,更好的掌握了拉格朗日插值算法,但对于应用上还有很多欠缺,对于牛顿插值更是不熟悉,需要多加练习。 实 验 二 :数 值 积 分 一、实验目的 通过该课程实习,学会使用数值积分的各种方法求解定积分计算的问题,体会各种方法的精度差异。 二、实验内容 用龙贝格算法和变步长梯形积分方法计算dx x x 60sin 。 三、源程序 1.龙贝格算法:(Romberg ) #include #include double f(float x) { if(x>-0.0001 && x<0.0001) return 1; else return sin(x)/x; } void main() { int k; float h,a,b,T1;float e=0.0001; k=1; h=b-a; T1=h/2*(f(a)+f(b)); float x,s; if(x { s=0; x=a+h/2; s=s+f(x); x=x+h; } else { float T2,S2; T2=T1/2+h/2*s; S2=T2+1/3*(T2-T1); if(k==1) { k+1; h=h/2; T1=T2;s=S2; } else { float c2,c1; c2=S2+1/15*(S2-s); if(k==2) c1=c2; else { float R1,R2; R2=c2+1/63*(c2-c1); if(k==3) R1=R2; if(fabs(R2-R1) cout< } } } } 2.梯形递推化 #include #include double f(float x) { if(x>-0.0001 && x<0.0001) return 1; else return sin(x)/x; } T(float a,float b,float e) { float h,T1,T2; h=b-a; T1=h/2*(f(a)+f(b)); T2=0; float s,x; s=0; x=a+h/2;