想到了一个要多费点功夫但是稳定的做法。会想到这个是因为想起来指数函数在数值计算的时候常引发大误差,那么,换元:
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写进去了。
至于这个方法是否可以推广……我就不清楚了。