网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
05月30日漏签0天
mathematica吧 关注:19,809贴子:73,848
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 2回复贴,共1页
<<返回mathematica吧
>0< 加载中...

NDSolve中的1/0不定式问题

  • 只看楼主
  • 收藏

  • 回复
  • Repentanze
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Clear["Global`*"];
delta[a_] := Z^2*(1 - 2 a)/(a*(Z + 1));
a11[a_] := (3*Pi/32)*(288 + 604*Sqrt[2]*delta[a] + 217*delta[a]^2)/
4/(72 + 61*Sqrt[2]*delta[a] + 16*delta[a]^2);
dc[a_] :=
Piecewise[{{1,
a <= 0}, {a11[a]/(1 - a*(2 - mi/mI*(Z + 1)))/(a*(Z - 1) + 1),
a > 0 && a <= 1/2}, {dc[1/2], a > 1/2}}];
dp[a_] := dc[a]*a*(1 - 2 a)*(Z - 1)^2/(Z - a*(Z - 1));
D0 = 278*4/100*Sqrt[2]*5^(5/2)/(2*1.81)*(Z + 1)/Z^2;
(*cm^2/s*)
Z = 6;
mi = 2; mI = 36;
a0[z_] := Piecewise[{{1/2, z < 0}, {0, z >= 0}}];
sol = NDSolve[{D[a[z, t], t] ==
D[D0*(dc[a[z, t]] + dp[a[z, t]])*D[a[z, t], z], z],
a[-100, t] == 1/2, a[100, t] == 0, a[z, 0] == a0[z]},
a, {z, -100, 100}, {t, 0, 3}]
这是一个扩散方程的数值求解。
在NDSolve的过程中,会遇到Divide:碰到无穷表达式1/0. 这个问题很显然来自dc[a],当我将其设置为常数时可以得到很好的解。
具体原因应该是dc[a]中的delta[a]在a=0时分母为0。然而事实上,在[0,1/2]的定义域上,dc[a]的原始定义(也就是我分段函数中的中间那段)的表现都是良好的,画图也可以看出dc[0]=1;
我尝试将dc[a]设置为分段函数来解决这个问题,然而并没有作用。有什么好的办法来解决这个问题?我能想到把dc[a]手动插值一遍,但是既然dc[a]本身表现良好,我想应该有更好的办法。


  • Repentanze
  • For循环
    7
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
自己找到了一个办法:
既然dc[0]有确定值,那么总可以通过化简的方法把分母变成非0值。
dc[a_] :=
FullSimplify[a11[a]/(1 - a*(2 - mi/mI*(Z + 1)))/(a*(Z - 1) + 1)];
解决了。


2025-05-30 16:27:30
广告
  • xzcyr
  • 吧主
    15
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你前一个思路其实也是行得通的,只要用 Simplify`PWToUnitStep 展开第一个方程里的分段函数就行了:
sol = NDSolve[{D[a[z, t], t] == D[D0*(dc[a[z, t]] + dp[a[z, t]])*D[a[z, t], z], z] //
Simplify`PWToUnitStep, a[-100, t] == 1/2, a[100, t] == 0, a[z, 0] == a0[z]},
a, {z, -100, 100}, {t, 0, 3},
Method -> {"MethodOfLines",
"SpatialDiscretization" -> {"TensorProductGrid", "MaxPoints" -> 25(*稍微降了下点数,你可以改个自己喜欢的*),
"MinPoints" -> 25, "DifferenceOrder" -> 2}}]
这其实是NDSolve的一个bug。个人推测可能是NDSolve的预处理器没有考虑“Piecewise不具备Listable属性”这一点。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 2回复贴,共1页
<<返回mathematica吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示