数值分析实验报告.docx
- 文档编号:11355872
- 上传时间:2023-02-28
- 格式:DOCX
- 页数:14
- 大小:55.07KB
数值分析实验报告.docx
《数值分析实验报告.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告.docx(14页珍藏版)》请在冰豆网上搜索。
数值分析实验报告
《数值分析》
实验报告册
姓名:
穆海山
学号:
12207210220
系别:
数理系
专业:
信息与计算科学
班级:
信息②班
实验一
一、课题名称
非线性方程数值解法
二、目的和意义
学会常用的插值方法,求函数的近似表达式,以解决其它实际问题;明确插值多项式和分段插值多项式各自的优缺点;熟悉插值方法的程序编制;如果绘出插值函数的曲线,观察其光滑性。
三、计算公式
Lagrange插值公式:
牛顿插值公式:
四、结构程序设计
程序设计:
#include"math.h"
floatf(floatx)
{
return((x*x*x-1)/3);/*牛顿迭代函数*/
}
main()
{
floatx1,x2,eps,d;intk=0;
clrscr();
printf("\ninputx1=");/*输入迭代初值*/
scanf("%f",&x1);
printf("\ninputeps=");/*输入求解精度eps*/
scanf("%f",&eps);
do{
k++;
x1=x2;
x2=f(x1);
printf("\n%d%f\n",k,x2);
}while(fabs(x2-x1)>=eps);
printf("therootoff(x)=0isx=%f,k=%d\n",x2,k);/*输出x和迭代次数k*/
getch();
}
五、结果讨论和分析
计算结果分析:
将六种迭代格式分别代入程序试验:
(1)第一种格式:
无论何值都无法求出,即发散
(2)第二种格式:
初值为任意的x(x2<=1),精度为0.00001
X=-0.347296,k=6
其他值为发散。
(3)第三种格式:
初值为任意的x(x>0),精度为0.0001
X=1.879372,k=10
其他值为发散。
(4)第四种格式:
初值为任意值,精度为0.00001
X=-0.347296,k=5
(5)第五种格式:
初值为任意值,精度为0.00001
X=-0.347296,k=4
(6)第六种格式:
初值为任意值,精度为0.00001
X=-0.347296,k=4
由此可知不同的初值对公式的计算有影响,当初值不满足函数的收敛条件时,无法计算结果,函数发散。
精度的大小不同也使迭代函数迭代的次数不同,从而影响xn的近似程度。
实验二
一、课题名称
解线性方程组的直接方法
二、目的和意义
掌握线性方程组直接接法的基本思想;了解不同数值方法解线性方程组的原理、实现条件、使用范围、计算公式;培养编程与上机调试能力。
三、计算公式
消去法
设a(k)kk=0,对k=1,2,……,n-1计算
mik=a(k)ik/a(k)kk
a(k+1)ij=a(k)ij-mika(k)kji,j=k+1,k+2,……,n
b(k+1)i=b(k)i-mikb(k)k
n
xn=b(n)n/a(n)nn
j=i+1
xi=(b(i)i-Σa(i)ijxj)/a(i)iii=n-1,n-2,……,1
平方根法追赶法
lij=(aii-Σl2ik)1/2Ly=f
lji=(aji-Σljklik)/liij=i+1,i+2,……,nUx=y
y1=f1/l1
y2=(fi-aiyi-1)/lii=2,3,……,n
四、结构程序设计
用追赶法求解线性方程组
#include"stdio.h"
main()
{
FILE*f;
doublea[15],b[15],c[15],d[15];
doublet;
inti,n;
f=fopen("zgf.dat","r");
fscanf(f,"%d",&n);
fscanf(f,"%lf%lf%lf",&b[1],&c[1],&d[1]);
for(i=2;i<=n-1;i++)
{
fscanf(f,"%lf%lf%lf%lf",&a[i],&b[i],&c[i],&d[i]);
}
fscanf(f,"%lf%lf%lf",&a[n],&b[n],&d[n]);
fclose(f);
c[1]=c[1]/b[1];
d[1]=d[1]/b[1];
for(i=2;i<=n-1;i++)
{
t=b[i]-c[i-1]*a[i];
c[i]=c[i]/t;
d[i]=(d[i]-d[i-1]*a[i])/t;
}
d[n]=(d[n]-d[n-1]*a[n])/(b[n]-c[n-1]*a[n]);
for(i==n-1;i>=1;i--)d[i]=d[i]-c[i]*d[i+1];
printf("\n***************\n");
for(i=1;i<=n;i++)
printf("d[%2d]=%lf\n",i,d[i]);
}
五、结果讨论和分析
此方法通过有限步算术运算求出精确解,但实际计算由于舍入误差的影响,只能求出近似解。
实验三
一、课题名称
曲线拟合的最小二乘法
二、的和意义
掌握曲线拟合的最小二乘法;了解最小二乘法亦可以用于解超定线性方程组;探索拟合函数的选择与拟合精度间的关系。
三、计算公式
e22=Σε2i=Σ[φ(xi)-f(xi)]2
四、结构程序设计
#include"stdio.h"
#include"math.h"
#definenum10
floatneiji(floatb[num],floatc[num])
{intp;
floatnj=0;
for(p=1;p nj+=c[p]*b[p]; returnnj; } floats[num],x[num],fai[num][num],afa[num]; floatbeida[num],a[num],xfai[num],yd[num],max,pcpfh; voidmain() {inti,j,k,n,index,flag; charconti; conti=''; printf("请输入已知点的个数n=\n"); scanf("%d",&n); printf("请输入x和y: "); for(i=1;i<=n;i++) {printf("x[%d]=",i); scanf("%f",&x[i]); printf("y[%d]=",i); scanf("%f","&y[i]"); } while(conti=='') {printf("请输入拟和次数="); scanf("%d",&index); pcpfh=0; afa[1]=0; a[0]=0; for(i=1;i<=n;i++) {afa[1]+=x[i]; a[0]+=yd[i]; fai[0][i]=1; } afa[1]=afa[1]/n; a[0]=a[0]/n; for(i=1;i<=n;i++) { fai[1][i]=x[i]-afa[1]; } a[1]=neiji(fai[1],yd)/neiji(fai[1],fai[1]); for(k=1;k {for(i=1;i<=n;i++) xfai[i]=x[i]*fai[k][i]; afa[k+1]=neiji(fai[k],xfai)/neiji(fai[k],fai[k]); beida[k]=neiji(fai[k],fai[k])/neiji(fai[k-1],fai[k-1]); for(j=1;j<=n;j++) fai[k+1][j]=(x[j]-afa[k+1])*fai[k][j]-beida[k]*fai[k-1][j]; a[k+1]=neiji(fai[k+1],yd)/neiji(fai[k+1],fai[k+1]); } printf("%d次拟和结果为\n",index); for(i=0;i<=index;i++) printf("a[%d]=%f\n",i,a[i]); for(i=1;i<=index;i++) printf("afa[%d]=%f\n",i,afa[i]); for(i=1;i printf("beida[%d]=%f\n",i,beida[i]); for(i=1;i<=n;i++) {for(k=0;k<=index;k++) s[i]+=a[k]*fai[k][i]; yd[i]=fabs(yd[i]-s[i]); pcpfh+=yd[i]*yd[i]; s[i]=0; } max=0; for(i=1;i<=n;i++) if(yd[i]>max) {max=yd[i]; flag=i; } printf("当x=%f时,偏差最大=%f,偏差平方和为%f\n",x[flag],max,pcpfh); printf("继续拟和请按space,按其他键退出"); conti=getchar(); conti=getchar(); } } 五、结果讨论和分析 请输入已知点的个数n=10 请输入x和y: x[1]=0 y[1]=0 …… 请输入拟合次数=5 5次拟合结果为 当x=0.000000时,偏差最大=6706185.000000,偏差平方和为449729146126336.000000. 实验四 一、课题名称 数值积分与数值微分 二、目的和意义 深刻认识数值积分法的意义;明确数值积分精度与步长的关系;根据定积分的计算方法,可以考虑二重积分的计算问题。 三、计算公式 Sn=1/6*[f(a)+4Σf(xk+1/2)+2Σf(xk)+f(b)] Rn=64/63*c2n-1/63*cn 四、结构程序设计 Romberg算法: #include"stdio.h" #include"math.h" #include"conio.h" floatf(floatx) {return(exp(x)/(4+x*x));} main() { floata=0,b=1; floath=b-a,T1,T2,s,x; inti;T1=h/2*(f(a)+f(b)); for(i=0;i<3;i++) { printf("h=%f,T=%f\n",h,T1); s=0; x=a+h/2; while(x { s+=f(x); x+=h; } T2=T1/2+h/2*s; h/=2;T1=T2; } printf("h=%f,T=%f\n",h,T1); return; } Simpson算法: #include"stdio.h" #include"math.h" #include"conio.h" #defineMax_M20 floatf(floatx) {return(sin(x)/x);} floatSimpson(floata,floatb,intn) { intk;floatx,s1,s2,h=(b-a)/n; x=a+h/2; s1=f(x);s2=0; for(k=1;k { s1=s1+f(a+k*h+h/a); s2=s2+f(a+k*h); } s2=h*(f(a)+4*s1+2*s2+f(b))/6; return(s2); } main() { inti,n;floata1,b1,s=0; printf("\nInputthebegin: "); scanf("%f",&a1); printf("\nInputtheend: "); scanf("%f",&b1); do{ printf("\ninputndivdevalue[divide(%f,%f)]: ",a1,b1); scanf("%d",&b1); } while(n<=1&&n>Max_M); s=Simpson(a1,b1,n); printf("solveis: %f",s); getch(); return(s); }_ _ 五、结果讨论和分析 用Romberg法得出结果为: 用Simpson法得出结果为: 可见复化公式要先估计出步长,步长的大小将影响计算结果和精度
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)