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;
现在我改变了上面的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 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
答案 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
我们甚至可以在r
和theta
的某些条件下获得结算的封闭表单。
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
中简化或组合它们。这不会影响上述结果。