I have problem with my PDE. The problem is as bellow:
I used "WhenEvent" operator to solve it. The code is:
a = 255
b = 2.5
heat1 = NDSolveValue[{D[u[t, x],
t] - (0.0000001 D[u[t, x], x, x] + b*Exp[a *x]) ==
NeumannValue[0, True] + NeumannValue[-7 (u[t, x] - 25), x == .05],
u[0, x] == 25,
WhenEvent[
u[t, x] > 250, {a = 0.01*a, b = .2 b, "RestartIntegration"}]},
u, {t, 0, 600}, {x, 0, .05},
Method -> {"MethodOfLines", "TemporalVariable" -> t,
"SpatialDiscretization" -> {"FiniteElement",
"MeshOptions" -> {"MaxCellMeasure" -> {"Length" -> 0.001}}}}]
pa = Plot[Evaluate[heat1[t, 0.05]], {t, 0, 600}, PlotRange -> All,
AxesLabel -> {t, "T(.05,t)"}]
After running this code, I got the following errors.
" NDSolveValue::nbnum1: The function value InterpolatingFunction[{{0.,0.05}},{5,4225,0,{101},{3},0,0,0,0,Automatic,{},{},False},{<<1>>},{25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,<<15>>,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,25.,<<51>>},{Automatic}][x]>250 is not True or False when the arguments are {0.,{<<1>>},{2.50058,3.22634,4.16337,5.37266,6.93321,8.94703,11.5458,14.8994,<<36>>,186525.,240704.,310619.,400841.,517266.,667489.,<<51>>}}. >>
General::stop: Further output of NDSolveValue::nbnum1 will be suppressed during this calculation. >> "
How can I fix it? Thank you
Answer
The following illustrates how to use WhenEvent
, but I had to change the NeumannValue
at x == 0.05
to produce a well-behaved solution.
tmax = .01;
heat1 = NDSolveValue[{D[u[t, x], t] - (0.0000001 D[u[t, x], x, x] + b[t]*Exp[a[t] *x]) ==
NeumannValue[0, x == 0] + NeumannValue[0 , x == 1/20],
u[0, x] == 25, a[0] == 255 , b[0] == 2.5,
WhenEvent[u[t, 1/20] > 250, {a[t] -> 0.01*a[t], b[t] -> .2 b[t]}]},
{u, a, b}, {t, 0, tmax}, {x, 0, 1/20},
Method -> {"MethodOfLines", "TemporalVariable" -> t,
"SpatialDiscretization" -> {"FiniteElement",
"MeshOptions" -> {"MaxCellMeasure" -> {"Length" -> 0.001}}}},
DiscreteVariables -> {a, b}];
Plot[Evaluate[heat1[[1]][t, 1/20]], {t, 0, tmax}, PlotRange -> All,
AxesLabel -> {t, "T(.05,t)"}]
LogPlot[heat1[[2]][t], {t, 0, tmax}, PlotRange -> All, AxesLabel -> {t, "a"}]
The second plot, added for convenience, shows the history of a
.
The revised question has a rather different answer.
tmax = .001;
heat2 = NDSolveValue[{D[u[t, x], t] == 0.0000001 D[u[t, x], x, x] +
Piecewise[{{2.5 Exp[255 x], u[t, x] < 250}}, .5 Exp[2.55 x]] ,
u[0, x] == 25, (D[u[t, x], x] /. x -> 0) == 0,
(D[u[t, x], x] /. x -> 1/20) == 7 (u[t, 1/20] - 25)},
u, {t, 0, tmax}, {x, 0, 1/20}];
Plot[heat2[t, 1/20], {t, 0, tmax}, PlotRange -> All, AxesLabel -> {t, "T(.05,t)"}]
Perhaps more illustrative is
Plot3D[Evaluate[heat2[t, x]], {t, 0, tmax}, {x, 0, 1/20}, PlotRange -> All]
Note that the "FiniteElement" Method
has been deleted, because it is incompatible as implemented in Mathematica 11.0.1 with the use of Piecewise
, If
, etc.
Comments
Post a Comment