// file CH-FP.edp // // OPTIMAL CONTROL FOR THE HEAT PDE - FIXED-POINT ALGORITHM // verbosity=0; // // NUMERICAL VALUES TO PROVIDE // real T=10.; real kappa=1., y00=1.; int C0=100, C1=99, C2=98; // the labels int Ntimes=20; real umin=0., umax=100.; real acoef=.75, one=1., yd0=1.; // good values of acoef: <= .75 real errFP=1.e-5, errmesh=1.e-2; int itermax=500; // // AUXILIAR VARIABLES // int kiter=0, jiter=0, nmesh=1, itermm1=itermax-1, Nt1=Ntimes+1; real tau=T/Ntimes, xnu=kappa*tau, bcoef=1.-acoef, abcoef=acoef/bcoef, abc=abcoef*one, error, errn; real[int] Uerror(1000); // // 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, sol, phi, yd; Vh udif, fff; Vh[int] un(Nt1), u(Nt1); for (int n=0;n0;n--) { states; pstate=sol; plot(pstate, cmm="ADJOINT STATE - ITERATE "+kiter, value=true, fill=true, wait=false); u[n]=-abom*pstate; // u[n][]=PUad(u[n][]); udif = u[n]-un[n]; errn = udif[].l2; error=error+errn*errn; fff=pstate; } plot(pstate, cmm="ADJOINT STATE - ITERATE "+kiter, value=true, fill=true, wait=true); for (int n=1;n<=Ntimes;n++) { plot(u[n], cmm="CONTROL - ITERATE "+kiter, value=true, fill=true, wait=false); } plot(u[Ntimes], cmm="CONTROL - ITERATE "+kiter, value=true, fill=true, wait=true); error=sqrt(error); Uerror[kiter]=error; cout << " ITER = " << kiter << " ERROR = " << error << endl; if (error <= errFP) break; /* if ((kiter+1) % 100 == 0) { nmesh = nmesh+1; jiter = -1; Th = adaptmesh(Th,u,err=errmesh); plot(Th, cmm=" MESH NO. "+nmesh, wait=true); u=u; }; */ if (kiter == itermm1) cout << " ATTENTION: TOO MANY ITERATES" << endl; for (int n=1;n<=Ntimes;n++) { un[n]=u[n]; } jiter = jiter+1; } // // DISPLAY, RECORD AND PRINT // for (int n=0;n> 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"); */