我正在尝试使用 Maple 程序求解以下 ODE:
这个 ODE 可以很容易地在区间 [0,1/2] 上解析求解,解由下式给出
现在,使用 Maple,我得到了
restart;
ODE := diff(y(x),x$2)*x*abs(ln(x))-2*diff(y(x), x)=0:
initialPosition := y(0) = 0;
initialVelocity := D(y)(1/2) = 1;
solution := dsolve({ODE, initialPosition, initialVelocity})
这给了我与之前找到的相同的解决方案。然而,当我尝试以数值方式找到解决方案时:
solution_num := dsolve({ODE, initialPosition, initialVelocity}, numeric)
,程序显示如下错误
据我了解,Maple 将 ODE 与初始条件 0(y(0) = 0)一起离散化的方式会产生错误,因为程序无法处理方程中出现的 log(0) 的奇点。他们建议使用另一种类型的离散化来规避这个单一端点:中点方法。由于我刚刚开始使用 Maple 并且对 ODE 离散化不太满意,所以我想知道是否有一个函数实现这样的算法来解决我的问题。任何帮助将不胜感激。
restart;
ODE:=diff(y(x),x$2)*x*abs(ln(x))
-2*diff(y(x),x)=0:
initPos:=y(0)= 0:
initVel:=D(y)(1/2)=1:
sol:=dsolve({ODE,initPos,initVel})
assuming x>0,x<1;
y(x) = (-x/ln(x)-Ei(1,-ln(x)))*ln(2)^2
我将这种样式等放在精确解的图上,以便它可以很好地与数值解的图重叠。
P1:=plot(eval(y(x),sol),x=0 .. 0.5,
adaptive=false,numpoints=11,
color=blue,style=point,
symbol=solidcircle,symbolsize=20):
现在,数值解。
numsol:=dsolve({ODE,initPos,initVel},numeric,
method=bvp[midrich],
maxmesh=10^4,abserr=5e-4):
P2:=plot(X->eval(y(x),numsol(X)),0 .. 0.5):
现在让我们一起来看看吧。
plots:-display(P1,P2);
另一种(有点高级的)绘制由
dsolve(...,numeric)
返回的结果的方法。
plots:-odeplot(numsol,[x,y(x)],x=0 .. 0.5);