# 1D transient heat equation problem with controller

I would appreciate some help with following issue:

I am trying to solve a 1D transient heat equation problem with a control loop in order to compensate a time variable boundary condition at one extremity, so that the temperature at the other extremity stays stable around 25.

$u(t,x)$ obeys to following PDE on a x-line from 0 to 10:

$u^{(0,1)}(x,t)=u^{(2,0)}(x,t)+ \operatorname{compensator}(t)$,

with:

Initial condition: $u(0,x)=25$
Boundary conditions: $u(t,0)=25+ 3 \sin \left(\frac{t}{50}\right)$ and $u^{(0,1)}(t,10)=0$

the compensator is the output from a P-controller: $\operatorname{compensator}(t)=-0.05(u(t, 10) - 25)$
If that works, I would then like to try with a PI or PID-controller.

Here is the code I have tried in Mathematica 11 (just replace 0 by 1 before 0.05 to activate the controller and get the error):

sol = NDSolveValue[{D[u[t, x], t] == 0.5*D[u[t, x], x, x] - 0*0.05*(u[t, 10] - 25),
u[0, x] == 25,
u[t, 0] == 25 + 3*Sin[t/50],
(D[u[t, x], x] /. x -> 10) == 0},
u,{t, 0, 1000}, {x, 0, 10}]

{Plot3D[sol[t, x], {t, 0, 1000}, {x, 0, 10}, PlotRange -> All,
AxesLabel -> {"Time", "x"}, PlotLegends -> {"usol(t,x)"}, PlotTheme ->"Detailed",ImageSize -> 300],

Plot[Evaluate[sol[t, x] /. x -> {0, 10}, {t, 0, 1000}],ImageSize -> 300,   PlotLegends -> Table[Style[StringJoin["x=", ToString[i]],
FontSize -> 12, FontFamily -> "Cambria Math"], {i, {0, 10}}],
PlotStyle -> Table[RGBColor[0.1, j, 0.5], {j, 0, 1, 1/2}], PlotTheme ->"Detailed",
PlotRange -> All, FrameLabel -> {Style["Time", 12, FontFamily -> "Cambria Math"]}]}

• Maybe this is useful. – user21 May 11 '17 at 15:49
• Delay partial differential equations are not supported – David Baghdasaryan May 11 '17 at 16:27
• @DavidBaghdasaryan, what makes this a delay PDE? I fail to see that. – user21 May 11 '17 at 18:27
• You can solve this problem by discretizing space and using the method of lines. I don't have time now to write this explicitly, but perhaps you can get the idea from this (note that in the example there they discretize time and not space and you need to do the opposite). – yohbs May 11 '17 at 21:11
• NDSolve is just moody today.... – user21 May 11 '17 at 21:39

Here is a way to do it:

f[tt_?NumericQ, u_] := If[tt <= 0., 25, u /. {t -> tt, x -> 10}]
sol = NDSolveValue[{D[u[t, x], t] ==
0.5*D[u[t, x], x, x] - 0.05*(f[t, u[t, x]] - 25), u[0, x] == 25,
u[t, 0] == 25 + 3*Sin[t/50], (D[u[t, x], x] /. x -> 10) == 0},
u, {t, 0, 1000}, {x, 0, 10}]


Which gives me these plots: • Thanks for the amazing f(t,u(t,x))-trick, this kind of thing always looks to me like pulling a rabbit out of a hat. I'll try with PI and PID-controller now. – daklems May 12 '17 at 6:51