我有三维高斯和它们的导数(拉普拉斯算子)。
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);
我猜,问题是Maximalisp做了一些 懒汉评价因此,导数沿 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
正如我最初的建议。