如何在Maple中使用分段边界条件解决磁盘上的Laplace PDE?

时间:2018-03-10 04:05:22

标签: maple

Windows上的Maple 2017.3,当边界条件f(theta)作为通用函数(未定义)给出时,能够在磁盘上解决Laplace PDE。

但是当我使用分段定义f(theta)时,由于某种原因它不能解决PDE问题。谁知道为什么?我做错了吗?

这是MWE,显示它可以解决半径为1的磁盘上的PDE,边界条件具有通用f(theta)

restart;
pde:= diff(u(r,theta),r$2)+1/r*diff(u(r,theta),r) + 1/r^2* diff(u(r,theta),theta$2)=0;
bc:= u(1,theta)=f(theta), 
     u(r,0)=u(r,2*Pi),
     D[2](u)(r,0)=D[2](u)(r,2*Pi);
sol:= pdsolve([pde,bc],u(r,theta)) assuming r<=1  and theta>=0 and theta<2*Pi;

Mathematica graphics

现在我改变了上面的f(theta),并给它一个特定的功能,这是分段的。现在它没有解决它

restart;
f:=theta->piecewise(theta>=0 and theta<=Pi,20,
                    theta>Pi and theta<2*Pi,0);
pde:= diff(u(r,theta),r$2)+1/r*diff(u(r,theta),r) + 1/r^2* diff(u(r,theta),theta$2)=0;
bc:= u(1,theta)=f(theta), 
     u(r,0)=u(r,2*Pi),
     D[2](u)(r,0)=D[2](u)(r,2*Pi);
sol:= pdsolve([pde,bc],u(r,theta)) assuming r<=1 and theta>=0 and theta<2*Pi;

Mathematica graphics

我做错了吗?有工作吗?

作为参考,Mathematica 11.2可以解决这个问题:

ClearAll[u,r,θ]
pde=D[u[r,θ],{r,2}]+1/r D[u[r,θ],r]+1/r^2 D[u[r,θ],{θ,2}]==0
bc=Piecewise[{{20,0<θ<Pi},{0,Pi<θ<2Pi}}]
sol=DSolve[{pde,u[1,θ]==bc},u[r,θ],r,θ];
sol=sol/.K[1]->n

Mathematica graphics

1 个答案:

答案 0 :(得分:1)

那么为什么不从pdsolve获取未分配f的结果,然后替换piecewise

restart;

pde:= diff(u(r,theta),r$2)+1/r*diff(u(r,theta),r) + 1/r^2* 
diff(u(r,theta),theta$2)=0:
bc:= u(1,theta)=f(theta), 
     u(r,0)=u(r,2*Pi),
     D[2](u)(r,0)=D[2](u)(r,2*Pi):

sol:= rhs(pdsolve([pde,bc],u(r,theta)))
      assuming r<=1 and theta>=0 and theta<2*Pi:

lprint(sol);
   (1/2)*(2*(Sum(r^n*((Int(f(theta)*sin(n*theta), theta = 0 .. 
   2*Pi))*sin(n*theta)+(Int(f(theta)*cos(n*theta), theta = 0 .. 
   2*Pi))*cos(n*theta))/Pi, n = 1 .. infinity))*Pi+Int(f(theta), theta = 0 .. 2*Pi))/Pi

F:=theta->piecewise(theta>=0 and theta<=Pi,20,
                    theta>Pi and theta<2*Pi,0):

下面我们将subs(f=(F),sol)用于pde解决方案,并将分段F替换为未分配的名称f

让我们在特定点计算sol

sol_spec:=simplify(combine(eval(subs(f=(F),sol),[r=1/2,theta=Pi/3]))):

value(sol_spec): # symbolic summation and symbolic integration

lprint(%);
   (1/2)*((80/3)*Pi+40*arctan((1/5)*3^(1/2)))/Pi

evalf(%);
                      15.45628948

evalf(sol_spec); # numeric summation and numeric integration
                      15.51328895

我们可以在sol中解析积分并获得求和形式(如Mma所述)。

T:=subs(f=F,subsindets(sol,specfunc(Int),IntegrationTools:-Split,Pi)):
ans:=simplify(eval(T,Int=int)):

lprint(%);
   10+Sum(20*sin(n*theta)*(r^n-(-r)^n)/(n*Pi), n = 1 .. infinity)

在与以前相同的特定点评估它。

ans_spec:=(eval(ans,[r=1/2,theta=Pi/3])):

value(ans_spec): # symbolic summation

lprint(%);
   40/3+20*arctan((1/5)*3^(1/2))/Pi

evalf(%);
                      15.45628948

evalf(ans_spec); # numeric summation
                      15.51328895

我们甚至可以在rtheta的某些条件下获得结算的封闭表单。

huh:=evalc(subsindets(ans,specfunc(Sum),
                      u->sum(op(u),formal)))
     assuming r>0, r<1, theta>0, theta<Pi:

lprint(huh);
   10+20*arctan(sin(theta)*r/(1-cos(theta)*r))/Pi+20*arctan(sin(theta)*r/(1+cos(theta)*r))/Pi

eval(huh,[r=1/2,theta=Pi/3]):

lprint(%);
   40/3+20*arctan((1/5)*3^(1/2))/Pi

evalf(%);
                      15.45628948

请注意,在组合符号arctan调用时存在一个错误(已经报告),这使我无法在上面的huh中简化或组合它们。这不会影响上述结果。