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

 
 
 
日一二三四五六
       
       
       
       
       
       

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

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

本吧签到人数:0

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

  • 图片

  • 精品

  • 游戏

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

数值求解微分方程,出现发散,求助

  • 只看楼主
  • 收藏

  • 回复
  • 我是顾小白
  • 列表操作
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我利用MMA数值求解一维谐振子基态波函数:y''[x] == (x^2 - 1) y[x];其中物理参量已取为1
基态波函数本应该是高斯函数,在x较大的地方函数应该是0,但是 数值求值的后,出现这样的问题:


  • 我是顾小白
  • 列表操作
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
现在只是计算到了(-6,6)的范围,如果扩大取值范围将会发散的更大。但是这与理论不符合啊,那个微分方程是有精确解就是高斯函数的啊!!当然如果只是取(-5,5)的范围那这个结果是对的,我就是想问问为什么后面会发散掉呢??


  • xzcyr
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
……有意思,好像还是第一次见到误差累积这么厉害的常微分方程。对于数值解,目前我能找到的唯一的解决方法,是增加WorkingPrecision:
l = 10;

s = NDSolve[{y''[x] == (x^2 - 1) y[x], y[0] == 1, y'[0] == 0},
y, {x, -l, l}, WorkingPrecision -> 40];
Plot[y[x] /. s, {x, -l + 1, l - 1}, PlotRange -> All]


图没啥意思,就不贴了。这个方法成本无疑不低,但是我一时没想到更好的方法。楼主有兴趣继续探究的话,不妨来这里问问:http://mathematica.stackexchange.com/


  • xzcyr
  • 吧主
    14
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
想到了一个要多费点功夫但是稳定的做法。会想到这个是因为想起来指数函数在数值计算的时候常引发大误差,那么,换元:


l = 50;
rule = y -> (Exp[z@#] &);
sol = NDSolveValue[{y''[x] == (x^2 - 1) y[x], z[0] == 0, y'[0] == 0} /. rule, z, {x, 0, l}];
Plot[Exp@sol[x], {x, 0, l}, PlotRange -> All]


注意这里面有个比较麻烦的点,就是边界条件换元之后NDSolve没法直接识别,应该是因为NDSolve解析条件的时候用了复数域,但是我们其实只是想在实数域上换元,而NDSolve目前又没有数域的选项,所以嘛……我这里图方便就直接把z[0]==0写进去了。


至于这个方法是否可以推广……我就不清楚了。


扫二维码下载贴吧客户端

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