# Blank plot is returned when trying to use Manipulate[Plot3D…] on the output function of NDSolve

I am currently trying to solve a transient cylindrical diffusion problem with space variable (r,z). Using NDSolve, I get a certain Interpolation function but I can't plot it no matter what I try.

Here is my code :


ClearAll["Global*"]
r0 = 0.5;
h = 1;

eq1 = D[u[t, r, z],
t] - (D[u[t, r, z], r, r] + 1/r*D[u[t, r, z], r] +
D[u[t, r, z], z, z]);

ic = {u[0, r, z] == 0};

bc = {u[t, r0, z] == 0,
u[t, 1, z] == 0, (D[u[t, r, z], r] /. r -> r0) ==
0, (D[u[t, r, z], r] /. r -> 1) == 1, u[t, r, 0] == u[t, r, h]};

sol = NDSolve[{eq1 == 0, ic, bc},
u[t, r, z], {t, 0, 10}, {r, r0, 1}, {z, 0, h},
MaxSteps -> Infinity , MaxStepFraction -> 1/10]

f[t_, r_, z_] := u[t, r, z] /. First[sol];

Manipulate[Plot3D[f[t, r, z], {t, 0, 10}, {r, r0, 1}], {z, 0, 1}]



I do end up with the error NDSolve::ibcinc: Warning: boundary and initial conditions are inconsistent. but I think it arises from the approximations of NDSolve, so I dismissed it.

I tried looking for a solution online. I noticed that most blank plots like mine end up being the result of what they call "scoping" errors. From what I gathered, for instance from this, a solution can be found if you correctly define the function that you wish to plot, so that the variables don't end up being local variables in Manipulate.

Therefore, I have tried to define a function from the output of NDSolve using this question as an example.

But even with my definition of the function f, it appears that nothing is being plotted. What am I doing wrong ? Can someone please enlighten me ?

This fixes the plotting issue, but you will have to think about boundary and initial conditions and make them consistent.

ClearAll["Global*"]
r0 = 0.5;
h = 1;

eq1 = D[u[t, r, z],
t] - (D[u[t, r, z], r, r] + 1/r*D[u[t, r, z], r] +
D[u[t, r, z], z, z]);

ic = {u[0, r, z] == 0};

bc = {u[t, r0, z] == 0,
u[t, 1, z] == 0, (D[u[t, r, z], r] /. r -> r0) ==
0, (D[u[t, r, z], r] /. r -> 1) == 1, u[t, r, 0] == u[t, r, h]};

sol = NDSolveValue[{eq1 == 0, ic, bc},
u, {t, 0, 10}, {r, r0, 1}, {z, 0, h}, MaxSteps -> Infinity,
MaxStepFraction -> 1/10];
Manipulate[Plot3D[sol[t, r, z], {t, 0, 10}, {r, r0, 1}], {z, 0, 1}]

• Wow, the answer seems so simple. So if i want to use manipulate and plot the result it would be in my best interest to use NDSolveValue instead of NDSolve, and directly use sol in Plot3D ? In any case, thank you for the answer. – ConfuzzledStudent Jun 15 '20 at 14:37
• You get the same result with NDSolve, if you use Set (=) instead of SetDelayed (:=) in definition of f f[t_, r_, z_] = u[t, r, z] /. First[sol];  . – Akku14 Jun 15 '20 at 14:43
• @Akku14 it does indeed also fix the problem. I was not aware of the problems that could arise from using SetDelayed instead of Set. Thanks a lot. – ConfuzzledStudent Jun 15 '20 at 14:55