logo资料库

北航数值分析第三次大作业.doc

第1页 / 共16页
第2页 / 共16页
第3页 / 共16页
第4页 / 共16页
第5页 / 共16页
第6页 / 共16页
第7页 / 共16页
第8页 / 共16页
资料共16页,剩余部分请下载后查看
《数值分析 B》计算实习第三题 算法的设计方案 1. 使 用 牛 顿 迭 代 法( 简 单 迭 代 法 不 收 敛) , 对 原 题 中 给 出 的 xi 08.0 i , y j  05.05.0  j ,( 0  i 0,10  j 20 )的 11*21 组 i yx , 分别求出原题中方程 j 组的一组解,于是得到一组和 i i yx , 对应的 j i tu , 。 2.对于已求出的 j i tu , ,使用分片二次代数插值法对原题中关于 utz ,, 的数表进行 插值得到 ijz 。于是产生了 z=f(x,y)的 11*21 个数值解。 3.从 k=1 开始逐渐增大 k 的值,并使用最小二乘法曲面拟合法对 z=f(x,y)进 行拟合,得到每次的 ,k 。当  710  时结束计算,输出拟合结果。 4. 计 算 ( xf * i , y * j ), ( xp * i , y * j )( i  ,2,1  ,8, j  ,2,1  )5, 的 值 并 输 出 结 果 , 以 观 察 ,( yxp ) 逼近 ,( yxf ) 的效果。其中 x * i  ,1.0 yi * j  2.05.0  j 。 源程序代码 #include #include #define N 4 double e=1e-12;
double gauss(double a[N][N+1],double x[N]) { //gauss 求线性方程组 int i,j,k; double p=0; for(k=0;k=0;i--) { p=0; for(j=N-1;j>i;j--) { p=p+a[i][j]*x[j]; } x[i]=(a[i][N]-p)/a[i][i]; } return 0; } void A_ni(double A[10][10],int n) { double a[10][10],b[10][20],c[10][10],t; int i,j,m; for(i=0;i
t=b[m][m]; i=m; while(b[m][m]==0) { b[m][m]=b[i+1][m]; i++; } if(i>m) { b[i][m]=t; for(j=0;j=m;j--) for(j=2*n-1;j>=m;j--) b[m][j]/=b[m][m]; b[i][j]-=b[i][m]*b[m][j]/b[m][m]; b[i][j]=0; for(i=0;i0) } { } for(i=0;i=m;j--) b[i][j]-=b[i][m]*b[m][j]; m--; for(i=0;i
c[i][j]=b[i][n+j]; for(i=0;i
num1=sqrt(num1); num2=sqrt(num2); if((num1/num2)<=e) tu[0]=result1[0]; tu[1]=result1[1]; tu[2]=result1[2]; tu[3]=result1[3]; break; for(i=0;i<4;i++) result[i]+=result1[i]; } { } { } else if((0.3
j=4; l1[0]=((tt-t[i])*(tt-t[i+1]))/((t[i-1]-t[i])*(t[i-1]-t[i+1])); l1[1]=((tt-t[i-1])*(tt-t[i+1]))/((t[i]-t[i-1])*(t[i]-t[i+1])); l1[2]=((tt-t[i-1])*(tt-t[i]))/((t[i+1]-t[i-1])*(t[i+1]-t[i])); l2[0]=((uu-u[j])*(uu-u[j+1]))/((u[j-1]-u[j])*(u[j-1]-u[j+1])); l2[1]=((uu-u[j-1])*(uu-u[j+1]))/((u[j]-u[j-1])*(u[j]-u[j+1])); l2[2]=((uu-u[j-1])*(uu-u[j]))/((u[j+1]-u[j-1])*(u[j+1]-u[j])); result=l1[0]*l2[0]*z[i-1][j-1]+l1[0]*l2[1]*z[i-1][j]+l1[0]*l2[2]*z[i-1][j+1] +l1[1]*l2[0]*z[i][j-1]+l1[1]*l2[1]*z[i][j]+l1[1]*l2[2]*z[i][j+1] +l1[2]*l2[0]*z[i+1][j-1]+l1[2]*l2[1]*z[i+1][j]+l1[2]*l2[2]*z[i+1][j+1]; //幂函数 return result; } double y_x(double y,int x) { int i; double result=1; for(i=1;i<=x;i++) result=result*y; return result; int i,j,m; double num=0,result=0; double } double Pk(double x,double y,double C[10][10],int k) { //曲面拟合函数 B[11][10],G[21][10],BB[10][10],GG[10][10],U[11][21],UU[21][21],tu[4]; double X[11]={0,0.08,0.16,0.24,0.32,0.40,0.48,0.56,0.64,0.72,0.80}; double Y[21]={0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.05,1.1,1.15,1.2,1.25,1.3,1.3 5,1.4,1.45,1.5}; for(i=0;i<11;i++) for(i=0;i<21;i++) B[i][0]=1; for(j=1;j<=k;j++) B[i][j]=y_x(X[i],j); G[i][0]=1; for(j=1;j<=k;j++) G[i][j]=y_x(Y[i],j); { } { } for(i=0;i<11;i++) for(j=0;j<21;j++)
Newton(X[i],Y[j],tu); U[i][j]=Z(tu[0],tu[1]); for(i=0;i<=k;i++) for(j=0;j<=k;j++) num=num+B[m][i]*B[m][j]; for(m=0;m<11;m++) { } BB[i][j]=num; num=0; { } { } { } { } { } { } { for(i=0;i<=k;i++) for(j=0;j<=k;j++) num=0; for(m=0;m<21;m++) GG[i][j]=num; num=num+G[m][i]*G[m][j]; A_ni(BB,k+1); A_ni(GG,k+1); num=0; for(i=0;i<=k;i++) for(j=0;j<21;j++) for(i=0;i<=k;i++) for(j=0;j<=k;j++) for(m=0;m<11;m++) num=num+B[m][i]*U[m][j]; UU[i][j]=num; num=0; for(m=0;m<21;m++) num=num+UU[i][m]*G[m][j]; C[i][j]=num; num=0;
} { } { } for(i=0;i<=k;i++) for(j=0;j<=k;j++) for(m=0;m<=k;m++) num=num+BB[i][m]*C[m][j]; UU[i][j]=num; num=0; for(i=0;i<=k;i++) for(j=0;j<=k;j++) for(m=0;m<=k;m++) num=num+UU[i][m]*GG[m][j]; C[i][j]=num; num=0; for(i=0;i<=k;i++) for(j=0;j<=k;j++) result=result+C[i][j]*y_x(x,i)*y_x(y,j); return result; } void main() { double tu[4],U[11][21],B[11][10],BB[10][10],C[10][10]; double X[11]={0,0.08,0.16,0.24,0.32,0.40,0.48,0.56,0.64,0.72,0.80}; double Y[21]={0.5,0.55,0.6,0.65,0.7,0.75,0.8,0.85,0.9,0.95,1.0,1.05,1.1,1.15,1.2,1.25,1.3,1.3 5,1.4,1.45,1.5}; double x[8]={0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8}; double y[5]={0.7,0.9,1.1,1.3,1.5}; double num=0; int i,j,m,k=1; for(i=0;i<11;i++) { for(j=0;j<21;j++) Newton(X[i],Y[j],tu); U[i][j]=Z(tu[0],tu[1]); { } } while(1) { printf("x[%d]=%f,y[%d]=%f,f(x[%d],y[%d])=%12.11e\n",i,X[i],j,Y[j],i,j,U[i][j]);
分享到:
收藏