/* fem_checknl_la.c try to solve non linear second order equation * u^2 u'' + 2 u u' + 3u = (41/3)-(2116/9)x+(4780/3)x^2-(48976/9)x^3+ * 9984x^4-(88064/9)x^5+(14336/3)x^6-(8192/9)x^7 * with boundary u(0)=1, u(1)=1 0 < x < 1 * try 10 points, only 0.85 max error, try 20 * 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[1600]; /* i*n+j */ static double xg[40]; static double u[40]; static double f[40]; static double Ua[40]; /* forcing function */ #define F(x) ((41.0/3.0)-(2116.0/9.0)*x +(4780.0/3.0)*x*x -(48976.0/9.0)*x*x*x + \ 9984.0*x*x*x*x-(88064.0/9.0)*x*x*x*x*x + \ (14336.0/3.0)*x*x*x*x*x*x -(8192.0/9.0)*x*x*x*x*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) (phi(x,j,n-1,xg)*phi(x,j,n-1,xg)*phipp(x,j,n-1,xg)+ \ 2.0*phi(x,j,n-1,xg)*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_checknl_la.c running \n"); printf("Given x^2 u''(x) + 2x u'(x) + 3u(x) = \n"); printf(" big equation \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 */