有没有做租赁的网站,上海网站制作维护,个人网站 备案 广告,可以拿自己电脑做网站目录
一、示例1-五点菱形格式
1.1 C代码
1.2 计算结果
二、示例2-九点紧差分格式
2.1 C代码
2.2 计算结果
三、示例3-二阶混合边值
3.1 C代码
3.2 计算结果 本专栏对椭圆型偏微分方程的三种主要差分方法进行了介绍#xff0c;并给出相应格式的理论推导过程。为加深对…目录
一、示例1-五点菱形格式
1.1 C代码
1.2 计算结果
二、示例2-九点紧差分格式
2.1 C代码
2.2 计算结果
三、示例3-二阶混合边值
3.1 C代码
3.2 计算结果 本专栏对椭圆型偏微分方程的三种主要差分方法进行了介绍并给出相应格式的理论推导过程。为加深对差分格式的理解分别对三种方法进行C编程示例。
一、示例1-五点菱形格式 已知精确解为。分别取两种剖分数m20n30和m40n60输出10个节点和处的数值解并给出误差。要求在各个节点处最大误差的迭代误差限为。
1.1 C代码 #include cmath
#include stdlib.h
#include stdio.hint main(int argc, char* argv[])
{int m,n,i,j,k,num;double xa,xb,ya,yb,dx,dy,alpha,beta,gamma,err,maxerr;double *x,*y,**u,**temp;double leftboundary(double y);double rightboundary(double y);double bottomboundary(double x);double topboundary(double x);double f(double x, double y);double exact(double x, double y);xa1.0;xb2.0;ya0.0;yb3.0;m20;n30;printf(m%d,n%d.\n,m,n);dx(xb-xa)/m;dy(yb-ya)/n;beta1.0/(dx*dx);gamma1.0/(dy*dy);alpha2.0*(betagamma);x(double*)malloc(sizeof(double)*(m1));for(i0;im;i)x[i]xai*dx;y(double*)malloc(sizeof(double)*(n1));for(j0;jn;j)y[j]yaj*dy;u(double**)malloc(sizeof(double*)*(m1));temp(double**)malloc(sizeof(double*)*(m1));for(i0;im;i){u[i](double*)malloc(sizeof(double)*(n1));temp[i](double*)malloc(sizeof(double)*(n1));}for(j0;jn;j){u[0][j]leftboundary(y[j]);u[m][j]rightboundary(y[j]);}for(i1;im;i){u[i][0]bottomboundary(x[i]);u[i][n]topboundary(x[i]);}for(i1;im;i){for(j1;jn;j)u[i][j]0.0;}for(i0;im;i){for(j0;jn;j)temp[i][j]u[i][j];}k0;do{maxerr0.0;for(i1;im;i){for(j1;jn;j){temp[i][j](f(x[i],y[j])beta*(u[i-1][j]temp[i1][j])gamma*(u[i][j-1]temp[i][j1]))/alpha;errfabs(temp[i][j]-u[i][j]);if(errmaxerr)maxerrerr;u[i][j]temp[i][j];}}kk1;}while(maxerr0.5*1e-10);printf(k%d.\n,k);kn/6;numm/4;for(jk;jn;jjk){printf((1.25,%.3f), y%f, err%.4e.\n,y[j],u[num][j],fabs(exact(x[num],y[j])-u[num][j]));}num3*m/4;for(jk;jn;jjk){printf((1.75,%.3f), y%f, err%.4e.\n,y[j],u[num][j],fabs(exact(x[num],y[j])-u[num][j]));}for(i0;im;i){free(u[i]);free(temp[i]);}free(x);free(y);return 0;
}double leftboundary(double y)
{return log(1.02*y*y);
}
double rightboundary(double y)
{return log(4.02*y*y);
}
double bottomboundary(double x)
{return 2*log(x);
}
double topboundary(double x)
{return log(18.0x*x);
}
double f(double x, double y)
{double temp1,temp2,z;temp1x*x; temp2y*y;ztemp12*temp2;return (4*temp2-2*temp1)/(z*z);
}
double exact(double x, double y)
{return log(x*x2*y*y);
} 1.2 计算结果 当m20n30时计算结果为
m20,n30.
k959.
(1.25,0.500), y0.724037, err1.1827e-04.
(1.25,1.000), y1.270654, err1.9108e-04.
(1.25,1.500), y1.802202, err7.9937e-05.
(1.25,2.000), y2.257872, err2.3280e-05.
(1.25,2.500), y2.643516, err4.1352e-06.
(1.75,0.500), y1.270488, err2.5584e-05.
(1.75,1.000), y1.621992, err1.3181e-04.
(1.75,1.500), y2.023279, err7.7668e-05.
(1.75,2.000), y2.403589, err2.7872e-05.
(1.75,2.500), y2.744871, err6.9853e-06. 当m40n60时计算结果为
m40,n60.
k3582.
(1.25,0.500), y0.723948, err2.9304e-05.
(1.25,1.000), y1.270510, err4.7781e-05.
(1.25,1.500), y1.802142, err1.9972e-05.
(1.25,2.000), y2.257855, err5.8033e-06.
(1.25,2.500), y2.643513, err1.0237e-06.
(1.75,0.500), y1.270469, err6.1963e-06.
(1.75,1.000), y1.621893, err3.2942e-05.
(1.75,1.500), y2.023221, err1.9426e-05.
(1.75,2.000), y2.403568, err6.9568e-06.
(1.75,2.500), y2.744866, err1.7374e-06.
二、示例2-九点紧差分格式 已知精确解为。分别取两种剖分数m20n30和m40n60输出10个节点和处的数值解并给出误差。要求在各个节点处最大误差的迭代误差限为。
2.1 C代码 #include cmath
#include stdlib.h
#include stdio.hint main(int argc, char*argv[])
{int m,n,i,j,k,num;double xa,xb,ya,yb,dx,dy,alpha,beta,gamma,err,maxerr;double *x,*y,**u,**g,**temp,kexi,eta1,eta2;double leftboundary(double y);double rightboundary(double y);double bottomboundary(double x);double topboundary(double x);double f(double x, double y);double **Gij(double *x, double *y, int m, int n);double exact(double x, double y);xa1.0;xb2.0;ya0.0;yb3.0;m20;n30;printf(m%d,n%d.\n,m,n);dx(xb-xa)/m;dy(yb-ya)/n;beta1.0/(dx*dx);gamma1.0/(dy*dy);kexibetagamma;eta110*beta-2*gamma;eta210*gamma-2*beta;x(double*)malloc(sizeof(double)*(m1));for(i0;im;i)x[i]xai*dx;y(double*)malloc(sizeof(double)*(n1));for(j0;jn;j)y[j]yaj*dy;u(double**)malloc(sizeof(double*)*(m1));temp(double**)malloc(sizeof(double*)*(m1));for(i0;im;i){u[i](double*)malloc(sizeof(double)*(n1));temp[i](double*)malloc(sizeof(double)*(n1));}for(j0;jn;j){u[0][j]leftboundary(y[j]);u[m][j]rightboundary(y[j]);}for(i1;im;i){u[i][0]bottomboundary(x[i]);u[i][n]topboundary(x[i]);}for(i1;im;i){for(j1;jn;j)u[i][j]0.0;}gGij(x,y,m,n);for(i0;im;i){for(j0;jn;j)temp[i][j]u[i][j];}k0;do{maxerr0.0;for(i1;im;i){for(j1;jn;j){temp[i][j](g[i][j]-kexi*(u[i-1][j-1]temp[i-1][j1]u[i1][j-1]temp[i1][j1])-eta1*(u[i-1][j]temp[i1][j])-eta2*(u[i][j-1]temp[i][j1]))/(-20*kexi);errfabs(temp[i][j]-u[i][j]);if(errmaxerr)maxerrerr;u[i][j]temp[i][j];}}kk1;}while(maxerr0.5*1e-10);printf(k%d.\n,k);kn/6;numm/4;for(jk;jn;jjk){printf((1.25,%.3f), y%f, err%.4e.\n,y[j],u[num][j],fabs(exact(x[num],y[j])-u[num][j]));}num3*m/4;for(jk;jn;jjk){printf((1.75,%.3f), y%f, err%.4e.\n,y[j],u[num][j],fabs(exact(x[num],y[j])-u[num][j]));}for(i0;im;i){free(u[i]);free(temp[i]);}free(u);free(temp);free(x);free(y);return 0;
}double leftboundary(double y)
{return log(1.02*y*y);
}
double rightboundary(double y)
{return log(4.02*y*y);
}
double bottomboundary(double x)
{return 2*log(x);
}
double topboundary(double x)
{return log(18x*x);
}
double f(double x, double y)
{double temp1, temp2, z;temp1x*x;temp2y*y;ztemp12*temp2;return (4*temp2-2*temp1)/(z*z);
}
double exact(double x, double y)
{return log(x*x2*y*y);
}
double **Gij(double *x, double *y, int m, int n)
{int i,j;double temp1,temp2,temp3,**ans;ans(double**)malloc(sizeof(double*)*(m1));for(i0;im;i)ans[i](double*)malloc(sizeof(double)*(n1));for(i0;im;i){for(j0;jn;j)ans[i][j]0.0;}for(i1;im;i){for(j1;jn;j){temp1f(x[i-1],y[j-1])10*f(x[i],y[j-1])f(x[i1],y[j-1]);temp2f(x[i-1],y[j])10*f(x[i],y[j])f(x[i1],y[j]);temp3f(x[i-1],y[j1])10*f(x[i],y[j1])f(x[i1],y[j1]);ans[i][j]-(temp1temp310*temp2)/12.0;}}return ans;
}
2.2 计算结果 当m20n30时计算结果为
m20,n30.
k805.
(1.25,0.500), y0.723921, err2.5068e-06.
(1.25,1.000), y1.270463, err4.0234e-07.
(1.25,1.500), y1.802122, err8.8970e-08.
(1.25,2.000), y2.257849, err6.0205e-08.
(1.25,2.500), y2.643512, err2.1371e-08.
(1.75,0.500), y1.270463, err8.8774e-07.
(1.75,1.000), y1.621861, err5.0648e-07.
(1.75,1.500), y2.023202, err1.3736e-10.
(1.75,2.000), y2.403561, err4.9714e-08.
(1.75,2.500), y2.744864, err2.2523e-08. 当m40n60时计算结果为
m40,n60.
k3012.
(1.25,0.500), y0.723919, err1.5248e-07.
(1.25,1.000), y1.270463, err2.0549e-08.
(1.25,1.500), y1.802122, err1.0963e-08.
(1.25,2.000), y2.257849, err8.4329e-09.
(1.25,2.500), y2.643512, err4.0188e-09.
(1.75,0.500), y1.270463, err5.2372e-08.
(1.75,1.000), y1.621860, err2.7195e-08.
(1.75,1.500), y2.023202, err5.0463e-09.
(1.75,2.000), y2.403561, err7.4797e-09.
(1.75,2.500), y2.744864, err3.9218e-09.
三、示例3-二阶混合边值 已知精确解为。分别取两种剖分数m20n30和m40n60输出10个节点和处的数值解并给出误差。要求在各个节点处最大误差的迭代误差限为。
3.1 C代码 #include cmath
#include stdlib.h
#include stdio.hint main(int argc, char*argv[])
{int m, n, i, j, k, num;double xa, xb, ya, yb, dx, dy, alpha, beta, gamma, maxerr;double *x, *y, **u, **v, **lambda, kexi, eta, *d, temp;double f(double x, double y);double lambda_function(double x, double y);double phi1(double y);double phi2(double y);double psi1(double x);double psi2(double x);double exact(double x, double y);xa1.0;xb2.0;ya0.0;yb3.0;m20;n30;printf(m%d, n%d\n, m, n);dx(xb-xa)/m;dy(yb-ya)/n;beta1.0/(dx*dx);gamma1.0/(dy*dy);alpha2*(betagamma);kexi2.0/dx;eta2.0/dy;x(double*)malloc(sizeof(double)*(m1));for(i0;im;i)x[i]xai*dx;y(double*)malloc(sizeof(double)*(n1));for(j0;jn;j)y[j]yaj*dy;u(double**)malloc(sizeof(double*)*(m1));v(double**)malloc(sizeof(double*)*(m1));lambda(double**)malloc(sizeof(double*)*(m1));for(i0;im;i){u[i](double*)malloc(sizeof(double)*(n1));v[i](double*)malloc(sizeof(double)*(n1));lambda[i](double*)malloc(sizeof(double)*(n1));}for(i0;im;i){for(j0;jn;j){u[i][j]0.0;v[i][j]0.0;lambda[i][j]lambda_function(x[i], y[j]);}}d(double*)malloc(sizeof(double)*(m1));k0;do{maxerr0.0;for(i0;im;i)d[i]f(x[i],y[0])-eta*psi1(x[i]);d[0]d[0]-kexi*phi1(y[0]);d[m]d[m]kexi*phi2(y[0]);v[0][0](d[0]2*gamma*u[0][1]2*beta*u[1][0])/(alpha(kexieta)*lambda[0][0]);for(i1;im;i)v[i][0](d[i]2*gamma*u[i][1]beta*(v[i-1][0]u[i1][0]))/(alphaeta*lambda[i][0]);v[m][0](d[m]2*gamma*u[m][1]2*beta*v[m-1][0])/(alpha(kexieta)*lambda[m][0]);for(j1;jn;j){for(i0;im;i)d[i]f(x[i],y[j]);d[0]d[0]-kexi*phi1(y[j]);d[m]d[m]kexi*phi2(y[j]);v[0][j](d[0]gamma*(u[0][j1]v[0][j-1])2*beta*u[1][j])/(alphakexi*lambda[0][j]);for(i1;im;i)v[i][j](d[i]gamma*(v[i][j-1]u[i][j1])beta*(v[i-1][j]u[i1][j]))/alpha;v[m][j](d[m]gamma*(v[m][j-1]u[m][j1])2*beta*v[m-1][j])/(alphakexi*lambda[m][j]);}for(i0;im;i)d[i]f(x[i],y[n])eta*psi2(x[i]);d[0]d[0]-kexi*phi1(y[n]);d[m]d[m]kexi*phi2(y[n]);v[0][n](d[0]2*beta*u[1][n]2*gamma*v[0][n-1])/(alpha(kexieta)*lambda[0][n]);for(i1;im;i)v[i][n](d[i]beta*(v[i-1][n]u[i1][n])2*gamma*v[i][n-1])/(alphaeta*lambda[i][n]);v[m][n](d[m]2*beta*v[m-1][n]2*gamma*v[m][n-1])/(alpha(kexieta)*lambda[m][n]);for(i0;im;i){for(j0;jn;j){tempfabs(u[i][j]-v[i][j]);if(tempmaxerr)maxerrtemp;u[i][j]v[i][j];}}kk1;}while((maxerr0.5*1e-10)(k1e8));printf(k%d\n, k);kn/6;numm/4;for(jk;jn;jjk){printf((1.25,%.3f), y%f, err%.4e.\n,y[j],u[num][j],fabs(exact(x[num],y[j])-u[num][j]));}num3*m/4;for(jk;jn;jjk){printf((1.75,%.3f), y%f, err%.4e.\n,y[j],u[num][j],fabs(exact(x[num],y[j])-u[num][j]));}for(i0;im;i){free(u[i]);free(v[i]);free(lambda[i]);}free(u);free(v);free(lambda);free(x);free(y);free(d);return 0;
}double f(double x, double y)
{double temp1, temp2, z;temp1x*x;temp2y*y;ztemp12*temp2;return (4*temp2-2*temp1)/(z*z);
}
double lambda_function(double x, double y)
{return 1.0;
}
double phi1(double y)
{double z;z1.02*y*y;return 2.0/z-log(z);
}
double phi2(double y)
{double z;z2y*y;return 2.0/zlog(2*z);
}
double psi1(double x)
{return -2*log(x);
}
double psi2(double x)
{double z;zx*x18.0;return 12.0/zlog(z);
}
double exact(double x, double y)
{return log(x*x2*y*y);
} 3.2 计算结果 当m20n30时计算结果为
m20, n30
k4470
(1.25,0.500), y0.723996, err7.7043e-05.
(1.25,1.000), y1.270860, err3.9760e-04.
(1.25,1.500), y1.802391, err2.6918e-04.
(1.25,2.000), y2.257989, err1.3972e-04.
(1.25,2.500), y2.643565, err5.3582e-05.
(1.75,0.500), y1.270387, err7.5935e-05.
(1.75,1.000), y1.622151, err2.9080e-04.
(1.75,1.500), y2.023479, err2.7756e-04.
(1.75,2.000), y2.403726, err1.6475e-04.
(1.75,2.500), y2.744937, err7.3239e-05. 当m40n60时计算结果为
m40, n60
k16565
(1.25,0.500), y0.723937, err1.8621e-05.
(1.25,1.000), y1.270562, err9.9132e-05.
(1.25,1.500), y1.802189, err6.7202e-05.
(1.25,2.000), y2.257884, err3.4879e-05.
(1.25,2.500), y2.643525, err1.3353e-05.
(1.75,0.500), y1.270443, err1.9346e-05.
(1.75,1.000), y1.621933, err7.2431e-05.
(1.75,1.500), y2.023271, err6.9315e-05.
(1.75,2.000), y2.403602, err4.1144e-05.
(1.75,2.500), y2.744882, err1.8266e-05.