/* fem_check13_la.c solve linear second order equation * x^2 u'' + 2 x u' + 3u =3 -(100/3)*x +108*x^2 -80*x^3 * with boundary u(0)=1, u(1)=1 0 < x < 1 * try 10 points * simple integration */ #include #include #include #include "laphi.h" #include "simeq.h" #undef abs #define abs(x) ((x)<0.0?(-(x)):(x)) #undef min #define min(a,b) ((a)<(b)?(a):(b)) #undef max #define max(a,b) ((a)>(b)?(a):(b)) static double k[400]; /* i*n+j */ static double xg[20]; static double u[20]; static double f[20]; static double Ua[20]; /* forcing function */ #define F(x) (3.0 -(100.0/3.0)*x +108.0*x*x -80.0*x*x*x) /* exact solution for checking */ #define U(x) (1.0 -(20.0/3.0)*x +12.0*x*x -(16.0/3.0)*x*x*x) /* Galerkin phi substituted for u */ #define gal(x) (x*x*phipp(x,j,n-1,xg)+2.0*x*phip(x,j,n-1,xg)+3.0*phi(x,j,n-1,xg)) int main(int argc, char *argv[]) { int i, j, n; double xmin = 0.0; double xmax = 1.0; double x, h, hi; double val, err, avgerr, maxerr; int p, np; printf("fem_check13_la.c running \n"); printf("Given x^2 u''(x) + 2x u'(x) + 3u(x) = \n"); printf(" 3 -(100/3)*x +108*x^2 -80*x^3 \n"); printf(" 0maxerr) maxerr = err; avgerr = avgerr + err; printf("u[%d]=%7.4f, Ua=%7.4f, err=%g \n", i, u[i], Ua[i], u[i]-Ua[i]); } printf(" maxerr=%g, avgerr=%g \n", maxerr, avgerr/(double)n); printf("\n"); return 0; } /* end main of fem_check13_la.c */