1

当我尝试求解偏微分方程时遇到了这个问题。这是我的代码:

dd = NDSolve[{D[tes[t, x], t] ==D[tes[t, x], x, x] + Exp[-1/(tes[t, x])],
   tes[t, 0] == 1, tes[t, -1] == 1, tes[0, x] == 1}, {tes[t, x]}, {t, 0, 5}, {x, -1, 0}]

f[t_, x_] = tes[t, x] /. dd
kkk = FunctionInterpolation[Integrate[Exp[-1.1/( Evaluate[f[t, x]])], {x, -1, 0}], {t, 0, 0.05}]
kkg[t_] = Integrate[Exp[-1.1/( Evaluate[f[t, x]])], {x, -1, 0}]
Plot[Evaluate[kkk[t]] - Evaluate[kkg[t]], {t, 0, 0.05}]
N[kkg[0.01] - kkk[0.01], 1]

奇怪的是,图中显示的偏差达到了5*10^-7大约t=0.01,而只有-3.88578*10^-16在计算时才N[kkg[0.01] - kkk[0.01], 1],我想知道这个错误是怎么来的。

顺便说一句,我觉得奇怪的是输出N[kkg[0.01] - kkk[0.01], 1]有这么多小数位,我把精度设置为1,对吧?

4

1 回答 1

1

使用Mathematica 7,我得到的图没有显示 0.01 的峰值:

Plot[kkk[t] - kkg[t], {t, 0, 0.05}, GridLines -> Automatic]

数学图形

大约有一个峰值0.00754

kkk[0.00754] - kkg[0.00754] // N
{6.50604*10^-7}

关于N,它不会像精确或任意精度那样改变机器精度数的精度:

N[{1.23456789, Pi, 1.23456789`50}, 2]

Precision /@ %
{1.23457, 3.1, 1.2}

{MachinePrecision, 2., 2.}

查看SetPrecision是否要强制(伪造)精度,以及NumberForm是否要以特定格式打印数字。

于 2012-07-26T08:35:36.577 回答