作业帮 > 语文 > 作业

【Mathematica】这个方程哪错了?

来源:学生作业帮 编辑:拍题作业网作业帮 分类:语文作业 时间:2024/05/03 14:54:03
【Mathematica】这个方程哪错了?
G = 6.67*10^-11;
B = 1.23*10^10;
NDSolve[{m[r] m'[r]^(2/3) (2 r m''[r] - m'[r]) == 4 B/(3 G) r^(19/3) ,m[2] == 2,m[1] == 1},m[r],{r,1,2}]
为什么会encounter 1/0?
周六到了,那就来答这个题吧.

首先这里需要声明的是,我没能解出你的方程,但我大致知道你的方程为什么不好解,我接下来的答案将会指出这一点.我相信,只要你运用我将要讲述的内容,结合你对这个方程物理背景的了解,你还是有可能把它修改到可以求解的.

@yang_bigarm (好吧我知道百度知道没有@的功能……)认为这个方程的求解是因为G和B的数值过分极端.这的确是一个原因,G和B的极端数值确实使问题变得更严重了,但是这并非最关键的原因.事实上精度调节并不能解决这里的问题.最简单的验证方法,是把G和B的值都改成1,然后你会发现,你的问题依然存在.

你所遇到的问题,其实是在非线性常微分方程(或方程组)的边值问题求解中非常常见的一类问题,我在百度知道和Stackexchange都见过很多次,当然,我也很缺乏微分方程的理论知识,所以在此并不能对这类问题发生的根本原因做出什么解释,但是,我知道,这类问题的求解,通常只有一个有效的(并且常常需要精确调节的)方法,那就是,打靶法(Shooting Method).

所谓打靶法,简单地说,就是试探性地给出一组某一个边界上的函数值及导数值,然后以此为起点,尝试寻找可以满足另一侧边界条件的解.上面已经提及,这一方法常常需要精确的调节,具体说来,就是用于试探的某一边界上的导数值的极细微的差别,都有可能导致求解的失败.(这也就是所谓的“对初值极度敏感”,我个人猜想这应该和方程的非线性性质有关,没准还能和混沌什么的扯上关系……算了,毕竟相关知识不足,这里就不妄加揣度了.)

你的这一方程就极为敏感,原因很可能在于你方程右端的非齐次项的变化过于激烈,你在此没有给出你的方程的物理背景,我也只能认出那个万有引用常量,不过,我猜,这应该是源于某种假设吧?那么,这里以一个更弱的假设为例展示一下你的方程应该怎么修改:

G = B = 1;(* G和B的极端取值使这个方程的求解变难了,这里全改成1 *)
sol = NDSolve[{m[r] m'[r]^(2/3) (2 r m''[r] - m'[r]) == 4 B/(3 G) r^(1/3)(* 注意我把指数改小了 *),m[2] == 2,m[1] == 1},m[r],{r,1,2}, Method -> {"Shooting", "StartingInitialConditions" -> {m[2] == 2,m'[2] == 1}}]
Plot[m[r] /.sol,{r,1,2}]


你可以试着修改方程右端的那个r的指数,会发现随着它的增大,整个方程的求解也变得越来越难了,最后终于失败在半途.这个问题的解决方法,前面已经说了,在于初值的精细调节(毕竟我这里的初值是随便给的).这个工作就我的经验来说是非常艰巨的.对于我这个不了解方程物理背景的人来说那就更困难了.想要比较有效率的求解方程,个人认为最好是从模型层面做一些修改.(比如用别的方法去表示你的非齐次项之类的.)行了,我在这个问题上耗的时间也够多了,就答到这儿.你也可以去我上面所给的那个站(百度知道不允许我直接贴网址,但是我想你应该知道我指的是哪个)碰碰运气.