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
获得与我最初建议的相同的效果。
我有 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
获得与我最初建议的相同的效果。