Plot2d 切入 3D 函数

Plot2d cut in 3D function

我有 3D 高斯及其导数(拉普拉斯算子)

f1(x,y,z):=exp(-w1*((x-x1)^2+y^2+z^2));
f2(x,y,z):=exp(-w2*(x^2+y^2+z^2));
dx2_f2(x,y,z):=diff(f2(x,y,z),x,2);
Lf2(x,y,z):=diff(f2(x,y,z),x,2) + diff(f2(x,y,z),y,2) + diff(f2(x,y,z),z,2);

现在我想沿着 x 绘制剖面图,针对某些参数值

切割固定 y,z 的函数
w1:1.2;w2:0.5;x1:1.5;
plot2d( Lf2(x,0,0) ,[x,-5,5]);

我收到以下错误

diff: second argument must be a variable; found 0
#0: Lf2(x=x,y=0,z=0)
 -- an error. To debug this try: debugmode(true);

虽然 plot2d( [f1(x,0,0),f2(x,0,0),dx2_f2(x,0,0)] ,[x,-5,5]); 工作正常。

同样的错误是如果我尝试手动部分替换变量 Lf2x(x):=Lf2(x,0,0);

我的猜测,问题是 Maxima/lisp 做了一些 惰性计算 ,因此导数沿 y,z当我用 y=0,z=0 替换它们时尚未计算。因此它拒绝沿常量 (?) 求导。

但是我不知道怎么解(即求导后才代入常量)

这是一个使用您建议的引用的解决方案。主要思想是说 foo(x) := ''(diff(something, x)) 而不是 foo(x) := diff(something, x).

(%i2) f1(x, y, z) := exp(-w1*((x - x1)^2 + y^2 + z^2));
                                           2    2    2
(%o2)   f1(x, y, z) := exp((- w1) ((x - x1)  + y  + z ))
(%i3) f2(x, y, z) := exp(-w2*(x^2 + y^2 + z^2));
                                        2    2    2
(%o3)       f2(x, y, z) := exp((- w2) (x  + y  + z ))
(%i4) dx2_f2(x, y, z) := ''(diff(f2(x, y, z), x, 2));
                                           2    2    2
                             2  2   - w2 (z  + y  + x )
(%o4) dx2_f2(x, y, z) := 4 w2  x  %e
                                                     2    2    2
                                              - w2 (z  + y  + x )
                                     - 2 w2 %e
(%i5) Lf2(x, y, z) := ''(diff(f2(x, y, z), x, 2) + diff(f2(x, y, z), y, 2) + diff(f2(x, y, z), z, 2));
                                        2    2    2
                          2  2   - w2 (z  + y  + x )
(%o5) Lf2(x, y, z) := 4 w2  z  %e
                     2    2    2
       2  2   - w2 (z  + y  + x )
 + 4 w2  y  %e
                     2    2    2                  2    2    2
       2  2   - w2 (z  + y  + x )          - w2 (z  + y  + x )
 + 4 w2  x  %e                    - 6 w2 %e
(%i6) w1: 1.2;
(%o6)                          1.2
(%i7) w2: 0.5;
(%o7)                          0.5
(%i8) x1: 1.5;
(%o8)                          1.5
(%i9) plot2d( Lf2(x, 0, 0) ,[x, -5, 5]);
(%i10) plot2d( [f1(x, 0, 0), f2(x, 0, 0), dx2_f2(x, 0, 0)], [x, -5, 5]);

根据这些定义,我发现最后的图可以很好地绘制没有错误的图。请注意,函数定义 %o4 和 %o5 在右侧有实际导数,而不是 diff 表达式。您可以使用 define 获得与我最初建议的相同的效果。