// file CC-CG-OS.edp // // OPTIMAL CONTROL OF A CAPACITOR -- CONJUGATE GRADIENT WITH OPTIMAL STEP (AND PROJECTION) // verbosity=0; // // NUMERICAL VALUES TO PROVIDE // int C0=100, C1=99, C2=98; // the labels int itermax=500; real umin=0., umax=2.; real acoef=.99, one=1., yd0=1.; // good values of acoef: .2, .3, .4 real gamma, rhofix=1.; real[int] Uerror(1000); real errGO=1.e-5, errmesh=1.e-1; // // AUXILIAR VARIABLES // int kiter=0, jiter=0, nmesh=1, itermm1=itermax-1; real bcoef=1.-acoef, abc=rhofix*one, rho=rhofix, error, aux0, aux1, aux2, xnor2, xnorn2; // real abcoef=acoef/bcoef; // // DESCRIPTION OF THE BOUNDARIES // // outer boundary ($\Gamma_0$): border C00(t=0,2*pi){x=5*cos(t); y=5*sin(t); label=C0;} // inner boundary ($\Gamma_1$): border C11(t=0.,1.){ x=2.-t; y=3.; label=C1;} border C12(t=0.,1.){ x=1.; y=3.-6.*t; label=C1;} border C13(t=0.,1.){ x=1.+t; y=-3.; label=C1;} border C14(t=0.,1.){ x=2.; y=-3.+6.*t; label=C1;} // // FIGURES (I) // // boundaries: plot ( C00(50) + C11(5)+C12(20)+C13(5)+C14(20), wait=true); // // MESH // mesh Th=buildmesh( C00(50) + C11(5)+C12(20)+C13(5)+C14(20)); // // FIGURES (II) // // initial mesh: plot(Th, cmm=" FIRST MESH", wait=true); // // THE FINITE ELEMENT SPACE AND FUNCTIONS // //fespace Vh(Th,P1); fespace Vh(Th,P2); // Vh u=0.,v,fff,f0=f00,u0=u00,uold,udif; Vh ystate, pstate, zeta, sol, phi, yd; Vh un=0., u, des, desn, gr, grn, udif, fff; int iref0=Th(2.1,3.1).region; int iref1=Th(1.9,2.9).region; // // SOME FUNCTIONS // func unom=one*(region==iref1); func abom=abc*(region==iref1); func ydfun=yd0*(x*x-y*y); yd=ydfun; plot(yd, cmm="TARGET STATE", value=true,fill=true, wait=true); // ------------------------------------- // THE SYSTEMS // ------------------------------------- problem states(sol,phi,init=jiter)=int2d(Th)(dx(sol)*dx(phi)+dy(sol)*dy(phi)) - int2d(Th)(fff*phi) + on(C0,sol=0.); // ------------------------------------- // ------------------------------------- // THE FIRST PROJECTOR // ------------------------------------- // gvec=max(fvec,umin) // func real[int] PUad(real[int] & fvec) { real[int] gvec(fvec.n); for (int ifv=0;ifv> u[] ; // } // close reading file (end block) kiter1=kiter+1; for (int k=0;k 1) { aux=log(Uerror[kiter-1]/Uerror[kiter])/log(2.); cout << " FIXED-POINT RATE= " << aux << endl; } // // FIGURES (III) // // the solution: plot(u, wait=true, value=true, fill=true); // plot(u, wait=true, value=true, fill=true, ps="nonsymsol.eps"); */