要绘制的表达式(或过程)必须计算为数值浮点数。因此,对于您的表达式g
,在生成任何图时,名称can
必须具有特定的数值g
。
但是您可以为 的各种值生成一系列 3D 图can
并显示它们。您可以一次全部显示它们,覆盖。或者,您可以以动画序列显示它们。can
您可以对它们进行不同的着色或着色,以提供一个不断变化且不同的视觉提示。
restart;
f := {g = x+can*x*y, t = x+x*y};
eval(g,f);
N:=50:
Pseq := seq(
plot3d(eval(g,f),
x=0..10,y=0..10,
color=RGB(0.5,0.5,can/(2*N)),
transparency=0.5*(can/(N+1))),
can=1 .. N):
plots:-display(Pseq, axes=box);
plots:-display([Pseq],insequence=true,axes=box);
顺便说一句,您不必g
仅仅为了使用g
出现在里面的等式而分配给f
。进行该分配(assign
例如,像您所做的那样使用 )会使您随后根据纯名称创建其他方程式变得更加尴尬,g
除非您首先unassign
使用 name g
。g
有些人发现根本不为此类任务分配任务更容易,而是eval
像我上面所做的那样简单地使用。
现在谈谈你更深层次的问题。您创建一个包含本地假定名称的表达式。然后稍后您想使用相同的表达式,但使用该名称的全局、未假定版本。您可以创建表达式,其中包含全局的、未假定的名称而不是本地的假定名称,购买执行替换。
restart;
assume(can, real);
f := {g = x+can*x*y, t = x+x*y};
{g = x + can~ x y, t = x + x y}
assign(f[1]);
g;
x + can~ x y
can := 2:
g;
x + can~ x y
# This fails, because g contains the local name can~
plot3d(g, x=0..100, y=0..100);
# A procedure to make the desired substitution
revert:=proc(nm::name)
local len, snm;
snm:=convert(nm,string);
len:=length(snm);
if snm[-1]="~" then
return parse(snm[1..-2]);
else return parse(nm);
end if;
end proc:
# This is the version of the expression, but with global name can
subsindets(g,`local`,revert);
x + can x y
# This should work
plot3d(subsindets(g,`local`,revert),
x=0..100,y=0..100);