My question is related to this former question (1D transient heat equation problem with controller), which has already been solved, but the issue is now a different one.

In the already solved question, the controller was acting globally on the bar, compensating perturbations occurring at the left boundary x=0.

Now I would like to implement a controller acting at the left boundary x=0, in order to compensate global perturbations on the bar, so that the temperature at the right boundary x=10 stays constant 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{perturbations}(t)$,


$\operatorname{perturbations}(t)=0,1 \sin \left(\frac{t}{50}\right)$


Initial condition: $u(0,x)=25$
Boundary conditions: $u(t,0)=25-Kp*(u(t, 10) - 25)$ and $u^{(0,1)}(t,10)=0$

Here is the code I have tried in Mathematica 11. Just replace 0 by 1 before Kp to activate the controller and get the error, which is now:

NDSolveValue::bcedge: Boundary condition u[t,0]==25-2 (-25+u[t,10]) is not specified on a single edge of the boundary of the computational domain.

Kp = 2;
sol = NDSolveValue[{D[u[t, x], t] == 0.5*D[u[t, x], x, x] + 0.1*Sin[t/50],
u[0, x] == 25,
u[t, 0] == 25 - 0*Kp ((u[t, x] /. x -> 10) - 25),
(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"]}]}
  • $\begingroup$ Apparently the problem is that the boudarry condition for u(t,x) at x=0 is linked to the value of u(t,x) at x=10. Does anyone have some idea how to solve this issue? Would really appreciate some help with that. $\endgroup$
    – daklems
    Jun 17, 2017 at 12:58

1 Answer 1

tEnd = 1000;

pde = {D[u[t, x], t] == 0.5 D[u[t, x], {x, 2}] + 0.25 Sin[t/50] + 
 NeumannValue[0, x == 10]};

Mathematica doesn't like the mixed BCs but you can approximate the measurement with this integral

c[x_]:= 1/m Piecewise[{{1,10-m<=x<=10}},0]
bc = {DirichletCondition[
u[t, x] == Kp(25 - Integrate[u[t, xx] c[xx], {xx, 0, 10}]), 
x == 0]};

I basically approximate the measurement for the controller through the mean value over a small region.


If I compute the solution Mathematica still complains but it works


The plot looks OK to me.


But I think Mathematica doesn't understand the Diriclet BC right because Kp has no effect on the response.

enter image description here


I got the same result with the normal BC

bc = {DirichletCondition[u[t, x] == Kp (25 - u[t, 10]), x == 0]};

If you change the IC to


you see the controller in action

enter image description here

  • $\begingroup$ since then I have been using the feedbackcontrol-functions after discretising the model in the x-component and building a state space model with a state for the temperature at each discrete x-position. Still thanks for your effort! $\endgroup$
    – daklems
    Sep 29, 2017 at 17:16

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.